From 8a4e9f5fcbb9c0d201c1c8eeace37808dd6adbb8 Mon Sep 17 00:00:00 2001 From: axibayuit Date: Tue, 30 Dec 2025 15:39:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Discord=20=E6=B8=A0=E9=81=93=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20Nitro=20=E4=BC=9A=E5=91=98=E5=BC=80=E5=85=B3?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=2025MB=20=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/275.8c46d2f3.css.gz | Bin 9812 -> 0 bytes css/{275.8c46d2f3.css => 357.1ca52a5a.css} | 2 +- css/357.1ca52a5a.css.gz | Bin 0 -> 9812 bytes functions/upload/index.js | 8 +++++--- index.html | 2 +- js/275.392f87b8.js.gz | Bin 82227 -> 0 bytes js/275.392f87b8.js.map | 1 - js/275.392f87b8.js.map.gz | Bin 298720 -> 0 bytes js/{275.392f87b8.js => 357.c54040b4.js} | 10 +++++----- js/357.c54040b4.js.gz | Bin 0 -> 82344 bytes js/357.c54040b4.js.map | 1 + js/357.c54040b4.js.map.gz | Bin 0 -> 298891 bytes js/{app.8353468e.js => app.6d1ac7b7.js} | 4 ++-- js/{app.8353468e.js.gz => app.6d1ac7b7.js.gz} | Bin 4858 -> 4856 bytes ...pp.8353468e.js.map => app.6d1ac7b7.js.map} | 2 +- js/app.6d1ac7b7.js.map.gz | Bin 0 -> 15203 bytes js/app.8353468e.js.map.gz | Bin 15198 -> 0 bytes 17 files changed, 16 insertions(+), 14 deletions(-) delete mode 100644 css/275.8c46d2f3.css.gz rename css/{275.8c46d2f3.css => 357.1ca52a5a.css} (96%) create mode 100644 css/357.1ca52a5a.css.gz delete mode 100644 js/275.392f87b8.js.gz delete mode 100644 js/275.392f87b8.js.map delete mode 100644 js/275.392f87b8.js.map.gz rename js/{275.392f87b8.js => 357.c54040b4.js} (52%) create mode 100644 js/357.c54040b4.js.gz create mode 100644 js/357.c54040b4.js.map create mode 100644 js/357.c54040b4.js.map.gz rename js/{app.8353468e.js => app.6d1ac7b7.js} (58%) rename js/{app.8353468e.js.gz => app.6d1ac7b7.js.gz} (55%) rename js/{app.8353468e.js.map => app.6d1ac7b7.js.map} (99%) create mode 100644 js/app.6d1ac7b7.js.map.gz delete mode 100644 js/app.8353468e.js.map.gz diff --git a/css/275.8c46d2f3.css.gz b/css/275.8c46d2f3.css.gz deleted file mode 100644 index fe53f5fb5f6a0db77a1e0e5fd994873e701451ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9812 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.el-tooltip[data-v-54756a6a],.action-buttons>.restore-section[data-v-54756a6a],.restore-section[data-v-54756a6a]{flex:1;width:100%}.action-btn[data-v-54756a6a]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-54756a6a]{position:relative;background:var(--admin-dashborad-stats-bg-color);border-radius:16px;box-shadow:var(--admin-dashboard-stats-shadow);border:1px solid hsla(0,0%,100%,.2);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.file-info-card[data-v-54756a6a]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.card-bg-wrapper[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}.card-bg-media[data-v-54756a6a]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .5s ease}.file-info-card:hover .card-bg-media[data-v-54756a6a]{transform:scale(1.05)}.card-bg-fallback[data-v-54756a6a],.card-bg-placeholder[data-v-54756a6a]{width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-54756a6a]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.info-card-overlay[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(180deg,rgba(0,0,0,.05) 0,rgba(0,0,0,.1) 60%,rgba(0,0,0,.3));z-index:1;display:flex;flex-direction:column;justify-content:space-between;padding:12px 16px}.info-card-header[data-v-54756a6a]{display:flex;justify-content:flex-start}.header-badge[data-v-54756a6a]{display:flex;align-items:center;gap:6px;padding:6px 12px;background:rgba(var(--admin-purple-rgb,106,27,154),.9);color:#fff;border-radius:20px;font-size:12px;font-weight:600;backdrop-filter:blur(4px);box-shadow:0 2px 8px rgba(0,0,0,.2)}.header-badge.warning[data-v-54756a6a]{background:rgba(255,152,0,.9)}.info-card-content[data-v-54756a6a]{display:flex;align-items:flex-end;gap:15px;width:100%;padding-bottom:20px}.info-details[data-v-54756a6a]{flex:1;min-width:0}.file-name[data-v-54756a6a]{font-size:16px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.file-meta[data-v-54756a6a]{font-size:13px;color:#fff}@media (max-width:768px){.status-panel[data-v-54756a6a]{padding:15px}.charts-section[data-v-54756a6a],.file-info-section[data-v-54756a6a],.overview-cards[data-v-54756a6a]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-54756a6a]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-54756a6a]{font-size:24px}.action-buttons[data-v-54756a6a]{flex-direction:column;gap:12px}.action-btn[data-v-54756a6a]{width:100%;min-width:unset}}.stats-fill[data-v-54756a6a]{animation:fillAnimation-54756a6a 1s ease-out}@keyframes fillAnimation-54756a6a{0%{width:0}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.el-input-number{display:inline-flex;line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-radio{display:inline-flex}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.upload-settings[data-v-1385d456]{padding:20px;min-height:500px}.upload-channel[data-v-1385d456]{margin-bottom:40px}.first-title[data-v-1385d456]{display:flex;align-items:center;gap:8px;margin-bottom:16px}.upload-channel[data-v-1385d456] .el-radio-group{display:flex;gap:12px;flex-wrap:wrap}.upload-channel[data-v-1385d456] .el-radio{display:flex;align-items:center;padding:10px 20px;border-radius:10px;background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter);transition:all .25s ease;margin-right:0;height:auto}.upload-channel[data-v-1385d456] .el-radio:hover{border-color:var(--el-color-primary-light-5);background:var(--el-fill-color)}.upload-channel[data-v-1385d456] .el-radio.is-checked{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.1));border-color:var(--el-color-primary);box-shadow:0 2px 8px rgba(64,158,255,.2)}.upload-channel[data-v-1385d456] .el-radio__input{display:none}.upload-channel[data-v-1385d456] .el-radio__label{padding-left:0;font-weight:500;font-size:14px}.second-title[data-v-1385d456]{text-align:start;margin-left:0;margin-bottom:20px;padding-bottom:10px;border-bottom:1px solid var(--el-border-color-lighter)}.channel-settings[data-v-1385d456]{margin-top:20px}.channel-form[data-v-1385d456]{margin-bottom:30px;padding:20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.channel-form[data-v-1385d456] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.channel-form[data-v-1385d456] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary)}.channel-form[data-v-1385d456] .el-form-item__content{width:100%;max-width:400px}.channel-form[data-v-1385d456] .el-input{width:100%}.channel-form[data-v-1385d456] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-1385d456]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-1385d456] .el-button{border-radius:8px;padding:10px 20px}.quota-status[data-v-1385d456]{width:100%;max-width:400px}.quota-status[data-v-1385d456] .el-progress{margin-bottom:8px}.quota-status[data-v-1385d456] .el-progress-bar__inner{transition:width .5s ease}.quota-info[data-v-1385d456]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border-radius:6px}.quota-info.quota-warning[data-v-1385d456]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.discord-limit-tip[data-v-1385d456]{font-size:13px;color:var(--el-color-info);padding:10px 14px;background:var(--el-color-info-light-9);border-radius:6px;border-left:3px solid var(--el-color-info);white-space:nowrap}@media (max-width:768px){.upload-settings[data-v-1385d456]{padding:15px}.upload-channel[data-v-1385d456] .el-radio-group{gap:8px}.upload-channel[data-v-1385d456] .el-radio{padding:8px 14px;font-size:13px}.channel-form[data-v-1385d456]{padding:15px}.channel-form[data-v-1385d456] .el-form-item__content,.quota-status[data-v-1385d456]{max-width:100%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-checkbox-group{font-size:0;line-height:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-bg-color);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0,0,0,.15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0,0,0,.15);--el-table-index:var(--el-index-normal);background-color:var(--el-table-bg-color);box-sizing:border-box;color:var(--el-table-text-color);font-size:var(--el-font-size-base);height:fit-content;max-width:100%;overflow:hidden;position:relative;width:100%}.el-table__inner-wrapper{display:flex;flex-direction:column;height:100%;position:relative}.el-table__inner-wrapper:before{bottom:0;height:1px;left:0}.el-table tbody:focus-visible{outline:none}.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell,.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell{border-bottom-color:transparent}.el-table__empty-block{align-items:center;display:flex;justify-content:center;left:0;min-height:60px;position:sticky;text-align:center;width:100%}.el-table__empty-text{color:var(--el-text-color-secondary);line-height:60px;width:50%}.el-table__expand-column .cell{padding:0;text-align:center;-webkit-user-select:none;user-select:none}.el-table__expand-icon{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:12px;height:23px;line-height:12px;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out;width:min(23px,100%)}.el-table__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;min-width:0;padding:8px 0;position:relative;text-align:left;text-overflow:ellipsis;vertical-align:middle;z-index:var(--el-table-index)}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;padding:0;width:15px}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;line-height:23px;overflow:hidden;overflow-wrap:break-word;padding:0 12px;text-overflow:ellipsis;white-space:normal}.el-table .cell.el-tooltip{min-width:50px;white-space:nowrap}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{background:#ff4d51;border-radius:50%;content:"";display:inline-block;height:8px;margin-right:5px;vertical-align:middle;width:8px}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{background-color:var(--el-table-border-color);content:"";position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table--border .el-table__inner-wrapper:after{height:1px;left:0;top:0;width:100%;z-index:calc(var(--el-table-index) + 2)}.el-table--border:before{height:100%;left:0;top:-1px;width:1px}.el-table--border:after{height:100%;right:0;top:-1px;width:1px}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background:inherit;position:sticky!important;z-index:calc(var(--el-table-index) + 1)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{bottom:-1px;box-shadow:none;content:"";overflow-x:hidden;overflow-y:hidden;pointer-events:none;position:absolute;top:0;touch-action:none;width:10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{background:#fff;position:sticky!important;right:0;z-index:calc(var(--el-table-index) + 1)}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{border-collapse:separate;table-layout:fixed}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{align-items:center;display:inline-flex;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;overflow:hidden;position:relative}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{align-items:center;appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-flex;flex-direction:column;height:14px;margin:0;outline:none;overflow:initial;padding:0;position:relative;transition:transform var(--el-transition-duration-fast) ease-in-out;vertical-align:middle;width:24px}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .sort-caret{border:5px solid transparent;height:0;left:7px;position:absolute;width:0}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{position:absolute;visibility:hidden;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{position:sticky;top:0;z-index:calc(var(--el-table-index) + 2)}.el-table.el-table--scrollable-y .el-table__body-footer{bottom:0;position:sticky;z-index:calc(var(--el-table-index) + 2)}.el-table__column-resize-proxy{border-left:var(--el-table-border);bottom:0;left:200px;position:absolute;top:0;width:0;z-index:calc(var(--el-table-index) + 9)}.el-table__column-filter-trigger{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-block;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{height:100%;top:0;width:1px}.el-table__border-bottom-patch,.el-table__border-left-patch{background-color:var(--el-table-border-color);left:0;position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table__border-bottom-patch{height:1px}.el-table__border-right-patch{background-color:var(--el-table-border-color);height:100%;position:absolute;top:0;width:1px;z-index:calc(var(--el-table-index) + 2)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;text-align:center;width:20px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{background-color:#fff;border:1px solid var(--el-border-color-lighter);border-radius:2px;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{list-style:none;margin:0;min-width:100px;outline:none;padding:5px 0}.el-table-filter__list-item{cursor:pointer;font-size:var(--el-font-size-base);line-height:36px;outline:none;padding:0 10px}.el-table-filter__list-item:focus,.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);margin:0;outline:none;padding:0 3px;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{align-items:center;display:flex;height:unset;margin-bottom:12px;margin-left:5px;margin-right:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.security-settings[data-v-3b7344a0]{padding:20px;min-height:500px}.first-settings[data-v-3b7344a0]{margin-bottom:40px}.first-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-3b7344a0] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-3b7344a0] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-3b7344a0] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-3b7344a0] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-3b7344a0] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-3b7344a0] .el-input,.first-settings[data-v-3b7344a0] .el-select{width:100%}.first-settings[data-v-3b7344a0] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-3b7344a0]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-3b7344a0] .el-button{border-radius:8px;padding:10px 20px}.token-title[data-v-3b7344a0]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-3b7344a0]{margin-left:5px}.token-table-container[data-v-3b7344a0]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-3b7344a0]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.token-table[data-v-3b7344a0] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-3b7344a0] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-3b7344a0] .el-table{border-radius:12px}.token-table[data-v-3b7344a0] .el-table__header{background-color:#f8f9fa}.token-table[data-v-3b7344a0] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-3b7344a0] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-3b7344a0] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-3b7344a0]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px}.action-buttons[data-v-3b7344a0]{gap:8px}.action-button[data-v-3b7344a0]{margin-left:0}.permission-tag[data-v-3b7344a0]{margin:2px!important}.token-display[data-v-3b7344a0]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-3b7344a0]{padding:15px}.first-settings[data-v-3b7344a0] .el-form{padding:12px 15px}.first-settings[data-v-3b7344a0] .el-form-item__content{max-width:100%}.token-table-container[data-v-3b7344a0]{padding:0 10px}.table-cell-content[data-v-3b7344a0]{padding:6px 2px;min-height:36px}.token-display[data-v-3b7344a0]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-3b7344a0]{padding:0 5px}.table-cell-content[data-v-3b7344a0]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-3b7344a0]{padding:4px 8px;font-size:12px}.permission-tag[data-v-3b7344a0]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-3b7344a0]{padding:10px 0}.token-result .el-form-item[data-v-3b7344a0]{margin-bottom:20px}.dialog-footer[data-v-3b7344a0]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-3b7344a0],.fade-slide-leave-active[data-v-3b7344a0]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-3b7344a0],.fade-slide-leave-to[data-v-3b7344a0]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-3b7344a0],.fade-slide-leave-from[data-v-3b7344a0]{opacity:1;transform:translateY(0)}[data-v-3b7344a0] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);backdrop-filter:blur(10px);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-7b059a1c]{padding:20px;min-height:500px}.first-settings[data-v-7b059a1c]{margin-bottom:40px}.first-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-7b059a1c] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-7b059a1c] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-7b059a1c] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-7b059a1c] .el-input,.first-settings[data-v-7b059a1c] .el-select{width:100%}.first-settings[data-v-7b059a1c] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-7b059a1c]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-7b059a1c] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.page-settings[data-v-7b059a1c]{padding:15px}.first-settings[data-v-7b059a1c] .el-form{padding:12px 15px}.first-settings[data-v-7b059a1c] .el-form-item__content{max-width:100%}}.others-settings[data-v-03514366]{padding:20px;min-height:500px}.first-settings[data-v-03514366]{margin-bottom:40px}.first-title[data-v-03514366]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-03514366]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-03514366] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-03514366] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-03514366] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-03514366] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-03514366] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-03514366] .el-input{width:100%}.first-settings[data-v-03514366] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-03514366]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-03514366] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.others-settings[data-v-03514366]{padding:15px}.first-settings[data-v-03514366] .el-form{padding:12px 15px}.first-settings[data-v-03514366] .el-form-item__content{max-width:100%}}.container[data-v-c5d2c9c2]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0}.header-content[data-v-c5d2c9c2]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-top:1px solid hsla(0,0%,100%,.5);box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:all .4s cubic-bezier(.4,0,.2,1);border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-c5d2c9c2]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);border-top:1px solid hsla(0,0%,100%,.12);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}@media (max-width:768px){.header-content[data-v-c5d2c9c2]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-c5d2c9c2]{font-size:.95em}}.header-content[data-v-c5d2c9c2]:hover{background:hsla(0,0%,100%,.82);box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5);transform:translateX(-50%) translateY(-1px)}html.dark .header-content[data-v-c5d2c9c2]:hover{background:rgba(35,35,35,.85);box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.header-icon[data-v-c5d2c9c2]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-c5d2c9c2]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-c5d2c9c2]{display:flex;gap:10px}.main-container[data-v-c5d2c9c2]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-c5d2c9c2]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-c5d2c9c2],.main-container[data-v-c5d2c9c2]{width:calc(100% - 80px);margin-left:70px;padding:0 10px}} \ No newline at end of file +.sidebar-container[data-v-2bd8175a]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;width:150px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-radius:16px;box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:width .3s ease,box-shadow .3s ease;overflow:hidden}.sidebar-container.is-collapsed[data-v-2bd8175a]{width:56px}html.dark .sidebar-container[data-v-2bd8175a]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}.sidebar-container[data-v-2bd8175a]:hover{box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5)}html.dark .sidebar-container[data-v-2bd8175a]:hover{box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.menu-list[data-v-2bd8175a]{padding:8px}.menu-item[data-v-2bd8175a]{display:flex;align-items:center;padding:12px;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease,padding .25s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.sidebar-container.is-collapsed .menu-item[data-v-2bd8175a]{padding:12px 0}.menu-item[data-v-2bd8175a]:hover{background:rgba(0,0,0,.06)}html.dark .menu-item[data-v-2bd8175a]:hover{background:hsla(0,0%,100%,.1)}.menu-item.is-active[data-v-2bd8175a]{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.25));color:#409eff}html.dark .menu-item.is-active[data-v-2bd8175a]{background:linear-gradient(135deg,rgba(64,158,255,.2),rgba(56,189,248,.35))}.menu-icon[data-v-2bd8175a]{width:32px;min-width:32px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-2bd8175a]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;max-width:100px;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-2bd8175a]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-2bd8175a]{padding:12px;text-align:center;cursor:pointer;border-top:1px solid rgba(0,0,0,.08);transition:all .2s ease;color:var(--admin-container-color,#333)}html.dark .toggle-button[data-v-2bd8175a]{border-top:1px solid hsla(0,0%,100%,.08)}.toggle-button[data-v-2bd8175a]:hover{background:rgba(0,0,0,.04)}html.dark .toggle-button[data-v-2bd8175a]:hover{background:hsla(0,0%,100%,.06)}@media (max-width:768px){.sidebar-container[data-v-2bd8175a]{left:4px;width:140px}.sidebar-container.is-collapsed[data-v-2bd8175a]{width:50px}}.status-panel[data-v-54756a6a]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease;border:1px solid hsla(0,0%,100%,.2);cursor:pointer}.overview-card[data-v-54756a6a]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow);background:var(--admin-dashborad-stats-hover-bg-color)}.card-icon[data-v-54756a6a]{width:60px;height:60px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px;margin-right:20px;background:linear-gradient(135deg,var(--admin-purple),#e1bee7);color:#fff}.card-content[data-v-54756a6a]{flex:1}.card-title[data-v-54756a6a]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-54756a6a]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-54756a6a]{font-size:11px;color:#999;margin-top:4px;opacity:.8}.charts-section[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:20px;margin-bottom:30px}.chart-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease;border:1px solid hsla(0,0%,100%,.2)}.chart-card[data-v-54756a6a]:hover{box-shadow:var(--admin-dashboard-stats-hover-shadow)}.chart-card[data-v-54756a6a],.chart-content[data-v-54756a6a],.pie-chart-container[data-v-54756a6a],.pie-chart-wrapper[data-v-54756a6a]{overflow:visible}.chart-header[data-v-54756a6a]{display:flex;gap:8px;align-items:center;margin-bottom:20px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.chart-header .fa-icon[data-v-54756a6a]{margin-right:10px;color:var(--admin-purple)}.chart-content[data-v-54756a6a]{min-height:160px;padding:10px;margin:-10px}.empty-state[data-v-54756a6a]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#999;font-size:14px}.empty-state .fa-icon[data-v-54756a6a]{font-size:32px;margin-bottom:10px}.stats-list[data-v-54756a6a]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-54756a6a]{display:flex;align-items:center;gap:12px}.stats-label[data-v-54756a6a]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-54756a6a]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-54756a6a]{height:100%;background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:4px;transition:width .6s ease}.type-fill[data-v-54756a6a]{background:linear-gradient(90deg,#4caf50,#81c784)}.stats-value[data-v-54756a6a]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-54756a6a]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-54756a6a]{position:relative;width:160px;height:160px;flex-shrink:0;padding:10px;margin:-10px;overflow:visible}.chart-center-text[data-v-54756a6a]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none}.center-value[data-v-54756a6a]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-54756a6a]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-54756a6a]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-54756a6a]{display:flex;align-items:center;gap:10px;padding:8px 12px;background:rgba(0,0,0,.03);border-radius:8px;transition:all .2s ease}.legend-item[data-v-54756a6a]:hover{background:rgba(0,0,0,.06);transform:translateX(4px)}html.dark .legend-item[data-v-54756a6a]{background:hsla(0,0%,100%,.05)}html.dark .legend-item[data-v-54756a6a]:hover{background:hsla(0,0%,100%,.1)}.legend-color[data-v-54756a6a]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-54756a6a]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-54756a6a]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-54756a6a]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-54756a6a]{margin-bottom:30px}.action-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;box-shadow:var(--admin-dashboard-stats-shadow);border:1px solid hsla(0,0%,100%,.2)}.action-header[data-v-54756a6a]{display:flex;align-items:center;gap:8px;margin-bottom:3px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.action-header .fa-icon[data-v-54756a6a]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-54756a6a]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-54756a6a]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-54756a6a]{border:none;border-radius:12px;padding:12px 24px;margin-left:0;font-weight:600;transition:all .3s ease;min-width:140px;width:140px;height:48px}@media (max-width:768px){.action-btn[data-v-54756a6a]{flex:1;width:auto;min-width:0;height:auto}}.action-btn[data-v-54756a6a]:hover{transform:translateY(-2px)}.action-btn .fa-icon[data-v-54756a6a]{margin-right:8px}.rebuild-btn[data-v-54756a6a]{background:linear-gradient(135deg,var(--admin-purple),#e1bee7)}.rebuild-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(179,157,219,.4)}.backup-btn[data-v-54756a6a]{background:linear-gradient(135deg,#4caf50,#81c784)}.backup-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(76,175,80,.4)}.restore-btn[data-v-54756a6a]{background:linear-gradient(135deg,#ff9800,#ffb74d)}.restore-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(255,152,0,.4)}.restore-section[data-v-54756a6a]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-54756a6a],.action-buttons>.restore-section[data-v-54756a6a],.restore-section[data-v-54756a6a]{flex:1;width:100%}.action-btn[data-v-54756a6a]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-54756a6a]{position:relative;background:var(--admin-dashborad-stats-bg-color);border-radius:16px;box-shadow:var(--admin-dashboard-stats-shadow);border:1px solid hsla(0,0%,100%,.2);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.file-info-card[data-v-54756a6a]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.card-bg-wrapper[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}.card-bg-media[data-v-54756a6a]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .5s ease}.file-info-card:hover .card-bg-media[data-v-54756a6a]{transform:scale(1.05)}.card-bg-fallback[data-v-54756a6a],.card-bg-placeholder[data-v-54756a6a]{width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-54756a6a]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.info-card-overlay[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(180deg,rgba(0,0,0,.05) 0,rgba(0,0,0,.1) 60%,rgba(0,0,0,.3));z-index:1;display:flex;flex-direction:column;justify-content:space-between;padding:12px 16px}.info-card-header[data-v-54756a6a]{display:flex;justify-content:flex-start}.header-badge[data-v-54756a6a]{display:flex;align-items:center;gap:6px;padding:6px 12px;background:rgba(var(--admin-purple-rgb,106,27,154),.9);color:#fff;border-radius:20px;font-size:12px;font-weight:600;backdrop-filter:blur(4px);box-shadow:0 2px 8px rgba(0,0,0,.2)}.header-badge.warning[data-v-54756a6a]{background:rgba(255,152,0,.9)}.info-card-content[data-v-54756a6a]{display:flex;align-items:flex-end;gap:15px;width:100%;padding-bottom:20px}.info-details[data-v-54756a6a]{flex:1;min-width:0}.file-name[data-v-54756a6a]{font-size:16px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.file-meta[data-v-54756a6a]{font-size:13px;color:#fff}@media (max-width:768px){.status-panel[data-v-54756a6a]{padding:15px}.charts-section[data-v-54756a6a],.file-info-section[data-v-54756a6a],.overview-cards[data-v-54756a6a]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-54756a6a]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-54756a6a]{font-size:24px}.action-buttons[data-v-54756a6a]{flex-direction:column;gap:12px}.action-btn[data-v-54756a6a]{width:100%;min-width:unset}}.stats-fill[data-v-54756a6a]{animation:fillAnimation-54756a6a 1s ease-out}@keyframes fillAnimation-54756a6a{0%{width:0}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.el-input-number{display:inline-flex;line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-radio{display:inline-flex}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.upload-settings[data-v-f5e0f39c]{padding:20px;min-height:500px}.upload-channel[data-v-f5e0f39c]{margin-bottom:40px}.first-title[data-v-f5e0f39c]{display:flex;align-items:center;gap:8px;margin-bottom:16px}.upload-channel[data-v-f5e0f39c] .el-radio-group{display:flex;gap:12px;flex-wrap:wrap}.upload-channel[data-v-f5e0f39c] .el-radio{display:flex;align-items:center;padding:10px 20px;border-radius:10px;background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter);transition:all .25s ease;margin-right:0;height:auto}.upload-channel[data-v-f5e0f39c] .el-radio:hover{border-color:var(--el-color-primary-light-5);background:var(--el-fill-color)}.upload-channel[data-v-f5e0f39c] .el-radio.is-checked{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.1));border-color:var(--el-color-primary);box-shadow:0 2px 8px rgba(64,158,255,.2)}.upload-channel[data-v-f5e0f39c] .el-radio__input{display:none}.upload-channel[data-v-f5e0f39c] .el-radio__label{padding-left:0;font-weight:500;font-size:14px}.second-title[data-v-f5e0f39c]{text-align:start;margin-left:0;margin-bottom:20px;padding-bottom:10px;border-bottom:1px solid var(--el-border-color-lighter)}.channel-settings[data-v-f5e0f39c]{margin-top:20px}.channel-form[data-v-f5e0f39c]{margin-bottom:30px;padding:20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.channel-form[data-v-f5e0f39c] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.channel-form[data-v-f5e0f39c] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary)}.channel-form[data-v-f5e0f39c] .el-form-item__content{width:100%;max-width:400px}.channel-form[data-v-f5e0f39c] .el-input{width:100%}.channel-form[data-v-f5e0f39c] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-f5e0f39c]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-f5e0f39c] .el-button{border-radius:8px;padding:10px 20px}.quota-status[data-v-f5e0f39c]{width:100%;max-width:400px}.quota-status[data-v-f5e0f39c] .el-progress{margin-bottom:8px}.quota-status[data-v-f5e0f39c] .el-progress-bar__inner{transition:width .5s ease}.quota-info[data-v-f5e0f39c]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border-radius:6px}.quota-info.quota-warning[data-v-f5e0f39c]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.discord-limit-tip[data-v-f5e0f39c]{font-size:13px;color:var(--el-color-info);padding:10px 14px;background:var(--el-color-info-light-9);border-radius:6px;border-left:3px solid var(--el-color-info);white-space:nowrap}@media (max-width:768px){.upload-settings[data-v-f5e0f39c]{padding:15px}.upload-channel[data-v-f5e0f39c] .el-radio-group{gap:8px}.upload-channel[data-v-f5e0f39c] .el-radio{padding:8px 14px;font-size:13px}.channel-form[data-v-f5e0f39c]{padding:15px}.channel-form[data-v-f5e0f39c] .el-form-item__content,.quota-status[data-v-f5e0f39c]{max-width:100%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-checkbox-group{font-size:0;line-height:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-bg-color);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0,0,0,.15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0,0,0,.15);--el-table-index:var(--el-index-normal);background-color:var(--el-table-bg-color);box-sizing:border-box;color:var(--el-table-text-color);font-size:var(--el-font-size-base);height:fit-content;max-width:100%;overflow:hidden;position:relative;width:100%}.el-table__inner-wrapper{display:flex;flex-direction:column;height:100%;position:relative}.el-table__inner-wrapper:before{bottom:0;height:1px;left:0}.el-table tbody:focus-visible{outline:none}.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell,.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell{border-bottom-color:transparent}.el-table__empty-block{align-items:center;display:flex;justify-content:center;left:0;min-height:60px;position:sticky;text-align:center;width:100%}.el-table__empty-text{color:var(--el-text-color-secondary);line-height:60px;width:50%}.el-table__expand-column .cell{padding:0;text-align:center;-webkit-user-select:none;user-select:none}.el-table__expand-icon{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:12px;height:23px;line-height:12px;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out;width:min(23px,100%)}.el-table__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;min-width:0;padding:8px 0;position:relative;text-align:left;text-overflow:ellipsis;vertical-align:middle;z-index:var(--el-table-index)}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;padding:0;width:15px}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;line-height:23px;overflow:hidden;overflow-wrap:break-word;padding:0 12px;text-overflow:ellipsis;white-space:normal}.el-table .cell.el-tooltip{min-width:50px;white-space:nowrap}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{background:#ff4d51;border-radius:50%;content:"";display:inline-block;height:8px;margin-right:5px;vertical-align:middle;width:8px}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{background-color:var(--el-table-border-color);content:"";position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table--border .el-table__inner-wrapper:after{height:1px;left:0;top:0;width:100%;z-index:calc(var(--el-table-index) + 2)}.el-table--border:before{height:100%;left:0;top:-1px;width:1px}.el-table--border:after{height:100%;right:0;top:-1px;width:1px}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background:inherit;position:sticky!important;z-index:calc(var(--el-table-index) + 1)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{bottom:-1px;box-shadow:none;content:"";overflow-x:hidden;overflow-y:hidden;pointer-events:none;position:absolute;top:0;touch-action:none;width:10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{background:#fff;position:sticky!important;right:0;z-index:calc(var(--el-table-index) + 1)}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{border-collapse:separate;table-layout:fixed}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{align-items:center;display:inline-flex;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;overflow:hidden;position:relative}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{align-items:center;appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-flex;flex-direction:column;height:14px;margin:0;outline:none;overflow:initial;padding:0;position:relative;transition:transform var(--el-transition-duration-fast) ease-in-out;vertical-align:middle;width:24px}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .sort-caret{border:5px solid transparent;height:0;left:7px;position:absolute;width:0}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{position:absolute;visibility:hidden;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{position:sticky;top:0;z-index:calc(var(--el-table-index) + 2)}.el-table.el-table--scrollable-y .el-table__body-footer{bottom:0;position:sticky;z-index:calc(var(--el-table-index) + 2)}.el-table__column-resize-proxy{border-left:var(--el-table-border);bottom:0;left:200px;position:absolute;top:0;width:0;z-index:calc(var(--el-table-index) + 9)}.el-table__column-filter-trigger{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-block;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{height:100%;top:0;width:1px}.el-table__border-bottom-patch,.el-table__border-left-patch{background-color:var(--el-table-border-color);left:0;position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table__border-bottom-patch{height:1px}.el-table__border-right-patch{background-color:var(--el-table-border-color);height:100%;position:absolute;top:0;width:1px;z-index:calc(var(--el-table-index) + 2)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;text-align:center;width:20px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{background-color:#fff;border:1px solid var(--el-border-color-lighter);border-radius:2px;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{list-style:none;margin:0;min-width:100px;outline:none;padding:5px 0}.el-table-filter__list-item{cursor:pointer;font-size:var(--el-font-size-base);line-height:36px;outline:none;padding:0 10px}.el-table-filter__list-item:focus,.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);margin:0;outline:none;padding:0 3px;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{align-items:center;display:flex;height:unset;margin-bottom:12px;margin-left:5px;margin-right:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.security-settings[data-v-3b7344a0]{padding:20px;min-height:500px}.first-settings[data-v-3b7344a0]{margin-bottom:40px}.first-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-3b7344a0] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-3b7344a0] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-3b7344a0] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-3b7344a0] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-3b7344a0] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-3b7344a0] .el-input,.first-settings[data-v-3b7344a0] .el-select{width:100%}.first-settings[data-v-3b7344a0] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-3b7344a0]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-3b7344a0] .el-button{border-radius:8px;padding:10px 20px}.token-title[data-v-3b7344a0]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-3b7344a0]{margin-left:5px}.token-table-container[data-v-3b7344a0]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-3b7344a0]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.token-table[data-v-3b7344a0] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-3b7344a0] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-3b7344a0] .el-table{border-radius:12px}.token-table[data-v-3b7344a0] .el-table__header{background-color:#f8f9fa}.token-table[data-v-3b7344a0] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-3b7344a0] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-3b7344a0] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-3b7344a0]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px}.action-buttons[data-v-3b7344a0]{gap:8px}.action-button[data-v-3b7344a0]{margin-left:0}.permission-tag[data-v-3b7344a0]{margin:2px!important}.token-display[data-v-3b7344a0]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-3b7344a0]{padding:15px}.first-settings[data-v-3b7344a0] .el-form{padding:12px 15px}.first-settings[data-v-3b7344a0] .el-form-item__content{max-width:100%}.token-table-container[data-v-3b7344a0]{padding:0 10px}.table-cell-content[data-v-3b7344a0]{padding:6px 2px;min-height:36px}.token-display[data-v-3b7344a0]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-3b7344a0]{padding:0 5px}.table-cell-content[data-v-3b7344a0]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-3b7344a0]{padding:4px 8px;font-size:12px}.permission-tag[data-v-3b7344a0]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-3b7344a0]{padding:10px 0}.token-result .el-form-item[data-v-3b7344a0]{margin-bottom:20px}.dialog-footer[data-v-3b7344a0]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-3b7344a0],.fade-slide-leave-active[data-v-3b7344a0]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-3b7344a0],.fade-slide-leave-to[data-v-3b7344a0]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-3b7344a0],.fade-slide-leave-from[data-v-3b7344a0]{opacity:1;transform:translateY(0)}[data-v-3b7344a0] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);backdrop-filter:blur(10px);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-7b059a1c]{padding:20px;min-height:500px}.first-settings[data-v-7b059a1c]{margin-bottom:40px}.first-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-7b059a1c] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-7b059a1c] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-7b059a1c] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-7b059a1c] .el-input,.first-settings[data-v-7b059a1c] .el-select{width:100%}.first-settings[data-v-7b059a1c] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-7b059a1c]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-7b059a1c] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.page-settings[data-v-7b059a1c]{padding:15px}.first-settings[data-v-7b059a1c] .el-form{padding:12px 15px}.first-settings[data-v-7b059a1c] .el-form-item__content{max-width:100%}}.others-settings[data-v-03514366]{padding:20px;min-height:500px}.first-settings[data-v-03514366]{margin-bottom:40px}.first-title[data-v-03514366]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-03514366]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-03514366] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-03514366] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-03514366] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-03514366] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-03514366] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-03514366] .el-input{width:100%}.first-settings[data-v-03514366] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-03514366]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-03514366] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.others-settings[data-v-03514366]{padding:15px}.first-settings[data-v-03514366] .el-form{padding:12px 15px}.first-settings[data-v-03514366] .el-form-item__content{max-width:100%}}.container[data-v-c5d2c9c2]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0}.header-content[data-v-c5d2c9c2]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-top:1px solid hsla(0,0%,100%,.5);box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:all .4s cubic-bezier(.4,0,.2,1);border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-c5d2c9c2]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);border-top:1px solid hsla(0,0%,100%,.12);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}@media (max-width:768px){.header-content[data-v-c5d2c9c2]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-c5d2c9c2]{font-size:.95em}}.header-content[data-v-c5d2c9c2]:hover{background:hsla(0,0%,100%,.82);box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5);transform:translateX(-50%) translateY(-1px)}html.dark .header-content[data-v-c5d2c9c2]:hover{background:rgba(35,35,35,.85);box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.header-icon[data-v-c5d2c9c2]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-c5d2c9c2]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-c5d2c9c2]{display:flex;gap:10px}.main-container[data-v-c5d2c9c2]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-c5d2c9c2]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-c5d2c9c2],.main-container[data-v-c5d2c9c2]{width:calc(100% - 80px);margin-left:70px;padding:0 10px}} \ No newline at end of file diff --git a/css/357.1ca52a5a.css.gz b/css/357.1ca52a5a.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..c8c50877a172689726aaef119a1587bb422f54c7 GIT binary patch literal 9812 zcmV-aCac*WiwFP!000023e`Q^j_WvbzoP8H0a`nfA=y^9+r|zO&pUc^Df>s^^lh}=>A^hLmt1z z^KG$8pR)Y7OHuZ1m4B@F6?osk|HMVvf!$Cx^?KJ-=Tp6Do4!PU@5^^kY=)*?XUX?X z1@^;w)xK|rF0cE2)1B7nQ00499hvCGGoWo9})c zy5?LL>tkQ#4@s1KkJ2Rh9?hQSA^N%Knl|2-)d0HnwmNqY^Q3(bgFYY5T|R(^bOlF< z-@x`qImG@wwoO-nZk@L8LEltm5y%KEXq&jpi}KvB(?^JL^B(udylCFmNw93+gGJK5 z2i;+d`bJ4KOT#D$AlQZULz0D2S@&QF@b8H-O7TdG{ljc`yvOa%hf=B*OpB zo-z;OCachclnWCn=PpVnS$OrB#`*{;co8sJweP`FS=2d1W!}CAkMgRnT)1T6G}?M2 zwKUky;gqHl}EBHSGEcAZS!UV)8NJSl?2Mpe50(hj5i_9(E^ z6fiOuq#=g}oJqbL%2#0B>{VHVyo(QTjX*s-q>HQohX`T#xQxGj43&^XGOSnJxO+7%~1y~^< zW!WFQvi`A7HUoGcVzd#+79fMb@6|y#P)iE=4eydHNj7iCasYAP<~y*io3}1+Wscl5 zZN4jqk9E2^HV*4VPC0QS_4&(OlWN`gtC@KkuN}@$0CEJt7fFdw7 zheHM8?Rgk<%OVIAh1jyRAo2v7Dx)frgg1|2UR4YgUs1txumgE5I$F_e2jmbC%LzES zg#?s0|9S#NnFkN!!ahB&+V}9{V<{j55wbVoPN>FiHdJ8W>#QI0;oQec~|r*RI2I@U0H14f8qh0T4?3Q z*g)>r9cV#5Jmlx0iTC9Yoyz)@zdy`ZN&6n9`!2+K1>tqdyF*#W+h!P=(|UnuBA}pR zz)gkc$|CQN+osEl7?P!rw+GCgTJx3B1}=z8dvg|uI$++>0dW&`BT*yOX$;OoY2&&` zLAX}$am?HI&=++ChfTnfz_=45^K}Ms6x7JLW|(aslhOP^pQV+Vdo0F3&izpCKhTB& z^+3NKRR~&A!d4v`O5Oklg~`vgJ$G#d!sr`Fw*WjbZN1;`$vnyU>Qo`(>y)$_%Ao?9 zHlo5Kz#ktUrTwr{wIKognpbBl;JMuQDM{S2JlsIyFp)q8>(5*FMAC60&(F_vB2dV~ zDN?OCTU}?nW8T62g8k}yikM~MDPj-`f0TUr1o7BL z(2v?y(8OysZ7$60doBBNTLFsK5#)ugy&y~=L%>a;5h@~!Ag+vJSwnV~rDgms*vJpfMa@PSqvI4GwNg!v0+0V7UEh+;#QT*7KpJ8oD02>-e5*6lMz?Au@!djH4T>Tl zawzXiN{AAECF;L#`vm?Y$t@(M6-OTpu`eqP;-lU8-KJfi6Q^=j5mCc`kIXarXn_GE zCl=q9yL_J|(YIB)ds;0+IzfXr9hU}0X*oX&ZB}`$Zjli_qS1@fkfuTG45jB9dCB_i zc=eIAEXv)1Du*Em>bCGU9R5S}{EY%f&~3M;8)C zP#D*zD~CSl z25Xp)%fS;60ux6jdk-gOp7^SI9no2E{QEfcprH$40H_^xaT?(qhmW}+y__gZX7Xw| zZG-j}|CyeY!Q(e`?A102BE4`27%kw&ODKH!{nbhgXP}Mm?aOQEP_YBsb6FLJCHPd# z$_`w2x(d%vQ+9}&K0QZi_7u(2XL!bXok4WY?X9S)wzmbI8@s2+D1FMJRf2KrKtD7c zxEZ7^ zSCJdLkcr&r3fsypO2&5oQl8qT8}fP(9EAXiH10R;vH0~m+m{uH%X;5@MeuN;3m)!S!?2bGddflx$PxsK~_gCOXp-coLqKIGY5XpUAgj)1nIjjII!aT7P&e}LTpd279cNN^22j=tk3 z8IH#ii|dThJBH-0@{fD5luiAt5|*nmrpE-lP^;hWmCjk zFuVa!i^d#|e2&!cvhHR0*vB05Zn(}cfOwl12XLE{z&kUKruczs3&q`G8>Pu(G=GZH zY#BzgXZ|El60&mGf39&nw0V_FNr>TOw3U*pCsJbemUneoAFSqzY)m|d{L1*bAv{gd zvVgk4VVP{Sw;`Vr3iHPxWV8Ydd0F*FLx3}?iSVlPlikUG96fBf6ru}=(j?qjKWJC8 zFF{q6ZD01P>j9gwwSfw8F0BoelL+k-7;AqvU;BkVVac)^A?ic>7l{nKQOm|py$wfqruCOJ5Ip_P^jZltV&oDjoYCq@5>++P7 zjPI)YH~JTA5s*BtxH%8kfBgYI_FaAgeV}iBNxom`R=GmMz3rMq2m1b^k$u8G79z+S z#l{qXy}UrCznHaP2M*^dr(wD=6+s+?cj+@B1u(-$i1LU*$z%`mVK%Rz8_Hc?k#O0m zEQ(4*HI8>>x2r%Te#xvqy>Fz05UBW=fNGjvh!Q7f7Rg4V?3JSgdKh6z`sbY_Kcs_l z0@@tKc>;M6{;eF2&3Qn4p`!=|j891Xy2A5Fi3bFsz)pzh-x6R%h$hpu^piA)Oe&3UjQPXOVOE68C$^~)1JqfO&0tC0YYeK~=) zZC9T1?!$@~Qh7wU8FYwF!r>!s?B5uV<26>AX)f!04+%~kgg^ahqm^4c(vxTvBX?*3 z-Knhe0dQ(t_&!+lL0Rw1x`fkJ#rA(cB%yhTe(1^;6#TlBr~CjE$8MR)eq9;{^Xz-X zW#0yg@K+}Jc&Ww@e6m5{GdGD!pUpFH3h@7&vvU0&L(b;t%6|>XifO>8YZ~vr#{G>< ze=QqGei&8C0klH&Y{6Mx%%n=b^DD*JJqeQQ&}e^J;A<&7G?A^6@7Pd?kwzaH{1^Iz z?HgBrNOpJjC_+v<024>lMRrfsWe!qz-=tQ5h*P*D8WHcAt#I1s!(^~)IDq1jyWvS-4-$SB|7Td`JVAGRvXcSsL+)?_i)KU1$F~o zTICDwQWT5HS!jsExfV*2h`CkaJK_H?Yp|}H;Q=y0QTF+^0!66V+fH;Q!V?e25^@8R zO$Lv&Z+7QiFtj4Wbi)8$XjNR%6?vbi_1I5*{2gqEIfRrpr z*+xqO+0?{8#M`_Fq5a2XLn161c{`HiA`WPW7})V)$fI$UsbM9k!G@=IFhQ<3`pE=0 ztt9_*xbbRr>l6&z+H)fMJ#U(anA`@)0jtP z8XsSQtB0+Cwin)!p)+U-_$@RHxo-i%i{n}93^>r1WvY_#VjD?;Bx z%((XJ@;Mr~S!@zfJh*LjBgV4!BnJ5B43;EFs3ngKZp3UTweC|?on}(Ga1_lLWW6&y zN1F=y0G_DRRYH2?H@0XLeIF(;fS{}No6q)m_S(S|G?H|mLskMY30W$_Aur?h@Dt8J zk4L>Vx{UNIVvCMlNEn1Tb>wVn&a^CQLmCC_3+SS111ZAs0`lj~5l9~N_&1)y(6pM1 z7c5!Vr@sN)@$gIi4UH7XlDQ>ak6ZDSf!(En#O8^nEzvEnc~utq0RCgw)apSI>q6~N z1uxgKv%f?6cII530&m2zFJE2|TzX3lA-r|DsWa%hX4JprGPK;Y0Q>x0 z4R@rGy3A}8E0qw>3ogUl8<37p6S}LE()7i~wLqu&z3DVsfhH==<%9D1(i4o1M&6yh zD1-^X0*uNO%z0WHUHnmjJgRFy&@k6X8=X`j^FmW2=8UqD4lkZL^PxY*8B>caNGHiM zEr|EDFWJ@Ws}2Vw;strEZFW&IvhV`vPcc10qB>oMGP9sTgh-%Os_K3TH#R}QQt*-h zSMLgvtAW8?xh(WnnRtoCvTqe!_GmS2_n~R8+D&IWjh2t9^e3(2 zt~G_7X_APH05uf!sUD*R%jfH)`ja5Rv}NO(i(}D^jUM zKui}nH_?zE!~=xS0)gGop}<|Bt?vkG4DQ|l>eEEJAA#;foX-;mAE14PG7^N(kVXQv zz89QZi362<-hrGP(S9DnXNV(#THgzf<`SK9PAJGQ?hNpj{ft!p%L`nYy13)!q<~v^ zuS^S>pCm0vOQ*`^@7#Z8yp#R~)ANi0Oc5&rNM{lt=N;?;C}6sQb^0(E*yut(*YQ_0 z6#D2Lio&f&%iM0Q%LBYgA!_c+F~5)Ngja={mMl)d|41)U>wfb(6vny9nqlcZE^R)? zw#w@tp=n4pdTYYXl8Nc)gf9sivm`Zci8PkHluEvd2Ty2MRatP+*AhdI=-TCZfb5Bb z)T$jnAw5N(qKOba0EsUUEo$F&EM}fP5-1fI(@QaJO z9+N?SpYQIs8)(u1c2?J!pRBxvWk92`VYG%#HiupE3I`6_L1;#bsi>m16Z%Od6my&J zL3PT9lj+3W;-MBJ4SmDwkmjn5Uc8)yh5{KWsgMzuHO(XBwdu=C)0Ky^&Y{(S53o1# zt1G|jB&p@(YJny9UCAh-VS%REL z(tmf%Ypw*s*j=jlfcosqt{=pr`D2IMstMw1CJtl*nSM&mJzNb$O5^c{>i<9#Erz9g z1IqU{ja2u^;ioE{FrZn_32rU(1 z#8;Un%!j&yVytyScPxGcv6(3EEy~AOvv% z5XJheDal=w{jTYXxGGO2w7c4=#KGghDTE^XAmiAK8LDN)@KR{A;gkLss=VZf)r2q2 zRk^&4T727Ps@X_P&?%Ooz(`Bw0T7qEQVNMp7M77?lM4?je!pJVUDFI$(6vo_ZsSu^ z^gfTUm|0et1v;oFY9sb$4wp=@F8RPVW0OyNOn5yQ-S;y zXkazx!53JtZ@M>FO^vVYFyaL3I0R z>O?6=g*xK=gE+=jYc9$&Fer|kSIyx z8pEBs(KJPOb<{TnL`gJF?l>-e1eZQUxyM1q7ZJwp^R@%|kNBqsotcf*FqoT?Tgtf&qv>10I@@0JlT{-B1uE#?n0d%BqO$uB4A);jj zB>gXLM^Z<9y#g^@95yHg5u0sOd`v64DZ^Lvk~qM=X$D}bcgJ5caEepyr5w_j3O{{i zAhA)P%%AH8>wuMcWepon*%s-_Nu zCj*5qsaj5Q=uw<0!T&=qObR94(@X;dNoNsCJP8a=0^q8N6yQCso9>iXLiJ6VuLSaj zo;N)u1`mC5kIC-jZmMp?0FFnAS}8<;@SwFosng+cw!nKe`Wu=$$n;7d)4CK4yIMJR z4F+g%h=~k>k2f}*9dnr40PPI+T^#SLb6F6H77QJijTsCDhaqI!$N{V0bxl>F&mS&W zV&N6SE%Hqe(jGsGjFOC;*J=$#4yj`}p3y%FmqYuZ-2M2_lsDIN0>;QuV4jnoyxMpi z-+0R;s7OYT%^A!PnMQ9%#ci7JDGmbb>0IQJoyzt#`E?WGHq+}_O1Ft=ru{;$&CgfG zHMxk|Br4C?XI$3MS|Dq6D(eS`1A00tG*HyA5$C4(J@ZARjHQ@nw5UVGOqFoekh%uG z7>=KKHsOZu&7x)3WFMkTDQz@Nm2k3=*1qQXOotR^`(OWj zL1L|}pr<5n1){C=>m^hlS!mt}aE8Wlxee3eiRYit5|t6-o`;m5v^U)SAiECVNAkQE z#P?BHS$JS9(XC4H=yKdJRJs~5 zTFMxa<`OU{yu!P;4jqkr}-zMscp80RndowoacK}fkED> z7p1NSP!ClbG$`bUC(YfQ^pM`^|MX4tl4@|xy)XK8`&8HFst&hLWu@9> zMv=ehrk-dKtzC~d4|?<-R3y~2xlZZpGw|^f1N+ZdWPoWip3>K6;NvF-w$GT?+~mAc z4ykcZntRFaG`xL_pqvzRe}=@jRoyrpAP!=F9v&jtT`^=3C!%<~Hw}+>rs47KG(3Ki zhEoNY2adOZydRRjl)MS%WHgWWr{(ePv^;(REkDbbQ`L+ImbZYsACkVbyb0!HG>`YE zmT? z-q(9v>v~V`YaLfQjoDiQIy3@)LtsY=kP1QT>rW8QntEo2xk_Dc6(6n;NR_ueSofgK zyBwOcXpAcVXwC!9rMFPbn3ST<8)BwQz;jGiP4o?&`I%SWa|sLj@rHZ%=idzs3_|*2>@D)JN!>}_eNsd!P;dwPm1f}&=f}89* zUFx$OjvjcG_>mtLO`K;l^A8%5Lfx0C8z4*LBDw-Q-OV%CiGby8g% z4W|wKAro^9_4ONP`dshHL69`TryR^1;MuI%3E=#E>RSNXiEU#i1mD+in$-0^c9UQv ztW);|4Xggc$fKe-+q}C>P8kViySxJfLrSBb|B%Facd={xt&^oOKc3N-+)mZqsU9<<90MlQ#b_W}raxm4`K6;b{cx(#llIv%CC7^gKg;_as3C2& z7hasDol$a8WTc@DYMuILSI=}6Pga(+`iOk_O(^s1tuB2>WrZ8aJsElU z$pgdsUC0XQ0LnLSyXO5v|5&=5U&xm;m?w$xIZB#)>PePo9d`S&g7J)@D-Q=~P5jeM z2b?ec2i%-<65~s>yJ4)L^egUy%qH`r=ZvEnmyxh3pBgNrEz8jwUVCa{(=yy?iQ6Ql z`3_0jT2#3dZB0vk6xj!D?L}$rPK3z?Hza|Bnn~%AbycmaNMvpo$TJ%2L>mSgOZ$jQ z0AFYP^)4Yz&K9D#DttAf6VgLvv4fnpzkx z9lI))c)Bj?fT-{uE;HmgC>;zkkOuPU4DUM{>p`$~v}CljsG62o6>yH4KfiJp4vl~V zQkVH>FH4}|PJGMJWmE<5^6Om#(z z2vi(b^JKuS??O1%hSkCzIsTEoyz+;=@Ss^pf6Tw)*@sDETX)waNMHJd1To)Xu|~d5 z%0vX+FH4B*J#{E_4L|Z~iVbn$TBTRFJG@Y#$hLdEP$8l^<%No&`2p%%MU{*wDufYl z!SDuPS`LQoq5)M_3>V@y)k9v^pmShlDA^^`*Id9&7*-vO>!=DWE}cz2byQw2!lgUJ z;&`Eb@W7nGrQ$*dNc>?6r>9a;?EqKpAf-F}AZoChIzgR-yV^hRb6-HP=8y>nw_GN@ z_zi3U*k>C}=^fwki;DxeKTW#kO{{~bx$%FUkqrZoibcENwmqZS;L-zkQ2ua{3RD1Q zDcW|}Ov8Jg2qMkaXAgY{4ecT#xz1Y9oyxw4J%;>XYQ7eBCZ#r^fZ7SE#C?7$tB>`+ zH|MSdUGSgaEjl%Ig9MtXFeT!VF+Y&6L9p% zQeW1{@`lRkO;HV%tIxh%XDxh|LKb^Z+a!C=)7_1ck+HjHWMu5{Ge<_I zWBC(CM%W~Nj>w2Vntxmv#4z>^VGskPpC=4rMDYG$5OFAL7({I99R`uQ-60I32(o*H zK}1w1gh9;KvZo-oS-Upb;IfpRoFqRlIBSL@=z0ZEvdGfq;_>lD-7|Lg)IDQ|pIP@z z$MPrCJ!}&H@1pW5=6{?zGK_tLIx;}|dDM{+!TYNtaVYgAXrEs9P%(mDBzZk<_)y%xb!A>f zeO^P#bmd;y6f#T-kY-S@u)=jl0_Re!WW?9X55j?lPA!P*EIrzM>?;)O|Bjx0h-Oc7 zgJTI9Bn7Mi@!Jc4RB&Qw9~JaMz;%rG|l2<@Yh80xk{S!dJ26c#jr2X{4f~&haS`P8JaHum1<1GT_|5_y7R!y$AaM literal 0 HcmV?d00001 diff --git a/functions/upload/index.js b/functions/upload/index.js index bdf3719e..dc47592c 100644 --- a/functions/upload/index.js +++ b/functions/upload/index.js @@ -567,10 +567,12 @@ async function uploadFileToDiscord(context, fullId, metadata, returnLink) { const fileSize = file.size; const fileName = metadata.FileName; - // Discord 免费用户限制 10MB,超过则返回错误让其他渠道处理 - const DISCORD_MAX_SIZE = 10 * 1024 * 1024; // 10MB + // Discord 文件大小限制:Nitro 会员 25MB,免费用户 10MB + const isNitro = discordChannel.isNitro || false; + const DISCORD_MAX_SIZE = isNitro ? 25 * 1024 * 1024 : 10 * 1024 * 1024; if (fileSize > DISCORD_MAX_SIZE) { - return createResponse('Error: File size exceeds Discord limit (10MB), please use another channel', { status: 413 }); + const limitMB = isNitro ? 25 : 10; + return createResponse(`Error: File size exceeds Discord limit (${limitMB}MB), please use another channel`, { status: 413 }); } const discordAPI = new DiscordAPI(discordChannel.botToken); diff --git a/index.html b/index.html index b8e7c707..2aefc38d 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Sanyue ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/js/275.392f87b8.js.gz b/js/275.392f87b8.js.gz deleted file mode 100644 index ca94fd33b99f6751a4a7de86bd6f60f42573bca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82227 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 {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(item.title), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 2);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n title: '系统状态'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n title: '上传设置'\n }, {\n index: 'security',\n icon: 'shield',\n title: '安全设置'\n }, {\n index: 'page',\n icon: 'pager',\n title: '网页设置'\n }, {\n index: 'others',\n icon: 'cog',\n title: '其他设置'\n }]\n };\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n }\n },\n mounted() {\n this.checkMobile();\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=2bd8175a&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=2bd8175a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2bd8175a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: \"退出登录\",\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createTextVNode as _createTextVNode, withCtx as _withCtx, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-value\"\n};\nconst _hoisted_6 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_7 = {\n class: \"card-icon\"\n};\nconst _hoisted_8 = {\n class: \"card-content\"\n};\nconst _hoisted_9 = {\n class: \"card-value\"\n};\nconst _hoisted_10 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_11 = {\n class: \"card-icon\"\n};\nconst _hoisted_12 = {\n class: \"card-content\"\n};\nconst _hoisted_13 = {\n class: \"card-value\"\n};\nconst _hoisted_14 = {\n class: \"charts-section\"\n};\nconst _hoisted_15 = {\n class: \"chart-card\"\n};\nconst _hoisted_16 = {\n class: \"chart-header\"\n};\nconst _hoisted_17 = {\n class: \"chart-content\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_20 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_21 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_22 = {\n class: \"center-value\"\n};\nconst _hoisted_23 = {\n class: \"chart-legend\"\n};\nconst _hoisted_24 = {\n class: \"legend-label\"\n};\nconst _hoisted_25 = {\n class: \"legend-value\"\n};\nconst _hoisted_26 = {\n class: \"legend-percent\"\n};\nconst _hoisted_27 = {\n class: \"chart-card\"\n};\nconst _hoisted_28 = {\n class: \"chart-header\"\n};\nconst _hoisted_29 = {\n class: \"chart-content\"\n};\nconst _hoisted_30 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_32 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_33 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_34 = {\n class: \"center-value\"\n};\nconst _hoisted_35 = {\n class: \"chart-legend\"\n};\nconst _hoisted_36 = {\n class: \"legend-label\"\n};\nconst _hoisted_37 = {\n class: \"legend-value\"\n};\nconst _hoisted_38 = {\n class: \"legend-percent\"\n};\nconst _hoisted_39 = {\n class: \"actions-section\"\n};\nconst _hoisted_40 = {\n class: \"action-card\"\n};\nconst _hoisted_41 = {\n class: \"action-header\"\n};\nconst _hoisted_42 = {\n class: \"action-content\"\n};\nconst _hoisted_43 = {\n class: \"action-buttons\"\n};\nconst _hoisted_44 = {\n class: \"restore-section\"\n};\nconst _hoisted_45 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_46 = {\n key: 0,\n class: \"file-info-card info-card-newest\"\n};\nconst _hoisted_47 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_48 = [\"src\"];\nconst _hoisted_49 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_50 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_51 = {\n class: \"info-card-header\"\n};\nconst _hoisted_52 = {\n class: \"header-badge\"\n};\nconst _hoisted_53 = {\n class: \"info-card-content\"\n};\nconst _hoisted_54 = {\n class: \"info-details\"\n};\nconst _hoisted_55 = {\n class: \"file-name\"\n};\nconst _hoisted_56 = {\n class: \"file-meta\"\n};\nconst _hoisted_57 = {\n key: 1,\n class: \"file-info-card info-card-oldest\"\n};\nconst _hoisted_58 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_59 = [\"src\"];\nconst _hoisted_60 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_61 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_62 = {\n class: \"info-card-header\"\n};\nconst _hoisted_63 = {\n class: \"header-badge warning\"\n};\nconst _hoisted_64 = {\n class: \"info-card-content\"\n};\nconst _hoisted_65 = {\n class: \"info-details\"\n};\nconst _hoisted_66 = {\n class: \"file-name\"\n};\nconst _hoisted_67 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_cache[7] || (_cache[7] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"文件总数\", -1)), _createElementVNode(\"div\", _hoisted_5, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[8] || (_cache[8] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击刷新\", -1))])]), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_8, [_cache[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"索引更新时间\", -1)), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_12, [_cache[10] || (_cache[10] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"系统版本\", -1)), _createElementVNode(\"div\", _hoisted_13, \"v\" + _toDisplayString($data.version), 1), _cache[11] || (_cache[11] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击查看更新日志\", -1))])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _cache[12] || (_cache[12] = _createElementVNode(\"span\", null, \"上传渠道分布\", -1))]), _createElementVNode(\"div\", _hoisted_17, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[14] || (_cache[14] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"文件总数\", -1))])]), _createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_24, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_25, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_26, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_27, [_createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"文件状态分布\", -1))]), _createElementVNode(\"div\", _hoisted_29, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _cache[17] || (_cache[17] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"状态类型\", -1))])]), _createElementVNode(\"div\", _hoisted_35, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.typeStats, (count, type, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: type,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_36, _toDisplayString(type || '未知类型'), 1), _createElementVNode(\"span\", _hoisted_37, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_38, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_39, [_createElementVNode(\"div\", _hoisted_40, [_createElementVNode(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"系统维护\", -1))]), _createElementVNode(\"div\", _hoisted_42, [_createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_el_tooltip, {\n content: \"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? '重建中...' : '重建索引'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"备份所有文件元数据和系统设置到JSON文件\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? '备份中...' : '备份数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_44, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[2] || (_cache[2] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? '恢复中...' : '恢复数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n _: 1\n })])])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_46, [_createElementVNode(\"div\", _hoisted_47, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[3] || (_cache[3] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[4] || (_cache[4] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_48)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_49, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_50, [_createElementVNode(\"div\", _hoisted_51, [_createElementVNode(\"div\", _hoisted_52, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _cache[19] || (_cache[19] = _createElementVNode(\"span\", null, \"最近上传\", -1))])]), _createElementVNode(\"div\", _hoisted_53, [_createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_56, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_57, [_createElementVNode(\"div\", _hoisted_58, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[5] || (_cache[5] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_59)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_60, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_61, [_createElementVNode(\"div\", _hoisted_62, [_createElementVNode(\"div\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _cache[20] || (_cache[20] = _createElementVNode(\"span\", null, \"最早上传\", -1))])]), _createElementVNode(\"div\", _hoisted_64, [_createElementVNode(\"div\", _hoisted_65, [_createElementVNode(\"div\", _hoisted_66, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_67, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {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};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../package.json';\nimport { Doughnut } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js';\nChartJS.register(ArcElement, Tooltip, Legend);\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16']\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据\n typeChartData() {\n const stats = this.indexInfo.typeStats || {};\n return {\n labels: Object.keys(stats).map(k => k || '未知类型'),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.typeColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=info', {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error('获取索引信息失败');\n } finally {\n this.loading = false;\n }\n },\n // 重建索引\n async rebuildIndex() {\n this.rebuilding = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=rebuild', {\n method: 'GET'\n });\n if (response.ok) {\n this.$message.success('索引重建已启动,请稍后刷新查看最新状态');\n // 延迟刷新数据\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 3000);\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('重建索引失败:', error);\n this.$message.error('重建索引失败');\n } finally {\n this.rebuilding = false;\n }\n },\n // 备份数据\n async backupData() {\n this.backing = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=backup', {\n method: 'GET'\n });\n if (response.ok) {\n // 创建下载链接\n const blob = await response.blob();\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n this.$message.success('备份文件已下载');\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('备份数据失败:', error);\n this.$message.error('备份数据失败: ' + error.message);\n } finally {\n this.backing = false;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error('请选择JSON格式的备份文件');\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm('恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?', '确认恢复', {\n confirmButtonText: '确定恢复',\n cancelButtonText: '取消',\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据\n async restoreData(file) {\n this.restoring = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=restore', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: await file.text()\n });\n if (response.ok) {\n const result = await response.json();\n this.$message.success(`恢复完成!已恢复 ${result.stats.restoredFiles} 个文件和 ${result.stats.restoredSettings} 个设置项`);\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('恢复数据失败:', error);\n this.$message.error('恢复数据失败: ' + error.message);\n } finally {\n this.restoring = false;\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return '未知';\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return `${days}天前`;\n if (hours > 0) return `${hours}小时前`;\n if (minutes > 0) return `${minutes}分钟前`;\n return '刚刚';\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=54756a6a&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=54756a6a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-54756a6a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"upload-channel\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"channel-settings\"\n};\nconst _hoisted_5 = {\n class: \"second-title\"\n};\nconst _hoisted_6 = {\n key: 0\n};\nconst _hoisted_7 = {\n key: 1\n};\nconst _hoisted_8 = {\n class: \"quota-status\"\n};\nconst _hoisted_9 = {\n key: 2\n};\nconst _hoisted_10 = {\n class: \"quota-status\"\n};\nconst _hoisted_11 = {\n key: 3\n};\nconst _hoisted_12 = {\n class: \"discord-limit-tip\"\n};\nconst _hoisted_13 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[4] || (_cache[4] = _createTextVNode(\"上传渠道 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_radio_group, {\n modelValue: $data.activeChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.activeChannel = $event)\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.channels, channel => {\n return _openBlock(), _createBlock(_component_el_radio, {\n key: channel.value,\n label: channel.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(channel.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"h4\", _hoisted_5, [_createTextVNode(_toDisplayString($options.activeChannelLabel) + \" 设置 \", 1), $data.activeChannel === 'telegram' ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: \"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), $data.activeChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_el_form, {\n model: $data.telegramSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.telegramSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.telegramSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.telegramSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.tgRules,\n ref_for: true,\n ref: \"tgChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.chatId,\n \"onUpdate:modelValue\": $event => channel.chatId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.cfr2Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[5] || (_cache[5] = _createTextVNode(\" 公开访问链接 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"若启用图像审查,请设置该项\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.publicUrl,\n \"onUpdate:modelValue\": $event => channel.publicUrl = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[6] || (_cache[6] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[7] || (_cache[7] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[8] || (_cache[8] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1032, [\"model\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 's3' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createVNode(_component_el_form, {\n model: $data.s3Settings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.s3Settings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.s3Settings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.s3Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n rules: $data.s3Rules,\n ref_for: true,\n ref: \"s3ChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n prop: \"endpoint\"\n }, {\n label: _withCtx(() => [_cache[9] || (_cache[9] = _createTextVNode(\" Endpoint \", -1)), _createVNode(_component_el_tooltip, {\n content: \"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.endpoint,\n \"onUpdate:modelValue\": $event => channel.endpoint = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"路径风格\",\n prop: \"pathStyle\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.pathStyle,\n \"onUpdate:modelValue\": $event => channel.pathStyle = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.bucketName,\n \"onUpdate:modelValue\": $event => channel.bucketName = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.region,\n \"onUpdate:modelValue\": $event => channel.region = $event,\n placeholder: \"默认填写 auto 即可\",\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.accessKeyId,\n \"onUpdate:modelValue\": $event => channel.accessKeyId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.secretAccessKey,\n \"onUpdate:modelValue\": $event => channel.secretAccessKey = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[10] || (_cache[10] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[11] || (_cache[11] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[12] || (_cache[12] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'discord' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_el_form, {\n model: $data.discordSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.discordSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.discordSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.discordSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.discordRules,\n ref_for: true,\n ref: \"discordChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.channelId,\n \"onUpdate:modelValue\": $event => channel.channelId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[13] || (_cache[13] = _createTextVNode(\" 代理域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.proxyUrl,\n \"onUpdate:modelValue\": $event => channel.proxyUrl = $event,\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_12, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[14] || (_cache[14] = _createTextVNode(\" Discord 免费用户单文件限制 10MB,超过将自动切换其他渠道 \", -1))])]),\n _: 1\n }), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.addChannel\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[15] || (_cache[15] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n // 一级设置:上传渠道\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlareR2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }],\n activeChannel: 'telegram',\n // 当前选中的上传渠道\n\n // 二级设置:Telegram 配置\n telegramSettings: {\n loadBalance: {},\n channels: []\n },\n tgRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.telegramSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Telegram_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.telegramSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: '请输入 Chat ID',\n trigger: 'blur'\n }]\n },\n // 二级设置:CFR2 配置\n cfr2Settings: {\n channels: []\n },\n // 二级设置:S3 配置\n s3Settings: {\n loadBalance: {},\n channels: []\n },\n // 二级设置:Discord 配置\n discordSettings: {\n loadBalance: {},\n channels: []\n },\n discordRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.discordSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Discord_env') {\n const savePath = this.discordSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: '请输入 Channel ID',\n trigger: 'blur'\n }]\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n s3Rules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.s3Settings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'S3_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.s3Settings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: '请输入 Endpoint',\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: '请输入存储桶名称',\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: '请输入存储桶区域',\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: '请输入访问密钥 ID',\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: '请输入机密访问密钥',\n trigger: 'blur'\n }]\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 当前选中渠道的标签\n activeChannelLabel() {\n const channel = this.channels.find(item => item.value === this.activeChannel);\n return channel ? channel.label : '';\n }\n },\n methods: {\n addChannel() {\n switch (this.activeChannel) {\n case 'telegram':\n this.telegramSettings.channels.push({\n id: this.telegramSettings.channels.length + 1,\n name: '',\n type: 'telegram',\n savePath: 'database',\n botToken: '',\n chatId: '',\n enabled: true,\n fixed: false\n });\n break;\n case 'cfr2':\n // this.cfr2Settings.channels.push({\n // id: this.cfr2Settings.channels.length + 1,\n // name: '',\n // type: 'cfr2',\n // savePath: 'database',\n // enabled: true,\n // fixed: false\n // });\n this.$message.error('R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加');\n break;\n case 's3':\n this.s3Settings.channels.push({\n id: this.s3Settings.channels.length + 1,\n name: '',\n type: 's3',\n savePath: 'database',\n accessKeyId: '',\n secretAccessKey: '',\n region: '',\n bucketName: '',\n endpoint: '',\n pathStyle: false,\n enabled: true,\n fixed: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n });\n break;\n case 'discord':\n this.discordSettings.channels.push({\n id: this.discordSettings.channels.length + 1,\n name: '',\n type: 'discord',\n savePath: 'database',\n botToken: '',\n channelId: '',\n proxyUrl: '',\n enabled: true,\n fixed: false\n });\n break;\n }\n },\n deleteChannel(index) {\n switch (this.activeChannel) {\n case 'telegram':\n // 调整 id\n this.telegramSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.telegramSettings.channels.splice(index, 1);\n break;\n case 'cfr2':\n // 调整 id\n this.cfr2Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.cfr2Settings.channels.splice(index, 1);\n break;\n case 's3':\n // 调整 id\n this.s3Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.s3Settings.channels.splice(index, 1);\n break;\n case 'discord':\n // 调整 id\n this.discordSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.discordSettings.channels.splice(index, 1);\n break;\n }\n },\n saveSettings() {\n // 所有表单的 Promise 数组\n let validationPromises = [];\n\n // Telegram\n if (this.$refs.tgChannelForm) {\n this.$refs.tgChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // S3\n if (this.$refs.s3ChannelForm) {\n this.$refs.s3ChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // Discord\n if (this.$refs.discordChannelForm) {\n this.$refs.discordChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n });\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm('首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?', '初始化容量统计', {\n confirmButtonText: '立即统计',\n cancelButtonText: '稍后手动统计',\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info('您可以稍后点击刷新按钮手动统计');\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info('正在统计容量,请稍候...');\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success('容量统计完成');\n } else {\n this.$message.error('统计失败: ' + (data.error || '未知错误'));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error('统计失败');\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=1385d456&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=1385d456&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1385d456\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_4 = {\n class: \"token-actions\"\n};\nconst _hoisted_5 = {\n class: \"token-table-container\"\n};\nconst _hoisted_6 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_7 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_8 = {\n class: \"token-display\"\n};\nconst _hoisted_9 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_10 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_12 = {\n class: \"first-settings\"\n};\nconst _hoisted_13 = {\n class: \"second-title\"\n};\nconst _hoisted_14 = {\n class: \"first-settings\"\n};\nconst _hoisted_15 = {\n class: \"actions\"\n};\nconst _hoisted_16 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_17 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_18 = {\n class: \"token-result\"\n};\nconst _hoisted_19 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_20 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_cache[26] || (_cache[26] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"认证管理\", -1)), _cache[27] || (_cache[27] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"用户端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $data.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"上传密码\",\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _cache[28] || (_cache[28] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"管理端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $data.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"用户名\",\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\",\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_3, [_cache[23] || (_cache[23] = _createTextVNode(\"API Token 管理 \", -1)), _createElementVNode(\"a\", _hoisted_4, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_5, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: \"名称\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_6, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: \"Token\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: \"权限\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: \"创建时间\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n label: \"操作\",\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\"编辑\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [...(_cache[25] || (_cache[25] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_12, [_cache[30] || (_cache[30] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"上传管理\", -1)), _createElementVNode(\"h4\", _hoisted_13, [_cache[29] || (_cache[29] = _createTextVNode(\"图像审查 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"开启审查\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: \"请选择审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: \"API 路径\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_14, [_cache[33] || (_cache[33] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"访问管理\", -1)), _cache[34] || (_cache[34] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"域名过滤\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[31] || (_cache[31] = _createTextVNode(\" 放行域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _cache[35] || (_cache[35] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"白名单模式\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[32] || (_cache[32] = _createTextVNode(\" 是否开启 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[36] || (_cache[36] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.showCreateTokenDialog = $event),\n title: \"创建新 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_16, [_createVNode(_component_el_button, {\n onClick: _cache[14] || (_cache[14] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[40] || (_cache[40] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [...(_cache[41] || (_cache[41] = [_createTextVNode(\"创建\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $data.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newToken.name = $event),\n placeholder: \"请输入Token名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[37] || (_cache[37] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[38] || (_cache[38] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[39] || (_cache[39] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showEditTokenDialog = $event),\n title: \"编辑 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_17, [_createVNode(_component_el_button, {\n onClick: _cache[18] || (_cache[18] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[45] || (_cache[45] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [...(_cache[46] || (_cache[46] = [_createTextVNode(\"更新\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $data.tokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[42] || (_cache[42] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[43] || (_cache[43] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[44] || (_cache[44] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showTokenResultDialog = $event),\n title: \"Token 创建成功\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[21] || (_cache[21] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[49] || (_cache[49] = [_createTextVNode(\"我已保存\", -1)]))]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"p\", _hoisted_19, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[47] || (_cache[47] = _createTextVNode(\" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! \", -1))]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"完整Token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [...(_cache[48] || (_cache[48] = [_createTextVNode(\"复制\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {}\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: false,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n newToken: {\n name: '',\n owner: '',\n permissions: []\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: []\n },\n createdToken: {\n name: '',\n token: ''\n },\n userPassRules: {\n authCode: [{\n validator: (rule, value, callback) => {\n // URL保留字符列表\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error('密码不能包含部分URL保留字符: % & ? # /'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n message: '请再次输入上传密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.user.authCode) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n adminPassRules: {\n confirmNewAdminPassword: [{\n message: '请再次输入管理密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.admin.adminPassword) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n tokenRules: {\n name: [{\n required: true,\n message: '请输入Token名称',\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: '请选择权限',\n trigger: 'change'\n }]\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n },\n methods: {\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': '上传',\n 'delete': '删除',\n 'list': '列出'\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error('获取Token列表失败');\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.newToken)\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: []\n };\n await this.loadApiTokens();\n this.$message.success('Token创建成功');\n } else {\n this.$message.error(data.error || 'Token创建失败');\n }\n } catch (error) {\n this.$message.error('Token创建失败');\n }\n });\n },\n editToken(token) {\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions]\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success('Token权限更新成功');\n } else {\n this.$message.error(data.error || 'Token更新失败');\n }\n } catch (error) {\n this.$message.error('Token更新失败');\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm('此操作将永久删除该Token,是否继续?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success('Token删除成功');\n } else {\n this.$message.error(data.error || 'Token删除失败');\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error('Token删除失败');\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success('Token已复制到剪贴板');\n } catch (error) {\n this.$message.error('复制失败,请手动复制');\n }\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n // 更新原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = data.upload;\n this.accessSettings = data.access;\n\n // 保存原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=3b7344a0&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=3b7344a0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3b7344a0\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(setting.label) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: setting.tooltip,\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder,\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: option.label,\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[0] || (_cache[0] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = setting.category || '其他设置';\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=7b059a1c&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=7b059a1c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7b059a1c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[9] || (_cache[9] = _createTextVNode(\"远端遥测 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"便于问题查找和定位,建议开启\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_cache[10] || (_cache[10] = _createTextVNode(\"随机图像API \", -1)), _createVNode(_component_el_tooltip, {\n content: \"API具体用法请查阅文档\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[11] || (_cache[11] = _createElementVNode(\"span\", null, \"目录\", -1)), _createVNode(_component_el_tooltip, {\n content: \"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_cache[12] || (_cache[12] = _createTextVNode(\"CloudFlare API Token \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"区域ID\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"账户邮箱\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_cache[13] || (_cache[13] = _createTextVNode(\"WebDAV \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,可以通过WebDAV协议访问和管理图片\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"用户名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[14] || (_cache[14] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {}\n },\n // 加载状态\n loading: false\n };\n },\n computed: {},\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=03514366&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=03514366&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-03514366\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/SysCogStatus.vue';\nimport SysCogUpload from '@/components/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/SysCogSecurity.vue';\nimport SysCogPage from '@/components/SysCogPage.vue';\nimport SysCogOthers from '@/components/SysCogOthers.vue';\nexport default {\n name: 'SystemConfig',\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n this.$store.commit('setCredentials', null);\n this.$router.push('/adminLogin');\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=c5d2c9c2&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=c5d2c9c2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c5d2c9c2\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","title","args","toggleCollapse","name","props","type","String","default","Boolean","data","methods","this","$emit","checkMobile","isMobile","window","innerWidth","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_component_Doughnut","_component_el_button","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","Object","keys","channelStats","length","channelChartData","options","chartOptions","count","channel","style","background","getChartColor","getPercentage","typeStats","typeChartData","getTypeChartColor","loading","rebuilding","rebuildIndex","backing","backupData","ref","accept","onChange","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","_typeof","o","Symbol","iterator","constructor","prototype","toPrimitive","t","r","e","i","call","TypeError","Number","toPropertyKey","_defineProperty","defineProperty","value","enumerable","configurable","writable","round","v","lim","l","h","Math","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","f","hex","h1","h2","eq","isShort","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","hueValue","rgb2hsl","range","calln","Array","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","from","interpolate","rgb1","rgb2","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","toString","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","size","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","width","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","match","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","add","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","el","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","date","callbacks","numSteps","initial","currentStep","_refresh","_update","Date","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","remove","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","contains","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","amount","refRect","BarElement","addRectPath","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","_args","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","unshift","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","watch","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","components","newest","oldest","channelColors","typeColors","computed","stats","percentage","toFixed","response","fetchWithAuth","json","$message","success","errorData","blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","message","$refs","fileInput","file","files","$confirm","confirmButtonText","cancelButtonText","restoreData","headers","restoredFiles","restoredSettings","minutes","hours","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_el_radio","_component_el_radio_group","_component_el_switch","_component_el_form_item","_component_el_form","_component_el_input","_component_el_input_number","_component_el_progress","modelValue","activeChannel","channels","activeChannelLabel","model","telegramSettings","loadBalance","rules","tgRules","ref_for","fixed","botToken","autocomplete","chatId","deleteChannel","cfr2Settings","publicUrl","quota","onQuotaEnabledChange","limitGB","threshold","link","refreshQuota","quotaLoading","getQuotaPercentage","status","getQuotaStatus","getQuotaText","isQuotaExceeded","getQuotaStatusText","s3Settings","s3Rules","endpoint","pathStyle","bucketName","region","placeholder","accessKeyId","secretAccessKey","discordSettings","discordRules","channelId","proxyUrl","addChannel","saveSettings","validator","rule","savePath","quotaStats","validationPromises","tgChannelForm","form","validate","s3ChannelForm","discordChannelForm","results","isValid","every","settings","telegram","cfr2","s3","discord","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","catch","finally","_component_el_table_column","_component_el_tag","_component_el_table","_component_el_option","_component_el_select","_component_el_checkbox","_component_el_checkbox_group","_component_el_dialog","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","adminPassword","handleAdminPassInput","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","circle","apiTokens","token","permissions","perm","getPermissionText","formatDate","createdAt","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","dialogWidth","createToken","newToken","tokenRules","showEditTokenDialog","updateToken","editingToken","showTokenResultDialog","createdToken","readonly","append","copyToken","oriUserPassword","oriAdminPassword","owner","urlReservedChars","hasReservedChar","char","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","editTokenForm","tokenId","navigator","clipboard","writeText","userPassForm","adminPassForm","auth","upload","access","groupedSettings","categoryGroup","categoryName","setting","category","telemetry","randomImageAPI","allowedDir","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","webDAV","username","password","immediate","newHash","scrollTo","newIndex","hash","$router","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","$store","commit","setDefaultHash","defaultHash","location"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/275.392f87b8.js.map.gz b/js/275.392f87b8.js.map.gz deleted file mode 100644 index 9004c00a4b3d730219f62e6d1cec924b5f4f8b0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298720 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

13csVq}%fry18+S4TrB>Jy`<>@cpR}m0V0ck? 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�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 diff --git a/js/275.392f87b8.js b/js/357.c54040b4.js similarity index 52% rename from js/275.392f87b8.js rename to js/357.c54040b4.js index 11b01709..afcba4f1 100644 --- a/js/275.392f87b8.js +++ b/js/357.c54040b4.js @@ -1,23 +1,23 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[275],{333:function(t,e,i){i(5331),i(6711)},2893:function(t,e,i){i(5331)},4396:function(t,e,i){i(5331),i(4885)},4752:function(t,e,i){i(5331),i(8736),i(8785)},4885:function(t,e,i){i(5331)},5616:function(t,e,i){i(5331),i(7197)},5802:function(t,e,i){i(5331),i(8736),i(213),i(5970)},9275:function(t,e,i){i.r(e),i.d(e,{default:function(){return nu}});var s=i(6768),n=i(4232);const a={class:"menu-list"},o=["onClick"],r={class:"menu-text"};function l(t,e,i,l,h,c){const d=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":i.isCollapse}])},[(0,s.Lk)("div",a,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(h.menuItems,t=>((0,s.uX)(),(0,s.CE)("div",{key:t.index,class:(0,n.C4)(["menu-item",{"is-active":i.activeIndex===t.index}]),onClick:e=>c.handleSelect(t.index)},[(0,s.bF)(d,{icon:t.icon,class:"menu-icon"},null,8,["icon"]),(0,s.Lk)("span",r,(0,n.v_)(t.title),1)],10,o))),128))]),(0,s.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,s.bF)(d,{icon:i.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],2)}var h={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{menuItems:[{index:"status",icon:"chart-bar",title:"系统状态"},{index:"upload",icon:"cloud-upload",title:"上传设置"},{index:"security",icon:"shield",title:"安全设置"},{index:"page",icon:"pager",title:"网页设置"},{index:"others",icon:"cog",title:"其他设置"}]}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)}},mounted(){this.checkMobile(),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=i(1241);const d=(0,c.A)(h,[["render",l],["__scopeId","data-v-2bd8175a"]]);var u=d,g=i(4880),f=(i(5331),i(7128),i(8507)),p=(i(213),i(6011));const m={class:"container"},b={class:"header-content"},x={class:"header-action"};function y(t,e,i,a,o,r){const l=p.A,h=(0,s.g2)("font-awesome-icon"),c=f.R7,d=g.bZ,y=u;return(0,s.uX)(),(0,s.CE)("div",m,[(0,s.bF)(d,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",b,[(0,s.bF)(l,{activeTab:"systemConfig"}),(0,s.Lk)("div",x,[(0,s.bF)(c,{disabled:r.disableTooltip,content:"退出登录",placement:"bottom"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{icon:"sign-out-alt",class:"header-icon",onClick:r.handleLogout},null,8,["onClick"])]),_:1},8,["disabled"])])])]),_:1}),(0,s.bF)(y,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,s.uX)(),(0,s.Wv)((0,s.$y)(r.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}i(4114);var _=i(9114),v=(i(694),i(7009)),k=(i(8450),i(47));i(9648);const w={class:"status-panel"},S={class:"overview-cards"},M={class:"card-icon"},C={class:"card-content"},F={class:"card-value"},P={class:"overview-card index-status"},T={class:"card-icon"},A={class:"card-content"},L={class:"card-value"},D={class:"card-subtitle"},I={class:"card-icon"},V={class:"card-content"},E={class:"card-value"},O={class:"charts-section"},R={class:"chart-card"},W={class:"chart-header"},z={class:"chart-content"},B={key:0,class:"empty-state"},N={key:1,class:"pie-chart-container"},j={class:"pie-chart-wrapper"},U={class:"chart-center-text"},$={class:"center-value"},H={class:"chart-legend"},q={class:"legend-label"},X={class:"legend-value"},Y={class:"legend-percent"},K={class:"chart-card"},Q={class:"chart-header"},G={class:"chart-content"},J={key:0,class:"empty-state"},Z={key:1,class:"pie-chart-container"},tt={class:"pie-chart-wrapper"},et={class:"chart-center-text"},it={class:"center-value"},st={class:"chart-legend"},nt={class:"legend-label"},at={class:"legend-value"},ot={class:"legend-percent"},rt={class:"actions-section"},lt={class:"action-card"},ht={class:"action-header"},ct={class:"action-content"},dt={class:"action-buttons"},ut={class:"restore-section"},gt={key:0,class:"file-info-section"},ft={key:0,class:"file-info-card info-card-newest"},pt={class:"card-bg-wrapper"},mt=["src"],bt={key:2,class:"card-bg-fallback"},xt={class:"info-card-overlay"},yt={class:"info-card-header"},_t={class:"header-badge"},vt={class:"info-card-content"},kt={class:"info-details"},wt={class:"file-name"},St={class:"file-meta"},Mt={key:1,class:"file-info-card info-card-oldest"},Ct={class:"card-bg-wrapper"},Ft=["src"],Pt={key:2,class:"card-bg-fallback"},Tt={class:"info-card-overlay"},At={class:"info-card-header"},Lt={class:"header-badge warning"},Dt={class:"info-card-content"},It={class:"info-details"},Vt={class:"file-name"},Et={class:"file-meta"};function Ot(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=(0,s.g2)("Doughnut"),c=k.S2,d=f.R7,u=v.Zq,g=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",w,[(0,s.Lk)("div",S,[(0,s.Lk)("div",{class:"overview-card total-files",onClick:e[0]||(e[0]=(...t)=>r.fetchIndexInfo&&r.fetchIndexInfo(...t))},[(0,s.Lk)("div",M,[(0,s.bF)(l,{icon:"database"})]),(0,s.Lk)("div",C,[e[7]||(e[7]=(0,s.Lk)("div",{class:"card-title"},"文件总数",-1)),(0,s.Lk)("div",F,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[8]||(e[8]=(0,s.Lk)("div",{class:"card-subtitle"},"点击刷新",-1))])]),(0,s.Lk)("div",P,[(0,s.Lk)("div",T,[(0,s.bF)(l,{icon:"clock"})]),(0,s.Lk)("div",A,[e[9]||(e[9]=(0,s.Lk)("div",{class:"card-title"},"索引更新时间",-1)),(0,s.Lk)("div",L,(0,n.v_)(r.formatTime(o.indexInfo.lastUpdated)),1),(0,s.Lk)("div",D,(0,n.v_)(r.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,s.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>r.openReleases&&r.openReleases(...t))},[(0,s.Lk)("div",I,[(0,s.bF)(l,{icon:"code-branch"})]),(0,s.Lk)("div",V,[e[10]||(e[10]=(0,s.Lk)("div",{class:"card-title"},"系统版本",-1)),(0,s.Lk)("div",E,"v"+(0,n.v_)(o.version),1),e[11]||(e[11]=(0,s.Lk)("div",{class:"card-subtitle"},"点击查看更新日志",-1))])])]),(0,s.Lk)("div",O,[(0,s.Lk)("div",R,[(0,s.Lk)("div",W,[(0,s.bF)(l,{icon:"share-alt"}),e[12]||(e[12]=(0,s.Lk)("span",null,"上传渠道分布",-1))]),(0,s.Lk)("div",z,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,s.uX)(),(0,s.CE)("div",B,[(0,s.bF)(l,{icon:"inbox"}),e[13]||(e[13]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",N,[(0,s.Lk)("div",j,[(0,s.bF)(h,{data:r.channelChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",U,[(0,s.Lk)("div",$,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[14]||(e[14]=(0,s.Lk)("div",{class:"center-label"},"文件总数",-1))])]),(0,s.Lk)("div",H,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.indexInfo.channelStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getChartColor(i)})},null,4),(0,s.Lk)("span",q,(0,n.v_)(e),1),(0,s.Lk)("span",X,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",Y,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,s.Lk)("div",K,[(0,s.Lk)("div",Q,[(0,s.bF)(l,{icon:"file-alt"}),e[15]||(e[15]=(0,s.Lk)("span",null,"文件状态分布",-1))]),(0,s.Lk)("div",G,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,s.uX)(),(0,s.CE)("div",J,[(0,s.bF)(l,{icon:"inbox"}),e[16]||(e[16]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",Z,[(0,s.Lk)("div",tt,[(0,s.bF)(h,{data:r.typeChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",et,[(0,s.Lk)("div",it,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),e[17]||(e[17]=(0,s.Lk)("div",{class:"center-label"},"状态类型",-1))])]),(0,s.Lk)("div",st,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.indexInfo.typeStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getTypeChartColor(i)})},null,4),(0,s.Lk)("span",nt,(0,n.v_)(e||"未知类型"),1),(0,s.Lk)("span",at,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",ot,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,s.Lk)("div",rt,[(0,s.Lk)("div",lt,[(0,s.Lk)("div",ht,[(0,s.bF)(l,{icon:"tools"}),e[18]||(e[18]=(0,s.Lk)("span",null,"系统维护",-1))]),(0,s.Lk)("div",ct,[(0,s.Lk)("div",dt,[(0,s.bF)(d,{content:"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"primary",loading:o.rebuilding,onClick:r.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"}),(0,s.eW)(" "+(0,n.v_)(o.rebuilding?"重建中...":"重建索引"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"备份所有文件元数据和系统设置到JSON文件",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"success",loading:o.backing,onClick:r.backupData,class:"action-btn backup-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"download"}),(0,s.eW)(" "+(0,n.v_)(o.backing?"备份中...":"备份数据"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置",placement:"top"},{default:(0,s.k6)(()=>[(0,s.Lk)("div",ut,[(0,s.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[2]||(e[2]=(...t)=>r.handleFileSelect&&r.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,s.bF)(c,{type:"warning",loading:o.restoring,onClick:r.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"upload"}),(0,s.eW)(" "+(0,n.v_)(o.restoring?"恢复中...":"恢复数据"),1)]),_:1},8,["loading","onClick"])])]),_:1})])])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",gt,[o.indexInfo.newestFile?((0,s.uX)(),(0,s.CE)("div",ft,[(0,s.Lk)("div",pt,[r.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[3]||(e[3]=t=>r.handleImageError("newest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[4]||(e[4]=t=>r.handleImageError("newest"))},null,40,mt)):((0,s.uX)(),(0,s.CE)("div",bt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",xt,[(0,s.Lk)("div",yt,[(0,s.Lk)("div",_t,[(0,s.bF)(l,{icon:"arrow-up"}),e[19]||(e[19]=(0,s.Lk)("span",null,"最近上传",-1))])]),(0,s.Lk)("div",vt,[(0,s.Lk)("div",kt,[(0,s.Lk)("div",wt,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,s.Lk)("div",St,(0,n.v_)(r.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0),o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",Mt,[(0,s.Lk)("div",Ct,[r.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[5]||(e[5]=t=>r.handleImageError("oldest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[6]||(e[6]=t=>r.handleImageError("oldest"))},null,40,Ft)):((0,s.uX)(),(0,s.CE)("div",Pt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",Tt,[(0,s.Lk)("div",At,[(0,s.Lk)("div",Lt,[(0,s.bF)(l,{icon:"arrow-down"}),e[20]||(e[20]=(0,s.Lk)("span",null,"最早上传",-1))])]),(0,s.Lk)("div",Dt,[(0,s.Lk)("div",It,[(0,s.Lk)("div",Vt,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,s.Lk)("div",Et,(0,n.v_)(r.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)])),[[g,o.loading]])}i(8111),i(1701),i(8237),i(4603),i(7566),i(8721);var Rt=i(797),Wt={rE:"2.3.4"};i(116);function zt(t){return zt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},zt(t)}function Bt(t,e){if("object"!=zt(t)||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,e||"default");if("object"!=zt(s))return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function Nt(t){var e=Bt(t,"string");return"symbol"==zt(e)?e:e+""}function jt(t,e,i){return(e=Nt(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}i(2489),i(7588),i(3579),i(7642),i(8004),i(3853),i(5876),i(2475),i(5024),i(1698),i(3110); +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[357],{333:function(t,e,i){i(5331),i(6711)},357:function(t,e,i){i.r(e),i.d(e,{default:function(){return nu}});var s=i(6768),n=i(4232);const o={class:"menu-list"},a=["onClick"],r={class:"menu-text"};function l(t,e,i,l,h,c){const d=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":i.isCollapse}])},[(0,s.Lk)("div",o,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(h.menuItems,t=>((0,s.uX)(),(0,s.CE)("div",{key:t.index,class:(0,n.C4)(["menu-item",{"is-active":i.activeIndex===t.index}]),onClick:e=>c.handleSelect(t.index)},[(0,s.bF)(d,{icon:t.icon,class:"menu-icon"},null,8,["icon"]),(0,s.Lk)("span",r,(0,n.v_)(t.title),1)],10,a))),128))]),(0,s.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,s.bF)(d,{icon:i.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],2)}var h={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{menuItems:[{index:"status",icon:"chart-bar",title:"系统状态"},{index:"upload",icon:"cloud-upload",title:"上传设置"},{index:"security",icon:"shield",title:"安全设置"},{index:"page",icon:"pager",title:"网页设置"},{index:"others",icon:"cog",title:"其他设置"}]}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)}},mounted(){this.checkMobile(),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=i(1241);const d=(0,c.A)(h,[["render",l],["__scopeId","data-v-2bd8175a"]]);var u=d,g=i(4880),f=(i(5331),i(7128),i(8507)),p=(i(213),i(6011));const m={class:"container"},b={class:"header-content"},x={class:"header-action"};function y(t,e,i,o,a,r){const l=p.A,h=(0,s.g2)("font-awesome-icon"),c=f.R7,d=g.bZ,y=u;return(0,s.uX)(),(0,s.CE)("div",m,[(0,s.bF)(d,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",b,[(0,s.bF)(l,{activeTab:"systemConfig"}),(0,s.Lk)("div",x,[(0,s.bF)(c,{disabled:r.disableTooltip,content:"退出登录",placement:"bottom"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{icon:"sign-out-alt",class:"header-icon",onClick:r.handleLogout},null,8,["onClick"])]),_:1},8,["disabled"])])])]),_:1}),(0,s.bF)(y,{activeIndex:a.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>a.activeIndex=t),isCollapse:a.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>a.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,s.uX)(),(0,s.Wv)((0,s.$y)(r.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:a.isSidebarCollapse}])},null,8,["class"]))])}i(4114);var _=i(9114),v=(i(694),i(7009)),k=(i(8450),i(47));i(9648);const w={class:"status-panel"},S={class:"overview-cards"},M={class:"card-icon"},C={class:"card-content"},F={class:"card-value"},P={class:"overview-card index-status"},T={class:"card-icon"},A={class:"card-content"},L={class:"card-value"},D={class:"card-subtitle"},I={class:"card-icon"},V={class:"card-content"},E={class:"card-value"},O={class:"charts-section"},R={class:"chart-card"},W={class:"chart-header"},z={class:"chart-content"},B={key:0,class:"empty-state"},N={key:1,class:"pie-chart-container"},j={class:"pie-chart-wrapper"},U={class:"chart-center-text"},$={class:"center-value"},H={class:"chart-legend"},q={class:"legend-label"},X={class:"legend-value"},Y={class:"legend-percent"},K={class:"chart-card"},Q={class:"chart-header"},G={class:"chart-content"},J={key:0,class:"empty-state"},Z={key:1,class:"pie-chart-container"},tt={class:"pie-chart-wrapper"},et={class:"chart-center-text"},it={class:"center-value"},st={class:"chart-legend"},nt={class:"legend-label"},ot={class:"legend-value"},at={class:"legend-percent"},rt={class:"actions-section"},lt={class:"action-card"},ht={class:"action-header"},ct={class:"action-content"},dt={class:"action-buttons"},ut={class:"restore-section"},gt={key:0,class:"file-info-section"},ft={key:0,class:"file-info-card info-card-newest"},pt={class:"card-bg-wrapper"},mt=["src"],bt={key:2,class:"card-bg-fallback"},xt={class:"info-card-overlay"},yt={class:"info-card-header"},_t={class:"header-badge"},vt={class:"info-card-content"},kt={class:"info-details"},wt={class:"file-name"},St={class:"file-meta"},Mt={key:1,class:"file-info-card info-card-oldest"},Ct={class:"card-bg-wrapper"},Ft=["src"],Pt={key:2,class:"card-bg-fallback"},Tt={class:"info-card-overlay"},At={class:"info-card-header"},Lt={class:"header-badge warning"},Dt={class:"info-card-content"},It={class:"info-details"},Vt={class:"file-name"},Et={class:"file-meta"};function Ot(t,e,i,o,a,r){const l=(0,s.g2)("font-awesome-icon"),h=(0,s.g2)("Doughnut"),c=k.S2,d=f.R7,u=v.Zq,g=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",w,[(0,s.Lk)("div",S,[(0,s.Lk)("div",{class:"overview-card total-files",onClick:e[0]||(e[0]=(...t)=>r.fetchIndexInfo&&r.fetchIndexInfo(...t))},[(0,s.Lk)("div",M,[(0,s.bF)(l,{icon:"database"})]),(0,s.Lk)("div",C,[e[7]||(e[7]=(0,s.Lk)("div",{class:"card-title"},"文件总数",-1)),(0,s.Lk)("div",F,(0,n.v_)(a.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[8]||(e[8]=(0,s.Lk)("div",{class:"card-subtitle"},"点击刷新",-1))])]),(0,s.Lk)("div",P,[(0,s.Lk)("div",T,[(0,s.bF)(l,{icon:"clock"})]),(0,s.Lk)("div",A,[e[9]||(e[9]=(0,s.Lk)("div",{class:"card-title"},"索引更新时间",-1)),(0,s.Lk)("div",L,(0,n.v_)(r.formatTime(a.indexInfo.lastUpdated)),1),(0,s.Lk)("div",D,(0,n.v_)(r.getTimeAgo(a.indexInfo.lastUpdated)),1)])]),(0,s.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>r.openReleases&&r.openReleases(...t))},[(0,s.Lk)("div",I,[(0,s.bF)(l,{icon:"code-branch"})]),(0,s.Lk)("div",V,[e[10]||(e[10]=(0,s.Lk)("div",{class:"card-title"},"系统版本",-1)),(0,s.Lk)("div",E,"v"+(0,n.v_)(a.version),1),e[11]||(e[11]=(0,s.Lk)("div",{class:"card-subtitle"},"点击查看更新日志",-1))])])]),(0,s.Lk)("div",O,[(0,s.Lk)("div",R,[(0,s.Lk)("div",W,[(0,s.bF)(l,{icon:"share-alt"}),e[12]||(e[12]=(0,s.Lk)("span",null,"上传渠道分布",-1))]),(0,s.Lk)("div",z,[0===Object.keys(a.indexInfo.channelStats||{}).length?((0,s.uX)(),(0,s.CE)("div",B,[(0,s.bF)(l,{icon:"inbox"}),e[13]||(e[13]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",N,[(0,s.Lk)("div",j,[(0,s.bF)(h,{data:r.channelChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",U,[(0,s.Lk)("div",$,(0,n.v_)(a.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[14]||(e[14]=(0,s.Lk)("div",{class:"center-label"},"文件总数",-1))])]),(0,s.Lk)("div",H,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.indexInfo.channelStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getChartColor(i)})},null,4),(0,s.Lk)("span",q,(0,n.v_)(e),1),(0,s.Lk)("span",X,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",Y,(0,n.v_)(r.getPercentage(t,a.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,s.Lk)("div",K,[(0,s.Lk)("div",Q,[(0,s.bF)(l,{icon:"file-alt"}),e[15]||(e[15]=(0,s.Lk)("span",null,"文件状态分布",-1))]),(0,s.Lk)("div",G,[0===Object.keys(a.indexInfo.typeStats||{}).length?((0,s.uX)(),(0,s.CE)("div",J,[(0,s.bF)(l,{icon:"inbox"}),e[16]||(e[16]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",Z,[(0,s.Lk)("div",tt,[(0,s.bF)(h,{data:r.typeChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",et,[(0,s.Lk)("div",it,(0,n.v_)(Object.keys(a.indexInfo.typeStats).length),1),e[17]||(e[17]=(0,s.Lk)("div",{class:"center-label"},"状态类型",-1))])]),(0,s.Lk)("div",st,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.indexInfo.typeStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getTypeChartColor(i)})},null,4),(0,s.Lk)("span",nt,(0,n.v_)(e||"未知类型"),1),(0,s.Lk)("span",ot,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",at,(0,n.v_)(r.getPercentage(t,a.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,s.Lk)("div",rt,[(0,s.Lk)("div",lt,[(0,s.Lk)("div",ht,[(0,s.bF)(l,{icon:"tools"}),e[18]||(e[18]=(0,s.Lk)("span",null,"系统维护",-1))]),(0,s.Lk)("div",ct,[(0,s.Lk)("div",dt,[(0,s.bF)(d,{content:"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"primary",loading:a.rebuilding,onClick:r.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"}),(0,s.eW)(" "+(0,n.v_)(a.rebuilding?"重建中...":"重建索引"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"备份所有文件元数据和系统设置到JSON文件",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"success",loading:a.backing,onClick:r.backupData,class:"action-btn backup-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"download"}),(0,s.eW)(" "+(0,n.v_)(a.backing?"备份中...":"备份数据"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置",placement:"top"},{default:(0,s.k6)(()=>[(0,s.Lk)("div",ut,[(0,s.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[2]||(e[2]=(...t)=>r.handleFileSelect&&r.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,s.bF)(c,{type:"warning",loading:a.restoring,onClick:r.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"upload"}),(0,s.eW)(" "+(0,n.v_)(a.restoring?"恢复中...":"恢复数据"),1)]),_:1},8,["loading","onClick"])])]),_:1})])])])]),a.indexInfo.newestFile||a.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",gt,[a.indexInfo.newestFile?((0,s.uX)(),(0,s.CE)("div",ft,[(0,s.Lk)("div",pt,[r.isImageFile(a.indexInfo.newestFile)&&!a.loadErrors["newest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+a.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[3]||(e[3]=t=>r.handleImageError("newest"))},null,8,["src"])):r.isVideoFile(a.indexInfo.newestFile)&&!a.loadErrors["newest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+a.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[4]||(e[4]=t=>r.handleImageError("newest"))},null,40,mt)):((0,s.uX)(),(0,s.CE)("div",bt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",xt,[(0,s.Lk)("div",yt,[(0,s.Lk)("div",_t,[(0,s.bF)(l,{icon:"arrow-up"}),e[19]||(e[19]=(0,s.Lk)("span",null,"最近上传",-1))])]),(0,s.Lk)("div",vt,[(0,s.Lk)("div",kt,[(0,s.Lk)("div",wt,(0,n.v_)(a.indexInfo.newestFile.metadata?.FileName||a.indexInfo.newestFile.id),1),(0,s.Lk)("div",St,(0,n.v_)(r.formatTime(a.indexInfo.newestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0),a.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",Mt,[(0,s.Lk)("div",Ct,[r.isImageFile(a.indexInfo.oldestFile)&&!a.loadErrors["oldest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+a.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[5]||(e[5]=t=>r.handleImageError("oldest"))},null,8,["src"])):r.isVideoFile(a.indexInfo.oldestFile)&&!a.loadErrors["oldest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+a.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[6]||(e[6]=t=>r.handleImageError("oldest"))},null,40,Ft)):((0,s.uX)(),(0,s.CE)("div",Pt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",Tt,[(0,s.Lk)("div",At,[(0,s.Lk)("div",Lt,[(0,s.bF)(l,{icon:"arrow-down"}),e[20]||(e[20]=(0,s.Lk)("span",null,"最早上传",-1))])]),(0,s.Lk)("div",Dt,[(0,s.Lk)("div",It,[(0,s.Lk)("div",Vt,(0,n.v_)(a.indexInfo.oldestFile.metadata?.FileName||a.indexInfo.oldestFile.id),1),(0,s.Lk)("div",Et,(0,n.v_)(r.formatTime(a.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)])),[[g,a.loading]])}i(8111),i(1701),i(8237),i(4603),i(7566),i(8721);var Rt=i(797),Wt={rE:"2.3.4"};i(116);function zt(t){return zt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},zt(t)}function Bt(t,e){if("object"!=zt(t)||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,e||"default");if("object"!=zt(s))return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function Nt(t){var e=Bt(t,"string");return"symbol"==zt(e)?e:e+""}function jt(t,e,i){return(e=Nt(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}i(2489),i(7588),i(3579),i(7642),i(8004),i(3853),i(5876),i(2475),i(5024),i(1698),i(3110); /*! * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme * (c) 2024 Jukka Kurkela * Released under the MIT License */ -function Ut(t){return t+.5|0}const $t=(t,e,i)=>Math.max(Math.min(t,i),e);function Ht(t){return $t(Ut(2.55*t),0,255)}function qt(t){return $t(Ut(255*t),0,255)}function Xt(t){return $t(Ut(t/2.55)/100,0,1)}function Yt(t){return $t(Ut(100*t),0,100)}const Kt={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},Qt=[..."0123456789ABCDEF"],Gt=t=>Qt[15&t],Jt=t=>Qt[(240&t)>>4]+Qt[15&t],Zt=t=>(240&t)>>4===(15&t),te=t=>Zt(t.r)&&Zt(t.g)&&Zt(t.b)&&Zt(t.a);function ee(t){var e,i=t.length;return"#"===t[0]&&(4===i||5===i?e={r:255&17*Kt[t[1]],g:255&17*Kt[t[2]],b:255&17*Kt[t[3]],a:5===i?17*Kt[t[4]]:255}:7!==i&&9!==i||(e={r:Kt[t[1]]<<4|Kt[t[2]],g:Kt[t[3]]<<4|Kt[t[4]],b:Kt[t[5]]<<4|Kt[t[6]],a:9===i?Kt[t[7]]<<4|Kt[t[8]]:255})),e}const ie=(t,e)=>t<255?e(t):"";function se(t){var e=te(t)?Gt:Jt;return t?"#"+e(t.r)+e(t.g)+e(t.b)+ie(t.a,e):void 0}const ne=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function ae(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 oe(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 re(t,e,i){const s=ae(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 le(t,e,i,s,n){return t===n?(e-i)/s+(e.5?c/(2-a-o):c/(a+o),l=le(i,s,n,c,a),l=60*l+.5),[0|l,h||0,r]}function ce(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(qt)}function de(t,e,i){return ce(ae,t,e,i)}function ue(t,e,i){return ce(re,t,e,i)}function ge(t,e,i){return ce(oe,t,e,i)}function fe(t){return(t%360+360)%360}function pe(t){const e=ne.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?Ht(+e[5]):qt(+e[5]));const n=fe(+e[2]),a=+e[3]/100,o=+e[4]/100;return i="hwb"===e[1]?ue(n,a,o):"hsv"===e[1]?ge(n,a,o):de(n,a,o),{r:i[0],g:i[1],b:i[2],a:s}}function me(t,e){var i=he(t);i[0]=fe(i[0]+e),i=de(i),t.r=i[0],t.g=i[1],t.b=i[2]}function be(t){if(!t)return;const e=he(t),i=e[0],s=Yt(e[1]),n=Yt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${Xt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}const xe={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"},ye={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"};function _e(){const t={},e=Object.keys(ye),i=Object.keys(xe);let s,n,a,o,r;for(s=0;s>16&255,a>>8&255,255&a]}return t}let ve;function ke(t){ve||(ve=_e(),ve.transparent=[0,0,0,0]);const e=ve[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const we=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Se(t){const e=we.exec(t);let i,s,n,a=255;if(e){if(e[7]!==i){const t=+e[7];a=e[8]?Ht(t):$t(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?Ht(i):$t(i,0,255)),s=255&(e[4]?Ht(s):$t(s,0,255)),n=255&(e[6]?Ht(n):$t(n,0,255)),{r:i,g:s,b:n,a:a}}}function Me(t){return t&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${Xt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`)}const Ce=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Fe=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Pe(t,e,i){const s=Fe(Xt(t.r)),n=Fe(Xt(t.g)),a=Fe(Xt(t.b));return{r:qt(Ce(s+i*(Fe(Xt(e.r))-s))),g:qt(Ce(n+i*(Fe(Xt(e.g))-n))),b:qt(Ce(a+i*(Fe(Xt(e.b))-a))),a:t.a+i*(e.a-t.a)}}function Te(t,e,i){if(t){let s=he(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=de(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function Ae(t,e){return t?Object.assign(e||{},t):t}function Le(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=qt(t[3]))):(e=Ae(t,{r:0,g:0,b:0,a:1}),e.a=qt(e.a)),e}function De(t){return"r"===t.charAt(0)?Se(t):pe(t)}class Ie{constructor(t){if(t instanceof Ie)return t;const e=typeof t;let i;"object"===e?i=Le(t):"string"===e&&(i=ee(t)||ke(t)||De(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=Ae(this._rgb);return t&&(t.a=Xt(t.a)),t}set rgb(t){this._rgb=Le(t)}rgbString(){return this._valid?Me(this._rgb):void 0}hexString(){return this._valid?se(this._rgb):void 0}hslString(){return this._valid?be(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const a=e===n?.5:e,o=2*a-1,r=i.a-s.a,l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=a*i.a+(1-a)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=Pe(this._rgb,t._rgb,e)),this}clone(){return new Ie(this.rgb)}alpha(t){return this._rgb.a=qt(t),this}clearer(t){const e=this._rgb;return e.a*=1-t,this}greyscale(){const t=this._rgb,e=Ut(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){const e=this._rgb;return e.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 Te(this._rgb,2,t),this}darken(t){return Te(this._rgb,2,-t),this}saturate(t){return Te(this._rgb,1,t),this}desaturate(t){return Te(this._rgb,1,-t),this}rotate(t){return me(this._rgb,t),this}} +function Ut(t){return t+.5|0}const $t=(t,e,i)=>Math.max(Math.min(t,i),e);function Ht(t){return $t(Ut(2.55*t),0,255)}function qt(t){return $t(Ut(255*t),0,255)}function Xt(t){return $t(Ut(t/2.55)/100,0,1)}function Yt(t){return $t(Ut(100*t),0,100)}const Kt={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},Qt=[..."0123456789ABCDEF"],Gt=t=>Qt[15&t],Jt=t=>Qt[(240&t)>>4]+Qt[15&t],Zt=t=>(240&t)>>4===(15&t),te=t=>Zt(t.r)&&Zt(t.g)&&Zt(t.b)&&Zt(t.a);function ee(t){var e,i=t.length;return"#"===t[0]&&(4===i||5===i?e={r:255&17*Kt[t[1]],g:255&17*Kt[t[2]],b:255&17*Kt[t[3]],a:5===i?17*Kt[t[4]]:255}:7!==i&&9!==i||(e={r:Kt[t[1]]<<4|Kt[t[2]],g:Kt[t[3]]<<4|Kt[t[4]],b:Kt[t[5]]<<4|Kt[t[6]],a:9===i?Kt[t[7]]<<4|Kt[t[8]]:255})),e}const ie=(t,e)=>t<255?e(t):"";function se(t){var e=te(t)?Gt:Jt;return t?"#"+e(t.r)+e(t.g)+e(t.b)+ie(t.a,e):void 0}const ne=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function oe(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 ae(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 re(t,e,i){const s=oe(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 le(t,e,i,s,n){return t===n?(e-i)/s+(e.5?c/(2-o-a):c/(o+a),l=le(i,s,n,c,o),l=60*l+.5),[0|l,h||0,r]}function ce(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(qt)}function de(t,e,i){return ce(oe,t,e,i)}function ue(t,e,i){return ce(re,t,e,i)}function ge(t,e,i){return ce(ae,t,e,i)}function fe(t){return(t%360+360)%360}function pe(t){const e=ne.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?Ht(+e[5]):qt(+e[5]));const n=fe(+e[2]),o=+e[3]/100,a=+e[4]/100;return i="hwb"===e[1]?ue(n,o,a):"hsv"===e[1]?ge(n,o,a):de(n,o,a),{r:i[0],g:i[1],b:i[2],a:s}}function me(t,e){var i=he(t);i[0]=fe(i[0]+e),i=de(i),t.r=i[0],t.g=i[1],t.b=i[2]}function be(t){if(!t)return;const e=he(t),i=e[0],s=Yt(e[1]),n=Yt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${Xt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}const xe={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"},ye={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"};function _e(){const t={},e=Object.keys(ye),i=Object.keys(xe);let s,n,o,a,r;for(s=0;s>16&255,o>>8&255,255&o]}return t}let ve;function ke(t){ve||(ve=_e(),ve.transparent=[0,0,0,0]);const e=ve[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const we=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Se(t){const e=we.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?Ht(t):$t(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?Ht(i):$t(i,0,255)),s=255&(e[4]?Ht(s):$t(s,0,255)),n=255&(e[6]?Ht(n):$t(n,0,255)),{r:i,g:s,b:n,a:o}}}function Me(t){return t&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${Xt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`)}const Ce=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Fe=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Pe(t,e,i){const s=Fe(Xt(t.r)),n=Fe(Xt(t.g)),o=Fe(Xt(t.b));return{r:qt(Ce(s+i*(Fe(Xt(e.r))-s))),g:qt(Ce(n+i*(Fe(Xt(e.g))-n))),b:qt(Ce(o+i*(Fe(Xt(e.b))-o))),a:t.a+i*(e.a-t.a)}}function Te(t,e,i){if(t){let s=he(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=de(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function Ae(t,e){return t?Object.assign(e||{},t):t}function Le(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=qt(t[3]))):(e=Ae(t,{r:0,g:0,b:0,a:1}),e.a=qt(e.a)),e}function De(t){return"r"===t.charAt(0)?Se(t):pe(t)}class Ie{constructor(t){if(t instanceof Ie)return t;const e=typeof t;let i;"object"===e?i=Le(t):"string"===e&&(i=ee(t)||ke(t)||De(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=Ae(this._rgb);return t&&(t.a=Xt(t.a)),t}set rgb(t){this._rgb=Le(t)}rgbString(){return this._valid?Me(this._rgb):void 0}hexString(){return this._valid?se(this._rgb):void 0}hslString(){return this._valid?be(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r===-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=Pe(this._rgb,t._rgb,e)),this}clone(){return new Ie(this.rgb)}alpha(t){return this._rgb.a=qt(t),this}clearer(t){const e=this._rgb;return e.a*=1-t,this}greyscale(){const t=this._rgb,e=Ut(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){const e=this._rgb;return e.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 Te(this._rgb,2,t),this}darken(t){return Te(this._rgb,2,-t),this}saturate(t){return Te(this._rgb,1,t),this}desaturate(t){return Te(this._rgb,1,-t),this}rotate(t){return me(this._rgb,t),this}} /*! * Chart.js v4.5.1 * https://www.chartjs.org * (c) 2025 Chart.js Contributors * Released under the MIT License */ -function Ve(){}const Ee=(()=>{let t=0;return()=>t++})();function Oe(t){return null===t||void 0===t}function Re(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function We(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function ze(t){return("number"===typeof t||t instanceof Number)&&isFinite(+t)}function Be(t,e){return ze(t)?t:e}function Ne(t,e){return"undefined"===typeof t?e:t}const je=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,Ue=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function $e(t,e,i){if(t&&"function"===typeof t.call)return t.apply(i,e)}function He(t,e,i,s){let n,a,o;if(Re(t))if(a=t.length,s)for(n=a-1;n>=0;n--)e.call(i,t[n],n);else for(n=0;nt,x:t=>t.x,y:t=>t.y};function ti(t){const e=t.split("."),i=[];let s="";for(const n of e)s+=n,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function ei(t){const e=ti(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}function ii(t,e){const i=Ze[e]||(Ze[e]=ei(e));return i(t)}function si(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ni=t=>"undefined"!==typeof t,ai=t=>"function"===typeof t,oi=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function ri(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const li=Math.PI,hi=2*li,ci=hi+li,di=Number.POSITIVE_INFINITY,ui=li/180,gi=li/2,fi=li/4,pi=2*li/3,mi=Math.log10,bi=Math.sign;function xi(t,e,i){return Math.abs(t-e)t-e).pop(),e}function vi(t){return"symbol"===typeof t||"object"===typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}function ki(t){return!vi(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function wi(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function Si(t,e,i){let s,n,a;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function Oi(t,e,i){i=i||(i=>t[i]1)s=a+n>>1,i(s)?a=s:n=s;return{lo:a,hi:n}}const Ri=(t,e,i,s)=>Oi(t,i,s?s=>{const n=t[s][e];return nt[s][e]Oi(t,i,s=>t[s][e]>=i);function zi(t,e,i){let s=0,n=t.length;while(ss&&t[n-1]>i)n--;return s>0||n{const i="_onData"+si(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 ji(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||(Bi.forEach(e=>{delete t[e]}),delete t._chartjs)}function Ui(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const $i=function(){return"undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame}();function Hi(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,$i.call(window,()=>{s=!1,t.apply(e,i)}))}}function qi(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const Xi=t=>"start"===t?"left":"end"===t?"right":"center",Yi=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,Ki=(t,e,i,s)=>{const n=s?"left":"right";return t===n?i:"center"===t?(e+i)/2:e};function Qi(t,e,i){const s=e.length;let n=0,a=s;if(t._sorted){const{iScale:o,vScale:r,_parsed:l}=t,h=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null,c=o.axis,{min:d,max:u,minDefined:g,maxDefined:f}=o.getUserBounds();if(g){if(n=Math.min(Ri(l,c,d).lo,i?s:Ri(e,c,o.getPixelForValue(d)).lo),h){const t=l.slice(0,n+1).reverse().findIndex(t=>!Oe(t[r.axis]));n-=Math.max(0,t)}n=Ii(n,0,s-1)}if(f){let t=Math.max(Ri(l,o.axis,u,!0).hi+1,i?0:Ri(e,c,o.getPixelForValue(u),!0).hi+1);if(h){const e=l.slice(t-1).findIndex(t=>!Oe(t[r.axis]));t+=Math.max(0,e)}a=Ii(t,n,s)-n}else a=s-n}return{start:n,count:a}}function Gi(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 a=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),a}const Ji=t=>0===t||1===t,Zi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*hi/i),ts=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*hi/i)+1,es={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*gi),easeOutSine:t=>Math.sin(t*gi),easeInOutSine:t=>-.5*(Math.cos(li*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=>Ji(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=>Ji(t)?t:Zi(t,.075,.3),easeOutElastic:t=>Ji(t)?t:ts(t,.075,.3),easeInOutElastic(t){const e=.1125,i=.45;return Ji(t)?t:t<.5?.5*Zi(2*t,e,i):.5+.5*ts(2*t-1,e,i)},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-es.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*es.easeInBounce(2*t):.5*es.easeOutBounce(2*t-1)+.5};function is(t){if(t&&"object"===typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function ss(t){return is(t)?t:new Ie(t)}function ns(t){return is(t)?t:new Ie(t).saturate(.5).darken(.1).hexString()}const as=["x","y","borderWidth","radius","tension"],os=["color","borderColor","backgroundColor"];function rs(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:os},numbers:{type:"number",properties:as}}),t.describe("animations",{_fallback:"animation"}),t.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}}}})}function ls(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const hs=new Map;function cs(t,e){e=e||{};const i=t+JSON.stringify(e);let s=hs.get(i);return s||(s=new Intl.NumberFormat(t,e),hs.set(i,s)),s}function ds(t,e,i){return cs(e,i).format(t)}const us={values(t){return Re(t)?t:""+t},numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,a=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"),a=gs(t,i)}const o=mi(Math.abs(a)),r=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ds(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(mi(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?us.numeric.call(this,t,e,i):""}};function gs(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t)),i}var fs={formatters:us};function ps(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width: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:fs.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}const ms=Object.create(null),bs=Object.create(null);function xs(t,e){if(!e)return t;const i=e.split(".");for(let s=0,n=i.length;st.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)=>ns(e.backgroundColor),this.hoverBorderColor=(t,e)=>ns(e.borderColor),this.hoverColor=(t,e)=>ns(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},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),this.apply(e)}set(t,e){return ys(this,t,e)}get(t){return xs(this,t)}describe(t,e){return ys(bs,t,e)}override(t,e){return ys(ms,t,e)}route(t,e,i,s){const n=xs(this,t),a=xs(this,i),o="_"+e;Object.defineProperties(n,{[o]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[o],e=a[s];return We(t)?Object.assign({},e,t):Ne(t,e)},set(t){this[o]=t}}})}apply(t){t.forEach(t=>t(this))}}var vs=new _s({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[rs,ls,ps]);function ks(t){return!t||Oe(t.size)||Oe(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function ws(t,e,i,s,n){let a=e[n];return a||(a=e[n]=t.measureText(n).width,i.push(n)),a>s&&(s=a),s}function Ss(t,e,i,s){s=s||{};let n=s.data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(n=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let o=0;const r=i.length;let l,h,c,d,u;for(l=0;li.length){for(l=0;l0&&t.stroke()}}function Ts(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==a.strokeColor;let l,h;for(t.save(),t.font=n.string,Vs(t,a),l=0;l+t||0;function Us(t,e){const i={},s=We(e),n=s?Object.keys(e):e,a=We(t)?s?i=>Ne(t[i],t[e[i]]):e=>t[e]:()=>t;for(const o of n)i[o]=js(a(o));return i}function $s(t){return Us(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Hs(t){return Us(t,["topLeft","topRight","bottomLeft","bottomRight"])}function qs(t){const e=$s(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Xs(t,e){t=t||{},e=e||vs.font;let i=Ne(t.size,e.size);"string"===typeof i&&(i=parseInt(i,10));let s=Ne(t.style,e.style);s&&!(""+s).match(Bs)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:Ne(t.family,e.family),lineHeight:Ns(Ne(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:Ne(t.weight,e.weight),string:""};return n.string=ks(n),n}function Ys(t,e,i,s){let n,a,o,r=!0;for(n=0,a=t.length;ni&&0===t?0:t+e;return{min:o(s,-Math.abs(a)),max:o(n,a)}}function Qs(t,e){return Object.assign(Object.create(t),e)}function Gs(t,e=[""],i,s,n=()=>t[0]){const a=i||t;"undefined"===typeof s&&(s=fn("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:a,_fallback:s,_getTarget:n,override:i=>Gs([i,...t],e,a,s)};return new Proxy(o,{deleteProperty(e,i){return delete e[i],delete e._keys,delete t[0][i],!0},get(i,s){return sn(i,s,()=>gn(s,e,t,i))},getOwnPropertyDescriptor(t,e){return Reflect.getOwnPropertyDescriptor(t._scopes[0],e)},getPrototypeOf(){return Reflect.getPrototypeOf(t[0])},has(t,e){return pn(t).includes(e)},ownKeys(t){return pn(t)},set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function Js(t,e,i,s){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Zs(t,s),setContext:e=>Js(t,e,i,s),override:n=>Js(t.override(n),e,i,s)};return new Proxy(n,{deleteProperty(e,i){return delete e[i],delete t[i],!0},get(t,e,i){return sn(t,e,()=>nn(t,e,i))},getOwnPropertyDescriptor(e,i){return e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i)},getPrototypeOf(){return Reflect.getPrototypeOf(t)},has(e,i){return Reflect.has(t,i)},ownKeys(){return Reflect.ownKeys(t)},set(e,i,s){return t[i]=s,delete e[i],!0}})}function Zs(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:ai(i)?i:()=>i,isIndexable:ai(s)?s:()=>s}}const tn=(t,e)=>t?t+si(e):e,en=(t,e)=>We(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function sn(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const s=i();return t[e]=s,s}function nn(t,e,i){const{_proxy:s,_context:n,_subProxy:a,_descriptors:o}=t;let r=s[e];return ai(r)&&o.isScriptable(e)&&(r=an(e,r,t,i)),Re(r)&&r.length&&(r=on(e,r,t,o.isIndexable)),en(e,r)&&(r=Js(r,n,a&&a[e],o)),r}function an(t,e,i,s){const{_proxy:n,_context:a,_subProxy:o,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(a,o||s);return r.delete(t),en(t,l)&&(l=cn(n._scopes,n,t,l)),l}function on(t,e,i,s){const{_proxy:n,_context:a,_subProxy:o,_descriptors:r}=i;if("undefined"!==typeof a.index&&s(t))return e[a.index%e.length];if(We(e[0])){const i=e,s=n._scopes.filter(t=>t!==i);e=[];for(const l of i){const i=cn(s,n,t,l);e.push(Js(i,a,o&&o[t],r))}}return e}function rn(t,e,i){return ai(t)?t(e,i):t}const ln=(t,e)=>!0===t?e:"string"===typeof t?ii(e,t):void 0;function hn(t,e,i,s,n){for(const a of e){const e=ln(i,a);if(e){t.add(e);const a=rn(e._fallback,i,n);if("undefined"!==typeof a&&a!==i&&a!==s)return a}else if(!1===e&&"undefined"!==typeof s&&i!==s)return null}return!1}function cn(t,e,i,s){const n=e._rootScopes,a=rn(e._fallback,i,s),o=[...t,...n],r=new Set;r.add(s);let l=dn(r,o,i,a||i,s);return null!==l&&(("undefined"===typeof a||a===i||(l=dn(r,o,a,l,s),null!==l))&&Gs(Array.from(r),[""],n,a,()=>un(e,i,s)))}function dn(t,e,i,s,n){while(i)i=hn(t,e,i,s,n);return i}function un(t,e,i){const s=t._getTarget();e in s||(s[e]={});const n=s[e];return Re(n)&&We(i)?i:n||{}}function gn(t,e,i,s){let n;for(const a of e)if(n=fn(tn(a,t),i),"undefined"!==typeof n)return en(t,n)?cn(i,s,t,n):n}function fn(t,e){for(const i of e){if(!i)continue;const e=i[t];if("undefined"!==typeof e)return e}}function pn(t){let e=t._keys;return e||(e=t._keys=mn(t._scopes)),e}function mn(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)}function bn(t,e,i,s){const{iScale:n}=t,{key:a="r"}=this._parsing,o=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function vn(t,e,i,s){const n=t.skip?e:t,a=e,o=i.skip?e:i,r=Ti(a,n),l=Ti(o,a);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:a.x-d*(o.x-n.x),y:a.y-d*(o.y-n.y)},next:{x:a.x+u*(o.x-n.x),y:a.y+u*(o.y-n.y)}}}function kn(t,e,i){const s=t.length;let n,a,o,r,l,h=yn(t,0);for(let c=0;c!t.skip)),"monotone"===e.cubicInterpolationMode)Sn(t,n);else{let i=s?t[t.length-1]:t[0];for(a=0,o=t.length;at.ownerDocument.defaultView.getComputedStyle(t,null);function Dn(t,e){return Ln(t).getPropertyValue(e)}const In=["top","right","bottom","left"];function Vn(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const a=In[n];s[a]=parseFloat(t[e+"-"+a+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const En=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function On(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:a}=s;let o,r,l=!1;if(En(n,a,t.target))o=n,r=a;else{const t=e.getBoundingClientRect();o=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:o,y:r,box:l}}function Rn(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=Ln(i),a="border-box"===n.boxSizing,o=Vn(n,"padding"),r=Vn(n,"border","width"),{x:l,y:h,box:c}=On(t,i),d=o.left+(c&&r.left),u=o.top+(c&&r.top);let{width:g,height:f}=e;return a&&(g-=o.width+r.width,f-=o.height+r.height),{x:Math.round((l-d)/g*i.width/s),y:Math.round((h-u)/f*i.height/s)}}function Wn(t,e,i){let s,n;if(void 0===e||void 0===i){const a=t&&Tn(t);if(a){const t=a.getBoundingClientRect(),o=Ln(a),r=Vn(o,"border","width"),l=Vn(o,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=An(o.maxWidth,a,"clientWidth"),n=An(o.maxHeight,a,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||di,maxHeight:n||di}}const zn=t=>Math.round(10*t)/10;function Bn(t,e,i,s){const n=Ln(t),a=Vn(n,"margin"),o=An(n.maxWidth,t,"clientWidth")||di,r=An(n.maxHeight,t,"clientHeight")||di,l=Wn(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=Vn(n,"border","width"),e=Vn(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-a.width),c=Math.max(0,s?h/s:c-a.height),h=zn(Math.min(h,o,l.maxWidth)),c=zn(Math.min(c,r,l.maxHeight)),h&&!c&&(c=zn(h/2));const d=void 0!==e||void 0!==i;return d&&s&&l.height&&c>l.height&&(c=l.height,h=zn(Math.floor(c*s))),{width:h,height:c}}function Nn(t,e,i){const s=e||1,n=zn(t.height*s),a=zn(t.width*s);t.height=zn(t.height),t.width=zn(t.width);const o=t.canvas;return o.style&&(i||!o.style.height&&!o.style.width)&&(o.style.height=`${t.height}px`,o.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||o.height!==n||o.width!==a)&&(t.currentDevicePixelRatio=s,o.height=n,o.width=a,t.ctx.setTransform(s,0,0,s,0,0),!0)}const jn=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};Pn()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(e){}return t}();function Un(t,e){const i=Dn(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function $n(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Hn(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 qn(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},a={x:e.cp1x,y:e.cp1y},o=$n(t,n,i),r=$n(n,a,i),l=$n(a,e,i),h=$n(o,r,i),c=$n(r,l,i);return $n(h,c,i)}const Xn=function(t,e){return{x(i){return t+t+e-i},setWidth(t){e=t},textAlign(t){return"center"===t?t:"right"===t?"left":"right"},xPlus(t,e){return t-e},leftForLtr(t,e){return t-e}}},Yn=function(){return{x(t){return t},setWidth(t){},textAlign(t){return t},xPlus(t,e){return t+e},leftForLtr(t,e){return t}}};function Kn(t,e,i){return t?Xn(e,i):Yn()}function Qn(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 Gn(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Jn(t){return"angle"===t?{between:Di,compare:Ai,normalize:Li}:{between:Ei,compare:(t,e)=>t-e,normalize:t=>t}}function Zn({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 ta(t,e,i){const{property:s,start:n,end:a}=i,{between:o,normalize:r}=Jn(s),l=e.length;let h,c,{start:d,end:u,loop:g}=t;if(g){for(d+=l,u+=l,h=0,c=l;hl(n,b,p)&&0!==r(n,b),v=()=>0===r(a,p)||l(a,b,p),k=()=>x||_(),w=()=>!x||v();for(let S=c,M=c;S<=d;++S)m=e[S%o],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,a),null===y&&k()&&(y=0===r(p,n)?S:M),null!==y&&w()&&(f.push(Zn({start:y,end:S,loop:u,count:o,style:g})),y=null),M=S,b=p));return null!==y&&f.push(Zn({start:y,end:d,loop:u,count:o,style:g})),f}function ia(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[a%e].skip)a--;return a%=e,{start:n,end:a}}function na(t,e,i,s){const n=t.length,a=[];let o,r=e,l=t[e];for(o=e+1;o<=i;++o){const i=t[o%n];i.skip||i.stop?l.skip||(s=!1,a.push({start:e%n,end:(o-1)%n,loop:s}),e=r=i.stop?o:null):(r=o,l.skip&&(e=o)),l=i}return null!==r&&a.push({start:e%n,end:r%n,loop:s}),a}function aa(t,e){const i=t.points,s=t.options.spanGaps,n=i.length;if(!n)return[];const a=!!t._loop,{start:o,end:r}=sa(i,n,a,s);if(!0===s)return oa(t,[{start:o,end:r,loop:a}],i,e);const l=r{let t=0;return()=>t++})();function Oe(t){return null===t||void 0===t}function Re(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function We(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function ze(t){return("number"===typeof t||t instanceof Number)&&isFinite(+t)}function Be(t,e){return ze(t)?t:e}function Ne(t,e){return"undefined"===typeof t?e:t}const je=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,Ue=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function $e(t,e,i){if(t&&"function"===typeof t.call)return t.apply(i,e)}function He(t,e,i,s){let n,o,a;if(Re(t))if(o=t.length,s)for(n=o-1;n>=0;n--)e.call(i,t[n],n);else for(n=0;nt,x:t=>t.x,y:t=>t.y};function ti(t){const e=t.split("."),i=[];let s="";for(const n of e)s+=n,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function ei(t){const e=ti(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}function ii(t,e){const i=Ze[e]||(Ze[e]=ei(e));return i(t)}function si(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ni=t=>"undefined"!==typeof t,oi=t=>"function"===typeof t,ai=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function ri(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const li=Math.PI,hi=2*li,ci=hi+li,di=Number.POSITIVE_INFINITY,ui=li/180,gi=li/2,fi=li/4,pi=2*li/3,mi=Math.log10,bi=Math.sign;function xi(t,e,i){return Math.abs(t-e)t-e).pop(),e}function vi(t){return"symbol"===typeof t||"object"===typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}function ki(t){return!vi(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function wi(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function Si(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function Oi(t,e,i){i=i||(i=>t[i]1)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const Ri=(t,e,i,s)=>Oi(t,i,s?s=>{const n=t[s][e];return nt[s][e]Oi(t,i,s=>t[s][e]>=i);function zi(t,e,i){let s=0,n=t.length;while(ss&&t[n-1]>i)n--;return s>0||n{const i="_onData"+si(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 ji(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||(Bi.forEach(e=>{delete t[e]}),delete t._chartjs)}function Ui(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const $i=function(){return"undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame}();function Hi(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,$i.call(window,()=>{s=!1,t.apply(e,i)}))}}function qi(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const Xi=t=>"start"===t?"left":"end"===t?"right":"center",Yi=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,Ki=(t,e,i,s)=>{const n=s?"left":"right";return t===n?i:"center"===t?(e+i)/2:e};function Qi(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,vScale:r,_parsed:l}=t,h=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null,c=a.axis,{min:d,max:u,minDefined:g,maxDefined:f}=a.getUserBounds();if(g){if(n=Math.min(Ri(l,c,d).lo,i?s:Ri(e,c,a.getPixelForValue(d)).lo),h){const t=l.slice(0,n+1).reverse().findIndex(t=>!Oe(t[r.axis]));n-=Math.max(0,t)}n=Ii(n,0,s-1)}if(f){let t=Math.max(Ri(l,a.axis,u,!0).hi+1,i?0:Ri(e,c,a.getPixelForValue(u),!0).hi+1);if(h){const e=l.slice(t-1).findIndex(t=>!Oe(t[r.axis]));t+=Math.max(0,e)}o=Ii(t,n,s)-n}else o=s-n}return{start:n,count:o}}function Gi(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}const Ji=t=>0===t||1===t,Zi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*hi/i),ts=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*hi/i)+1,es={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*gi),easeOutSine:t=>Math.sin(t*gi),easeInOutSine:t=>-.5*(Math.cos(li*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=>Ji(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=>Ji(t)?t:Zi(t,.075,.3),easeOutElastic:t=>Ji(t)?t:ts(t,.075,.3),easeInOutElastic(t){const e=.1125,i=.45;return Ji(t)?t:t<.5?.5*Zi(2*t,e,i):.5+.5*ts(2*t-1,e,i)},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-es.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*es.easeInBounce(2*t):.5*es.easeOutBounce(2*t-1)+.5};function is(t){if(t&&"object"===typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function ss(t){return is(t)?t:new Ie(t)}function ns(t){return is(t)?t:new Ie(t).saturate(.5).darken(.1).hexString()}const os=["x","y","borderWidth","radius","tension"],as=["color","borderColor","backgroundColor"];function rs(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:as},numbers:{type:"number",properties:os}}),t.describe("animations",{_fallback:"animation"}),t.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}}}})}function ls(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const hs=new Map;function cs(t,e){e=e||{};const i=t+JSON.stringify(e);let s=hs.get(i);return s||(s=new Intl.NumberFormat(t,e),hs.set(i,s)),s}function ds(t,e,i){return cs(e,i).format(t)}const us={values(t){return Re(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=gs(t,i)}const a=mi(Math.abs(o)),r=isNaN(a)?1: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),ds(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(mi(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?us.numeric.call(this,t,e,i):""}};function gs(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t)),i}var fs={formatters:us};function ps(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width: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:fs.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}const ms=Object.create(null),bs=Object.create(null);function xs(t,e){if(!e)return t;const i=e.split(".");for(let s=0,n=i.length;st.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)=>ns(e.backgroundColor),this.hoverBorderColor=(t,e)=>ns(e.borderColor),this.hoverColor=(t,e)=>ns(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},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),this.apply(e)}set(t,e){return ys(this,t,e)}get(t){return xs(this,t)}describe(t,e){return ys(bs,t,e)}override(t,e){return ys(ms,t,e)}route(t,e,i,s){const n=xs(this,t),o=xs(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 We(t)?Object.assign({},e,t):Ne(t,e)},set(t){this[a]=t}}})}apply(t){t.forEach(t=>t(this))}}var vs=new _s({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[rs,ls,ps]);function ks(t){return!t||Oe(t.size)||Oe(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function ws(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 Ss(t,e,i,s){s=s||{};let n=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;li.length){for(l=0;l0&&t.stroke()}}function Ts(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==o.strokeColor;let l,h;for(t.save(),t.font=n.string,Vs(t,o),l=0;l+t||0;function Us(t,e){const i={},s=We(e),n=s?Object.keys(e):e,o=We(t)?s?i=>Ne(t[i],t[e[i]]):e=>t[e]:()=>t;for(const a of n)i[a]=js(o(a));return i}function $s(t){return Us(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Hs(t){return Us(t,["topLeft","topRight","bottomLeft","bottomRight"])}function qs(t){const e=$s(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Xs(t,e){t=t||{},e=e||vs.font;let i=Ne(t.size,e.size);"string"===typeof i&&(i=parseInt(i,10));let s=Ne(t.style,e.style);s&&!(""+s).match(Bs)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:Ne(t.family,e.family),lineHeight:Ns(Ne(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:Ne(t.weight,e.weight),string:""};return n.string=ks(n),n}function Ys(t,e,i,s){let n,o,a,r=!0;for(n=0,o=t.length;ni&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Qs(t,e){return Object.assign(Object.create(t),e)}function Gs(t,e=[""],i,s,n=()=>t[0]){const o=i||t;"undefined"===typeof s&&(s=fn("_fallback",t));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>Gs([i,...t],e,o,s)};return new Proxy(a,{deleteProperty(e,i){return delete e[i],delete e._keys,delete t[0][i],!0},get(i,s){return sn(i,s,()=>gn(s,e,t,i))},getOwnPropertyDescriptor(t,e){return Reflect.getOwnPropertyDescriptor(t._scopes[0],e)},getPrototypeOf(){return Reflect.getPrototypeOf(t[0])},has(t,e){return pn(t).includes(e)},ownKeys(t){return pn(t)},set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function Js(t,e,i,s){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Zs(t,s),setContext:e=>Js(t,e,i,s),override:n=>Js(t.override(n),e,i,s)};return new Proxy(n,{deleteProperty(e,i){return delete e[i],delete t[i],!0},get(t,e,i){return sn(t,e,()=>nn(t,e,i))},getOwnPropertyDescriptor(e,i){return e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i)},getPrototypeOf(){return Reflect.getPrototypeOf(t)},has(e,i){return Reflect.has(t,i)},ownKeys(){return Reflect.ownKeys(t)},set(e,i,s){return t[i]=s,delete e[i],!0}})}function Zs(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:oi(i)?i:()=>i,isIndexable:oi(s)?s:()=>s}}const tn=(t,e)=>t?t+si(e):e,en=(t,e)=>We(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function sn(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const s=i();return t[e]=s,s}function nn(t,e,i){const{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=t;let r=s[e];return oi(r)&&a.isScriptable(e)&&(r=on(e,r,t,i)),Re(r)&&r.length&&(r=an(e,r,t,a.isIndexable)),en(e,r)&&(r=Js(r,n,o&&o[e],a)),r}function on(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);let l=e(o,a||s);return r.delete(t),en(t,l)&&(l=cn(n._scopes,n,t,l)),l}function an(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=i;if("undefined"!==typeof o.index&&s(t))return e[o.index%e.length];if(We(e[0])){const i=e,s=n._scopes.filter(t=>t!==i);e=[];for(const l of i){const i=cn(s,n,t,l);e.push(Js(i,o,a&&a[t],r))}}return e}function rn(t,e,i){return oi(t)?t(e,i):t}const ln=(t,e)=>!0===t?e:"string"===typeof t?ii(e,t):void 0;function hn(t,e,i,s,n){for(const o of e){const e=ln(i,o);if(e){t.add(e);const o=rn(e._fallback,i,n);if("undefined"!==typeof o&&o!==i&&o!==s)return o}else if(!1===e&&"undefined"!==typeof s&&i!==s)return null}return!1}function cn(t,e,i,s){const n=e._rootScopes,o=rn(e._fallback,i,s),a=[...t,...n],r=new Set;r.add(s);let l=dn(r,a,i,o||i,s);return null!==l&&(("undefined"===typeof o||o===i||(l=dn(r,a,o,l,s),null!==l))&&Gs(Array.from(r),[""],n,o,()=>un(e,i,s)))}function dn(t,e,i,s,n){while(i)i=hn(t,e,i,s,n);return i}function un(t,e,i){const s=t._getTarget();e in s||(s[e]={});const n=s[e];return Re(n)&&We(i)?i:n||{}}function gn(t,e,i,s){let n;for(const o of e)if(n=fn(tn(o,t),i),"undefined"!==typeof n)return en(t,n)?cn(i,s,t,n):n}function fn(t,e){for(const i of e){if(!i)continue;const e=i[t];if("undefined"!==typeof e)return e}}function pn(t){let e=t._keys;return e||(e=t._keys=mn(t._scopes)),e}function mn(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)}function bn(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function vn(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=Ti(o,n),l=Ti(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 kn(t,e,i){const s=t.length;let n,o,a,r,l,h=yn(t,0);for(let c=0;c!t.skip)),"monotone"===e.cubicInterpolationMode)Sn(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;ot.ownerDocument.defaultView.getComputedStyle(t,null);function Dn(t,e){return Ln(t).getPropertyValue(e)}const In=["top","right","bottom","left"];function Vn(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=In[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const En=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function On(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(En(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}function Rn(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=Ln(i),o="border-box"===n.boxSizing,a=Vn(n,"padding"),r=Vn(n,"border","width"),{x:l,y:h,box:c}=On(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:g,height:f}=e;return o&&(g-=a.width+r.width,f-=a.height+r.height),{x:Math.round((l-d)/g*i.width/s),y:Math.round((h-u)/f*i.height/s)}}function Wn(t,e,i){let s,n;if(void 0===e||void 0===i){const o=t&&Tn(t);if(o){const t=o.getBoundingClientRect(),a=Ln(o),r=Vn(a,"border","width"),l=Vn(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=An(a.maxWidth,o,"clientWidth"),n=An(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||di,maxHeight:n||di}}const zn=t=>Math.round(10*t)/10;function Bn(t,e,i,s){const n=Ln(t),o=Vn(n,"margin"),a=An(n.maxWidth,t,"clientWidth")||di,r=An(n.maxHeight,t,"clientHeight")||di,l=Wn(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=Vn(n,"border","width"),e=Vn(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=zn(Math.min(h,a,l.maxWidth)),c=zn(Math.min(c,r,l.maxHeight)),h&&!c&&(c=zn(h/2));const d=void 0!==e||void 0!==i;return d&&s&&l.height&&c>l.height&&(c=l.height,h=zn(Math.floor(c*s))),{width:h,height:c}}function Nn(t,e,i){const s=e||1,n=zn(t.height*s),o=zn(t.width*s);t.height=zn(t.height),t.width=zn(t.width);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 jn=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};Pn()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(e){}return t}();function Un(t,e){const i=Dn(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function $n(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Hn(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 qn(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=$n(t,n,i),r=$n(n,o,i),l=$n(o,e,i),h=$n(a,r,i),c=$n(r,l,i);return $n(h,c,i)}const Xn=function(t,e){return{x(i){return t+t+e-i},setWidth(t){e=t},textAlign(t){return"center"===t?t:"right"===t?"left":"right"},xPlus(t,e){return t-e},leftForLtr(t,e){return t-e}}},Yn=function(){return{x(t){return t},setWidth(t){},textAlign(t){return t},xPlus(t,e){return t+e},leftForLtr(t,e){return t}}};function Kn(t,e,i){return t?Xn(e,i):Yn()}function Qn(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 Gn(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Jn(t){return"angle"===t?{between:Di,compare:Ai,normalize:Li}:{between:Ei,compare:(t,e)=>t-e,normalize:t=>t}}function Zn({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 to(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Jn(s),l=e.length;let h,c,{start:d,end:u,loop:g}=t;if(g){for(d+=l,u+=l,h=0,c=l;hl(n,b,p)&&0!==r(n,b),v=()=>0===r(o,p)||l(o,b,p),k=()=>x||_(),w=()=>!x||v();for(let S=c,M=c;S<=d;++S)m=e[S%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===y&&k()&&(y=0===r(p,n)?S:M),null!==y&&w()&&(f.push(Zn({start:y,end:S,loop:u,count:a,style:g})),y=null),M=S,b=p));return null!==y&&f.push(Zn({start:y,end:d,loop:u,count:a,style:g})),f}function io(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip)o--;return o%=e,{start:n,end:o}}function no(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}function oo(t,e){const i=t.points,s=t.options.spanGaps,n=i.length;if(!n)return[];const o=!!t._loop,{start:a,end:r}=so(i,n,o,s);if(!0===s)return ao(t,[{start:a,end:r,loop:o}],i,e);const l=rs({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(i-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=$i.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 a,o=n.length-1,r=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>i.duration&&(i.duration=a._total),a.tick(t),r=!0):(n[o]=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)}}var fa=new ga;const pa="transparent",ma={boolean(t,e,i){return i>.5?e:t},color(t,e,i){const s=ss(t||pa),n=s.valid&&ss(e||pa);return n&&n.valid?n.mix(s,i).hexString():e},number(t,e,i){return t+(e-t)*i}};class ba{constructor(t,e,i,s){const n=e[i];s=Ys([t.to,s,n,t.from]);const a=Ys([t.from,n,s]);this._active=!0,this._fn=t.fn||ma[t.type||typeof a],this._easing=es[t.easing]||es.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=a,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,a=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Ys([t.to,e,s,t.from]),this._from=Ys([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,a=this._loop,o=this._to;let r;if(this._active=n!==o&&(a||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,o,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 s=0;s{const n=t[s];if(!We(n))return;const a={};for(const t of e)a[t]=n[t];(Re(n.properties)&&n.properties||[s]).forEach(t=>{t!==s&&i.has(t)||i.set(t,a)})})}_animateOptions(t,e){const i=e.options,s=_a(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&ya(t.options.$animations,i).then(()=>{t.options=i},()=>{}),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let r;for(r=a.length-1;r>=0;--r){const l=a[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,o);continue}c.cancel()}d&&d.duration?(n[l]=c=new ba(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?(fa.add(this._chart,i),!0):void 0}}function ya(t,e){const i=[],s=Object.keys(e);for(let n=0;n0||!i&&e<0)return n.index}return null}function Da(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:a,vScale:o,index:r}=s,l=a.axis,h=o.axis,c=Pa(a,o,s),d=e.length;let u;for(let g=0;gi[t].axis===e).shift()}function Va(t,e){return Qs(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Ea(t,e,i){return Qs(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}function Oa(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],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Ra=t=>"reset"===t||"none"===t,Wa=(t,e)=>e?t:Object.assign({},t),za=(t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Sa(i,!0),values:null};class Ba{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.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Fa(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Oa(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=Ne(i.xAxisID,Ia(t,"x")),a=e.yAxisID=Ne(i.yAxisID,Ia(t,"y")),o=e.rAxisID=Ne(i.rAxisID,Ia(t,"r")),r=e.indexAxis,l=e.iAxisID=s(r,n,a,o),h=e.vAxisID=s(r,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),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&&ji(this._data,this),t._stacked&&Oa(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(We(e)){const t=this._cachedMeta;this._data=Ca(e,t)}else if(i!==e){if(i){ji(i,this);const t=this._cachedMeta;Oa(t),t._parsed=[]}e&&Object.isExtensible(e)&&Ni(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=Fa(e.vScale,e),e.stack!==i.stack&&(s=!0,Oa(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&(Da(this,e._parsed),e._stacked=Fa(e.vScale,e))}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:a}=i,o=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=Re(s[t])?this.parseArrayData(i,s,t,e):We(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[o]||d&&l[o]e||c=0;--d)if(!g()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,a;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e),f=l.resolveNamedOptions(d,u,g,c);return f.$shared&&(f.$shared=r,n[a]=Object.freeze(Wa(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),a=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(a,this.getContext(t,i,e))}const l=new xa(s,r&&r.animations);return r&&r._cacheable&&(n[a]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ra(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),a=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:a}}updateElement(t,e,i,s){Ra(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ra(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[o,r,l]of this._syncList)this[o](r,l);this._syncList=[];const s=i.length,n=e.length,a=Math.min(n,s);a&&this.parse(0,a),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(r(n),o=t;ot-e))}return t._cache.$bar}function ja(t){const e=t.iScale,i=Na(e,t.type);let s,n,a,o,r=e._length;const l=()=>{32767!==a&&-32768!==a&&(ni(o)&&(r=Math.min(r,Math.abs(a-o)||r)),o=a)};for(s=0,n=i.length;s0?n[t-1]:null,r=tMath.abs(r)&&(l=r,h=o),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:a,min:o,max:r}}function qa(t,e,i,s){return Re(t)?Ha(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Xa(t,e,i,s){const n=t.iScale,a=t.vScale,o=n.getLabels(),r=n===a,l=[];let h,c,d,u;for(h=i,c=i+s;h=i?1:-1)}function Qa(t){let e,i,s,n,a;return t.horizontal?(e=t.base>t.x,i="left",s="right"):(e=t.baset.controller.options.grouped),n=i.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),r=o&&o[i.axis],l=t=>{const e=t._parsed.find(t=>t[i.axis]===r),s=e&&e[t.vScale.axis];if(Oe(s)||isNaN(s))return!0};for(const h of s)if((void 0===e||!l(h))&&((!1===n||-1===a.indexOf(h.stack)||void 0===n&&void 0===h.stack)&&a.push(h.stack),h.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(i=>t[i].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const i of this.chart.data.datasets)t[Ne("x"===this.chart.options.indexAxis?i.xAxisID:i.yAxisID,e)]=!0;return Object.keys(t)}_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,a;for(n=0,a=e.data.length;n=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,a=this.getParsed(t),o=s.getLabelForValue(a.x),r=n.getLabelForValue(a.y),l=a._custom;return{label:i[t]||"",value:"("+o+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=a.axis,c=o.axis;for(let d=e;dDi(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),f=(t,e,s)=>Di(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=g(0,h,d),m=g(gi,c,u),b=f(li,h,d),x=f(li+gi,c,u);s=(p-b)/2,n=(m-x)/2,a=-(p+b)/2,o=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:a,offsetY:o}}jt(so,"id","bubble"),jt(so,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),jt(so,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class ao extends Ba{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,a,o=t=>+i[t];if(We(i[t])){const{key:t="value"}=this._parsing;o=e=>+ii(i[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?hi*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ds(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,a,o,r;if(!t)for(s=0,n=i.data.datasets.length;s"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),jt(ao,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:i,textAlign:s,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,r)=>{const l=t.getDatasetMeta(0),h=l.controller.getStyle(r);return{text:e,fillStyle:h.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(r),lineDash:h.borderDash,lineDashOffset:h.borderDashOffset,lineJoin:h.borderJoinStyle,lineWidth:h.borderWidth,strokeStyle:h.borderColor,textAlign:s,pointStyle:i,borderRadius:a&&(o||h.borderRadius),index:r}}):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}});class oo extends Ba{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:r}=Qi(e,s,a);this._drawStart=o,this._drawCount=r,Gi(e)&&(o=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:!a,options:l},t),this.updateElements(s,o,r,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:a,vScale:o,_stacked:r,_dataset:l}=this._cachedMeta,{sharedOptions:h,includeOptions:c}=this._getSharedOptions(e,s),d=a.axis,u=o.axis,{spanGaps:g,segment:f}=this.options,p=ki(g)?g:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===s,b=e+i,x=t.length;let y=e>0&&this.getParsed(e-1);for(let _=0;_=b){g.skip=!0;continue}const x=this.getParsed(_),v=Oe(x[u]),k=g[d]=a.getPixelForValue(x[d],_),w=g[u]=n||v?o.getBasePixel():o.getPixelForValue(r?this.applyStack(o,x,r):x[u],_);g.skip=isNaN(k)||isNaN(w)||v,g.stop=_>0&&Math.abs(x[d]-y[d])>p,f&&(g.parsed=x,g.raw=l.data[_]),c&&(g.options=h||this.resolveDataElementOptions(_,i.active?"active":s)),m||this.updateElement(i,_,g,s),y=x}}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)),a=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}jt(oo,"id","line"),jt(oo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),jt(oo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class ro extends Ba{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=ds(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return bn.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))}),e}_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),a=Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,a=this.chart,o=a.options,r=o.animation,l=this._cachedMeta.rScale,h=l.xCenter,c=l.yCenter,d=l.getIndexAngle(0)-.5*li;let u,g=d;const f=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?Mi(this.resolveDataElementOptions(t,e).angle||i):0}}jt(ro,"id","polarArea"),jt(ro,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),jt(ro,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map((e,n)=>{const a=t.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class lo extends ao{}jt(lo,"id","pie"),jt(lo,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class ho extends Ba{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return bn.bind(this)(t,e,i,s)}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 a={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,a,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,a="reset"===s;for(let o=e;o0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(i[u]-x[u])>m,p&&(h.parsed=i,h.raw=l.data[y]),d&&(h.options=c||this.resolveDataElementOptions(y,e.active?"active":s)),b||this.updateElement(e,y,h,s),x=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,a)/2}}jt(co,"id","scatter"),jt(co,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),jt(co,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function uo(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class go{static override(t){Object.assign(go.prototype,t)}constructor(t){jt(this,"options",void 0),this.options=t||{}}init(){}formats(){return uo()}parse(){return uo()}format(){return uo()}add(){return uo()}diff(){return uo()}startOf(){return uo()}endOf(){return uo()}}var fo={_date:go};function po(t,e,i,s){const{controller:n,data:a,_sorted:o}=t,r=n._cachedMeta.iScale,l=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(r&&e===r.axis&&"r"!==e&&o&&a.length){const o=r._reversePixels?Wi:Ri;if(!s){const s=o(a,e,i);if(l){const{vScale:e}=n._cachedMeta,{_parsed:i}=t,a=i.slice(0,s.lo+1).reverse().findIndex(t=>!Oe(t[e.axis]));s.lo-=Math.max(0,a);const o=i.slice(s.hi).findIndex(t=>!Oe(t[e.axis]));s.hi+=Math.max(0,o)}return s}if(n._sharedOptions){const t=a[0],s="function"===typeof t.getRange&&t.getRange(e);if(s){const t=o(a,e,i-s),n=o(a,e,i+s);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function mo(t,e,i,s,n){const a=t.getSortedVisibleDatasetMetas(),o=i[e];for(let r=0,l=a.length;r{t[o]&&t[o](e[i],n)&&(a.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))}),s&&!r?[]:a}var wo={evaluateInteractionItems:mo,modes:{index(t,e,i,s){const n=Rn(e,t),a=i.axis||"x",o=i.includeInvisible||!1,r=i.intersect?xo(t,n,a,s,o):vo(t,n,a,!1,s,o),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})}),l):[]},dataset(t,e,i,s){const n=Rn(e,t),a=i.axis||"xy",o=i.includeInvisible||!1;let r=i.intersect?xo(t,n,a,s,o):vo(t,n,a,!1,s,o);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tt.pos===e)}function Co(t,e){return t.filter(t=>-1===So.indexOf(t.pos)&&t.box.axis===e)}function Fo(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 Po(t){const e=[];let i,s,n,a,o,r;for(i=0,s=(t||[]).length;it.box.fullSize),!0),s=Fo(Mo(e,"left"),!0),n=Fo(Mo(e,"right")),a=Fo(Mo(e,"top"),!0),o=Fo(Mo(e,"bottom")),r=Co(e,"x"),l=Co(e,"y");return{fullSize:i,leftAndTop:s.concat(a),rightAndBottom:n.concat(l).concat(o).concat(r),chartArea:Mo(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:a.concat(o).concat(r)}}function Do(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function Io(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 Vo(t,e,i,s){const{pos:n,box:a}=i,o=t.maxPadding;if(!We(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?a.height:a.width),i.size=e.size/e.count,t[n]+=i.size}a.getPadding&&Io(o,a.getPadding());const r=Math.max(0,e.outerWidth-Do(o,t,"left","right")),l=Math.max(0,e.outerHeight-Do(o,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 Eo(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")}function Oo(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 Ro(t,e,i,s){const n=[];let a,o,r,l,h,c;for(a=0,o=t.length,h=0;a{"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:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);Io(u,qs(s));const g=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),f=Ao(l.concat(h),d);Ro(r.fullSize,g,d,f),Ro(l,g,d,f),Ro(h,g,d,f)&&Ro(l,g,d,f),Eo(g),zo(r.leftAndTop,g,d,f),g.x+=g.w,g.y+=g.h,zo(r.rightAndBottom,g,d,f),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},He(r.chartArea,e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})})}};class No{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 jo extends No{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Uo="$chartjs",$o={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Ho=t=>null===t||""===t;function qo(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[Uo]={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",Ho(n)){const e=Un(t,"width");void 0!==e&&(t.width=e)}if(Ho(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Un(t,"height");void 0!==e&&(t.height=e)}return t}const Xo=!!jn&&{passive:!0};function Yo(t,e,i){t&&t.addEventListener(e,i,Xo)}function Ko(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,Xo)}function Qo(t,e){const i=$o[t.type]||t.type,{x:s,y:n}=Rn(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}function Go(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Jo(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Go(i.addedNodes,s),e=e&&!Go(i.removedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}function Zo(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Go(i.removedNodes,s),e=e&&!Go(i.addedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}const tr=new Map;let er=0;function ir(){const t=window.devicePixelRatio;t!==er&&(er=t,tr.forEach((e,i)=>{i.currentDevicePixelRatio!==t&&e()}))}function sr(t,e){tr.size||window.addEventListener("resize",ir),tr.set(t,e)}function nr(t){tr.delete(t),tr.size||window.removeEventListener("resize",ir)}function ar(t,e,i){const s=t.canvas,n=s&&Tn(s);if(!n)return;const a=Hi((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||a(i,s)});return o.observe(n),sr(t,a),o}function or(t,e,i){i&&i.disconnect(),"resize"===e&&nr(t)}function rr(t,e,i){const s=t.canvas,n=Hi(e=>{null!==t.ctx&&i(Qo(e,t))},t);return Yo(s,e,n),n}class lr extends No{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(qo(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[Uo])return!1;const i=e[Uo].initial;["height","width"].forEach(t=>{const s=i[t];Oe(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[Uo],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Jo,detach:Zo,resize:ar},a=n[e]||rr;s[e]=a(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;const n={attach:or,detach:or,resize:or},a=n[e]||Ko;a(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Bn(t,e,i,s)}isAttached(t){const e=t&&Tn(t);return!(!e||!e.isConnected)}}function hr(t){return!Pn()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?jo:lr}class cr{constructor(){jt(this,"x",void 0),jt(this,"y",void 0),jt(this,"active",!1),jt(this,"options",void 0),jt(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return ki(this.x)&&ki(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}}function dr(t,e){const i=t.options.ticks,s=ur(t),n=Math.min(i.maxTicksLimit||s,s),a=i.major.enabled?fr(e):[],o=a.length,r=a[0],l=a[o-1],h=[];if(o>n)return pr(e,h,a,o/n),h;const c=gr(a,e,n);if(o>0){let t,i;const s=o>1?Math.round((l-r)/(o-1)):null;for(mr(e,h,c,Oe(s)?0:r-s,r),t=0,i=o-1;tn)return t}return Math.max(n,1)}function fr(t){const e=[];let i,s;for(i=0,s=t.length;i"left"===t?"right":"right"===t?"left":t,yr=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,_r=(t,e)=>Math.min(e||t,t);function vr(t,e){const i=[],s=t.length/e,n=t.length;let a=0;for(;ao+r)))return h}function wr(t,e){He(t,t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;ns?s:i,s=n&&i>s?i:s,{min:Be(i,Be(s,i)),max:Be(s,Be(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||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){$e(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:a}=this.options,o=a.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=Ks(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=o=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=Ii(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/i:u/(i-1),c+6>a&&(a=u/(i-(t.offset?.5:1)),o=this.maxHeight-Sr(t.grid)-e.padding-Mr(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Ci(Math.min(Math.asin(Ii((h.highest.height+6)/a,-1,1)),Math.asin(Ii(o/r,-1,1))-Math.asin(Ii(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){$e(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$e(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=Mr(s,e.options.font);if(o?(t.width=this.maxWidth,t.height=Sr(n)+a):(t.height=this.maxHeight,t.width=Sr(n)+a),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:a}=this._getLabelSizes(),r=2*i.padding,l=Mi(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(o){const e=i.mirror?0:c*n.width+h*a.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*a.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),o?(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:a},position:o}=this.options,r=0!==this.labelRotation,l="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=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:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-h+a)*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+a,this.paddingBottom=s+a}}_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(){$e(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({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(v),highest:w(k),widths:a,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 Vi(this._alignToPixels?Ms(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&&to*s?o/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:o}=s,r=n.offset,l=this.isHorizontal(),h=this.ticks,c=h.length+(r?1:0),d=Sr(n),u=[],g=o.setContext(this.getContext()),f=g.display?g.width:0,p=f/2,m=function(t){return Ms(i,t,f)};let b,x,y,_,v,k,w,S,M,C,F,P;if("top"===a)b=m(this.bottom),k=this.bottom-d,S=b-p,C=m(t.top)+p,P=t.bottom;else if("bottom"===a)b=m(this.top),C=t.top,P=m(t.bottom)-p,k=b+p,S=this.top+d;else if("left"===a)b=m(this.right),v=this.right-d,w=b-p,M=m(t.left)+p,F=t.right;else if("right"===a)b=m(this.left),M=t.left,F=m(t.right)-p,v=b+p,w=this.left+d;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(We(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}C=t.top,P=t.bottom,k=b+p,S=k+d}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(We(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}v=b-p,w=v-d,M=t.left,F=t.right}const T=Ne(s.ticks.maxTicksLimit,c),A=Math.max(1,Math.ceil(c/T));for(x=0;x0&&(a-=s/2);break}d={left:a,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}p.push({label:y,font:S,textOffset:F,options:{rotation:f,color:i,strokeColor:r,strokeWidth:h,textAlign:u,textBaseline:P,translation:[_,v],backdrop:d}})}return p}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,i=-Mi(this.labelRotation);if(i)return"top"===t?"left":"right";let s="center";return"start"===e.align?s="left":"end"===e.align?s="right":"inner"===e.align&&(s="inner"),s}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,r=a.widest.width;let l,h;return"left"===e?s?(h=this.right+n,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h+=r)):(h=this.right-o,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h=this.left)):"right"===e?s?(h=this.left+n,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h-=r)):(h=this.left+o,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h=this.right)):l="right",{textAlign:l,x:h}}_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:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks,s=i.findIndex(e=>e.value===t);if(s>=0){const t=e.setContext(this.getContext(s));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(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,a=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,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,a;for(n=0,a=e.length;n{const s=i.split("."),n=s.pop(),a=[t].concat(s).join("."),o=e[i].split("."),r=o.pop(),l=o.join(".");vs.route(a,n,l,r)})}function Vr(t){return"id"in t&&"defaults"in t}class Er{constructor(){this.controllers=new Lr(Ba,"datasets",!0),this.elements=new Lr(cr,"elements"),this.plugins=new Lr(Object,"plugins"),this.scales=new Lr(Ar,"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):He(e,e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)})})}_exec(t,e,i){const s=si(t);$e(i["before"+s],[],i),e[t](i),$e(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.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 Wr(t){const e={},i=[],s=Object.keys(Or.plugins.items);for(let a=0;a1&&Hr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Yr(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function Kr(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(i.length)return Yr(t,"x",i[0])||Yr(t,"y",i[0])}return{}}function Qr(t,e){const i=ms[t.type]||{scales:{}},s=e.scales||{},n=jr(t.type,e),a=Object.create(null);return Object.keys(s).forEach(e=>{const o=s[e];if(!We(o))return console.error(`Invalid scale configuration for scale: ${e}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const r=Xr(e,o,Kr(e,t),vs.scales[o.type]),l=$r(r,n),h=i.scales||{};a[e]=Ge(Object.create(null),[{axis:r},o,h[r],h[l]])}),t.data.datasets.forEach(i=>{const n=i.type||t.type,o=i.indexAxis||jr(n,e),r=ms[n]||{},l=r.scales||{};Object.keys(l).forEach(t=>{const e=Ur(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Ge(a[n],[{axis:e},s[n],l[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Ge(e,[vs.scales[e.type],vs.scale])}),a}function Gr(t){const e=t.options||(t.options={});e.plugins=Ne(e.plugins,{}),e.scales=Qr(t,e)}function Jr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Zr(t){return t=t||{},t.data=Jr(t.data),Gr(t),t}const tl=new Map,el=new Set;function il(t,e){let i=tl.get(t);return i||(i=e(),tl.set(t,i),el.add(i)),i}const sl=(t,e,i)=>{const s=ii(e,i);void 0!==s&&t.add(s)};class nl{constructor(t){this._config=Zr(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=Jr(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(),Gr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return il(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return il(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return il(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,i=this.type;return il(`${i}-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,a=this._cachedScopes(t,i),o=a.get(e);if(o)return o;const r=new Set;e.forEach(e=>{t&&(r.add(t),e.forEach(e=>sl(r,t,e))),e.forEach(t=>sl(r,s,t)),e.forEach(t=>sl(r,ms[n]||{},t)),e.forEach(t=>sl(r,vs,t)),e.forEach(t=>sl(r,bs,t))});const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),el.has(e)&&a.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,ms[e]||{},vs.datasets[e]||{},{type:e},vs,bs]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=al(this._resolverCache,t,s);let r=a;if(rl(a,e)){n.$shared=!1,i=ai(i)?i():i;const e=this.createResolver(t,i,o);r=Js(a,i,e)}for(const l of e)n[l]=r[l];return n}createResolver(t,e,i=[""],s){const{resolver:n}=al(this._resolverCache,t,i);return We(e)?Js(n,e,void 0,s):n}}function al(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let a=s.get(n);if(!a){const t=Gs(e,i);a={resolver:t,subPrefixes:i.filter(t=>!t.toLowerCase().includes("hover"))},s.set(n,a)}return a}const ol=t=>We(t)&&Object.getOwnPropertyNames(t).some(e=>ai(t[e]));function rl(t,e){const{isScriptable:i,isIndexable:s}=Zs(t);for(const n of e){const e=i(n),a=s(n),o=(a||e)&&t[n];if(e&&(ai(o)||ol(o))||a&&Re(o))return!0}return!1}var ll="4.5.1";const hl=["top","bottom","left","right","chartArea"];function cl(t,e){return"top"===t||"bottom"===t||-1===hl.indexOf(t)&&"x"===e}function dl(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function ul(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),$e(i&&i.onComplete,[t],e)}function gl(t){const e=t.chart,i=e.options.animation;$e(i&&i.onProgress,[t],e)}function fl(t){return Pn()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const pl={},ml=t=>{const e=fl(t);return Object.values(pl).filter(t=>t.canvas===e).pop()};function bl(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const a=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=a)}}}function xl(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}class yl{static register(...t){Or.add(...t),_l()}static unregister(...t){Or.remove(...t),_l()}constructor(t,e){const i=this.config=new nl(e),s=fl(t),n=ml(s);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||hr(s)),this.platform.updateConfig(i);const o=this.platform.acquireContext(s,a.aspectRatio),r=o&&o.canvas,l=r&&r.height,h=r&&r.width;this.id=Ee(),this.ctx=o,this.canvas=r,this.width=h,this.height=l,this._options=a,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 Rr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=qi(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],pl[this.id]=this,o&&r?(fa.listen(this,"complete",ul),fa.listen(this,"progress",gl),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 Oe(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}get registry(){return Or}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Nn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Cs(this.canvas,this.ctx),this}stop(){return fa.stop(this),this}resize(t,e){fa.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,a=this.platform.getMaximumSize(s,t,e,n),o=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Nn(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),$e(i.onResize,[this,a],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};He(e,(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=Xr(t,i),n="r"===s,a="x"===s;return{options:i,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),He(n,e=>{const n=e.options,a=n.id,o=Xr(a,n),r=Ne(n.type,e.dtype);void 0!==n.position&&cl(n.position,o)===cl(e.dposition)||(n.position=e.dposition),s[a]=!0;let l=null;if(a in i&&i[a].type===r)l=i[a];else{const t=Or.getScale(r);l=new t({id:a,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)}),He(s,(t,e)=>{t||delete i[e]}),He(i,t=>{Bo.configure(this,t,t.options),Bo.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;te.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{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 a=0;for(let l=0,h=this.data.datasets.length;l{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(dl("z","_idx"));const{_active:o,_lastEvent:r}=this;r?this._eventHandler(r,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){He(this.scales,t=>{Bo.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);oi(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){const e="_removeElements"===i?-n:n;bl(t,s,e)}}_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 n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Bo.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],He(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=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i={meta:t,index:t.index,cancelable:!0},s=ua(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",i)&&(s&&As(e,s),t.controller.draw(),s&&Ls(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Ts(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=wo.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=Qs(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){const i=this.getDatasetMeta(t);i.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),a=n.controller._resolveAnimations(void 0,s);ni(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),a.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(),fa.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};He(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 a;const o=()=>{s("attach",o),this.attached=!0,this.resize(),i("resize",n),i("detach",a)};a=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){He(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},He(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,a,o,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),o=0,r=t.length;o{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}}),s=!qe(i,e);s&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_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)),a=n(e,t),o=i?t:n(t,e);a.length&&this.updateHoverStyle(a,s.mode,!1),o.length&&s.mode&&this.updateHoverStyle(o,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},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,a=e,o=this._getActiveElements(t,s,i,a),r=ri(t),l=xl(t,this._lastEvent,i,r);i&&(this._lastEvent=null,$e(n.onHover,[t,o,this],this),r&&$e(n.onClick,[t,o,this],this));const h=!qe(o,s);return(h||e)&&(this._active=o,this._updateHoverStyles(o,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)}}function _l(){return He(yl.instances,t=>t._plugins.invalidate())}function vl(t,e,i){const{startAngle:s,x:n,y:a,outerRadius:o,innerRadius:r,options:l}=e,{borderWidth:h,borderJoinStyle:c}=l,d=Math.min(h/o,Li(s-i));if(t.beginPath(),t.arc(n,a,o-h/2,s+d/2,i-d/2),r>0){const e=Math.min(h/r,Li(s-i));t.arc(n,a,r+h/2,i-e/2,s+e/2,!0)}else{const e=Math.min(h/2,o*Li(s-i));if("round"===c)t.arc(n,a,e,i-li/2,s+li/2,!0);else if("bevel"===c){const o=2*e*e,r=-o*Math.cos(i+li/2)+n,l=-o*Math.sin(i+li/2)+a,h=o*Math.cos(s+li/2)+n,c=o*Math.sin(s+li/2)+a;t.lineTo(r,l),t.lineTo(h,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function kl(t,e,i){const{startAngle:s,pixelMargin:n,x:a,y:o,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(a,o,r,s-h,i+h),l>n?(h=n/l,t.arc(a,o,l,i+h,s-h,!0)):t.arc(a,o,n,i+gi,s-gi),t.closePath(),t.clip()}function wl(t){return Us(t,["outerStart","outerEnd","innerStart","innerEnd"])}function Sl(t,e,i,s){const n=wl(t.options.borderRadius),a=(i-e)/2,o=Math.min(a,s*e/2),r=t=>{const e=(i-Math.min(a,t))*s/2;return Ii(t,0,Math.min(a,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Ii(n.innerStart,0,o),innerEnd:Ii(n.innerEnd,0,o)}}function Ml(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Cl(t,e,i,s,n,a){const{x:o,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let g=0;const f=n-l;if(s){const t=c>0?c-s:0,e=d>0?d-s:0,i=(t+e)/2,n=0!==i?f*i/(i+s):f;g=(f-n)/2}const p=Math.max(.001,f*d-i/li)/d,m=(f-p)/2,b=l+m+g,x=n-m-g,{outerStart:y,outerEnd:_,innerStart:v,innerEnd:k}=Sl(e,u,d,x-b),w=d-y,S=d-_,M=b+y/w,C=x-_/S,F=u+v,P=u+k,T=b+v/F,A=x-k/P;if(t.beginPath(),a){const e=(M+C)/2;if(t.arc(o,r,d,M,e),t.arc(o,r,d,e,C),_>0){const e=Ml(S,C,o,r);t.arc(e.x,e.y,_,C,x+gi)}const i=Ml(P,x,o,r);if(t.lineTo(i.x,i.y),k>0){const e=Ml(P,A,o,r);t.arc(e.x,e.y,k,x+gi,A+Math.PI)}const s=(x-k/u+(b+v/u))/2;if(t.arc(o,r,u,x-k/u,s,!0),t.arc(o,r,u,s,b+v/u,!0),v>0){const e=Ml(F,T,o,r);t.arc(e.x,e.y,v,T+Math.PI,b-gi)}const n=Ml(w,b,o,r);if(t.lineTo(n.x,n.y),y>0){const e=Ml(w,M,o,r);t.arc(e.x,e.y,y,b-gi,M)}}else{t.moveTo(o,r);const e=Math.cos(M)*d+o,i=Math.sin(M)*d+r;t.lineTo(e,i);const s=Math.cos(C)*d+o,n=Math.sin(C)*d+r;t.lineTo(s,n)}t.closePath()}function Fl(t,e,i,s,n){const{fullCircles:a,startAngle:o,circumference:r}=e;let l=e.endAngle;if(a){Cl(t,e,i,s,l,n);for(let e=0;e=li&&0===g&&"miter"!==c&&vl(t,e,p),a||(Cl(t,e,i,s,p,n),t.stroke())}jt(yl,"defaults",vs),jt(yl,"instances",pl),jt(yl,"overrides",ms),jt(yl,"registry",Or),jt(yl,"version",ll),jt(yl,"getChart",ml);class Tl extends cr{constructor(t){super(),jt(this,"circumference",void 0),jt(this,"endAngle",void 0),jt(this,"fullCircles",void 0),jt(this,"innerRadius",void 0),jt(this,"outerRadius",void 0),jt(this,"pixelMargin",void 0),jt(this,"startAngle",void 0),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:a}=Pi(s,{x:t,y:e}),{startAngle:o,endAngle:r,innerRadius:l,outerRadius:h,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),d=(this.options.spacing+this.options.borderWidth)/2,u=Ne(c,r-o),g=Di(n,o,r)&&o!==r,f=u>=hi||g,p=Ei(a,l+d,h+d);return f&&p}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(a+o+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)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>hi?Math.floor(i/hi):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*s,Math.sin(o)*s);const r=1-Math.sin(Math.min(li,i||0)),l=s*r;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,Fl(t,this,l,n,a),Pl(t,this,l,n,a),t.restore()}}function Al(t,e,i=e){t.lineCap=Ne(i.borderCapStyle,e.borderCapStyle),t.setLineDash(Ne(i.borderDash,e.borderDash)),t.lineDashOffset=Ne(i.borderDashOffset,e.borderDashOffset),t.lineJoin=Ne(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Ne(i.borderWidth,e.borderWidth),t.strokeStyle=Ne(i.borderColor,e.borderColor)}function Ll(t,e,i){t.lineTo(i.x,i.y)}function Dl(t){return t.stepped?Ds:t.tension||"monotone"===t.cubicInterpolationMode?Is:Ll}function Il(t,e,i={}){const s=t.length,{start:n=0,end:a=s-1}=i,{start:o,end:r}=e,l=Math.max(n,o),h=Math.min(a,r),c=nr&&a>r;return{count:s,start:l,loop:e.loop,ilen:h(o+(h?r-t:t))%a,y=()=>{g!==f&&(t.lineTo(m,f),t.lineTo(m,g),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(if&&(f=i),m=(b*m+e)/++b):(y(),t.lineTo(e,i),u=s,b=0,g=f=i),p=i}y()}function Ol(t){const e=t.options,i=e.borderDash&&e.borderDash.length,s=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!i;return s?El:Vl}function Rl(t){return t.stepped?Hn:t.tension||"monotone"===t.cubicInterpolationMode?qn:$n}function Wl(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Al(t,e.options),t.stroke(n)}function zl(t,e,i,s){const{segments:n,options:a}=e,o=Ol(e);for(const r of n)Al(t,a,r.style),t.beginPath(),o(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}jt(Tl,"id","arc"),jt(Tl,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),jt(Tl,"defaultRoutes",{backgroundColor:"backgroundColor"}),jt(Tl,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Bl="function"===typeof Path2D;function Nl(t,e,i,s){Bl&&!e.options.segment?Wl(t,e,i,s):zl(t,e,i,s)}class jl extends cr{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;Fn(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=aa(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,a=ia(this,{property:e,start:s,end:s});if(!a.length)return;const o=[],r=Rl(i);let l,h;for(l=0,h=a.length;l"borderDash"!==t&&"fill"!==t});class $l extends cr{constructor(t){super(),jt(this,"parsed",void 0),jt(this,"skip",void 0),jt(this,"stop",void 0),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:a}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-a,2){let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}},ih=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class sh extends cr{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=$e(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=Xs(i.font),n=s.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:r}=eh(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(a,n,o,r)+10):(h=this.maxHeight,l=this._fitCols(a,s,o,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:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+o;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach((t,g)=>{const f=i+e/2+n.measureText(t.text).width;(0===g||l[l.length-1]+f+2*o>a)&&(c+=h,l[l.length-(g>0?0:1)]=0,u+=h,d++),r[g]={left:0,top:u,row:d,width:f,height:s},l[l.length-1]+=f+o}),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=a-t;let c=o,d=0,u=0,g=0,f=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:p,itemHeight:m}=nh(i,e,n,t,s);a>0&&u+m+2*o>h&&(c+=d+o,l.push({width:d,height:u}),g+=d+o,f++,d=u=0),r[a]={left:g,top:u,col:f,width:p,height:m},d=Math.max(d,p),u+=m+o}),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:n}}=this,a=Kn(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Yi(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,o=Yi(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=a.leftForLtr(a.x(o),r.width),o+=r.width+s}else{let n=0,o=Yi(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,o=Yi(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=o,r.left+=this.left+s,r.left=a.leftForLtr(a.x(r.left),r.width),o+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;As(t,this),this._draw(),Ls(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:a}=t,o=vs.color,r=Kn(t.rtl,this.left,this.width),l=Xs(a.font),{padding:h}=a,c=l.size,d=c/2;let u;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=l.string;const{boxWidth:g,boxHeight:f,itemHeight:p}=eh(a,c),m=function(t,e,i){if(isNaN(g)||g<=0||isNaN(f)||f<0)return;s.save();const n=Ne(i.lineWidth,1);if(s.fillStyle=Ne(i.fillStyle,o),s.lineCap=Ne(i.lineCap,"butt"),s.lineDashOffset=Ne(i.lineDashOffset,0),s.lineJoin=Ne(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=Ne(i.strokeStyle,o),s.setLineDash(Ne(i.lineDash,[])),a.usePointStyle){const o={radius:f*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2),h=e+d;Ps(s,o,l,h,a.pointStyleWidth&&g)}else{const a=e+Math.max((c-f)/2,0),o=r.leftForLtr(t,g),l=Hs(i.borderRadius);s.beginPath(),Object.values(l).some(t=>0!==t)?Ws(s,{x:o,y:a,w:g,h:f,radius:l}):s.rect(o,a,g,f),s.fill(),0!==n&&s.stroke()}s.restore()},b=function(t,e,i){Rs(s,i.text,t,e+p/2,l,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})},x=this.isHorizontal(),y=this._computeTitleHeight();u=x?{x:Yi(n,this.left+h,this.right-i[0]),y:this.top+h+y,line:0}:{x:this.left+h,y:Yi(n,this.top+y+h,this.bottom-e[0].height),line:0},Qn(this.ctx,t.textDirection);const _=p+h;this.legendItems.forEach((o,c)=>{s.strokeStyle=o.fontColor,s.fillStyle=o.fontColor;const f=s.measureText(o.text).width,p=r.textAlign(o.textAlign||(o.textAlign=a.textAlign)),v=g+d+f;let k=u.x,w=u.y;r.setWidth(this.width),x?c>0&&k+v+h>this.right&&(w=u.y+=_,u.line++,k=u.x=Yi(n,this.left+h,this.right-i[u.line])):c>0&&w+_>this.bottom&&(k=u.x=k+e[u.line].width+h,u.line++,w=u.y=Yi(n,this.top+y+h,this.bottom-e[u.line].height));const S=r.x(k);if(m(S,w,o),k=Ki(p,k+g+d,x?k+v:this.right,t.rtl),b(r.x(k),w,o),x)u.x+=v+h;else if("string"!==typeof o.text){const t=l.lineHeight;u.y+=rh(o,t)+h}else u.y+=_}),Gn(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Xs(e.font),s=qs(e.padding);if(!e.display)return;const n=Kn(t.rtl,this.left,this.width),a=this.ctx,o=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=Yi(t.align,c,this.right-d);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);h=l+Yi(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Yi(o,c,c+d);a.textAlign=n.textAlign(Xi(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=i.string,Rs(a,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Xs(t.font),i=qs(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Ei(t,this.left,this.right)&&Ei(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.length>e.length?t:e)),e+i.size/2+s.measureText(n).width}function oh(t,e,i){let s=t;return"string"!==typeof e.text&&(s=rh(e,i)),s}function rh(t,e){const i=t.text?t.text.length:0;return e*i}function lh(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var hh={id:"legend",_element:sh,start(t,e,i){const s=t.legend=new sh({ctx:t.ctx,options:i,chart:t});Bo.configure(t,s,i),Bo.addBox(t,s)},stop(t){Bo.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;Bo.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:a,useBorderRadius:o,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const l=t.controller.getStyle(i?0:void 0),h=qs(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:o&&(r||l.borderRadius),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)}}};new WeakMap;const ch={average(t){if(!t.length)return!1;let e,i,s=new Set,n=0,a=0;for(e=0,i=t.length;et+e)/s.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let i,s,n,a=e.x,o=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i-1?t.split("\n"):t}function gh(t,e){const{element:i,datasetIndex:s,index:n}=e,a=t.getDatasetMeta(s).controller,{label:o,value:r}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:a.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function fh(t,e){const i=t.chart.ctx,{body:s,footer:n,title:a}=t,{boxWidth:o,boxHeight:r}=e,l=Xs(e.bodyFont),h=Xs(e.titleFont),c=Xs(e.footerFont),d=a.length,u=n.length,g=s.length,f=qs(e.padding);let p=f.height,m=0,b=s.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(r,l.lineHeight):l.lineHeight;p+=g*t+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let x=0;const y=function(t){m=Math.max(m,i.measureText(t).width+x)};return i.save(),i.font=h.string,He(t.title,y),i.font=l.string,He(t.beforeBody.concat(t.afterBody),y),x=e.displayColors?o+2+e.boxPadding:0,He(s,t=>{He(t.before,y),He(t.lines,y),He(t.after,y)}),x=0,i.font=c.string,He(t.footer,y),i.restore(),m+=f.width,{width:m,height:p}}function ph(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}function mh(t,e,i,s){const{x:n,width:a}=s,o=i.caretSize+i.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function bh(t,e,i,s){const{x:n,width:a}=i,{width:o,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=a/2?h="left":n>=o-a/2&&(h="right"),mh(h,t,e,i)&&(h="center"),h}function xh(t,e,i){const s=i.yAlign||e.yAlign||ph(t,i);return{xAlign:i.xAlign||e.xAlign||bh(t,e,i,s),yAlign:s}}function yh(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}function _h(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}function vh(t,e,i,s){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:r,yAlign:l}=i,h=n+a,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:g}=Hs(o);let f=yh(e,r);const p=_h(e,l,h);return"center"===l?"left"===r?f+=h:"right"===r&&(f-=h):"left"===r?f-=Math.max(c,u)+n:"right"===r&&(f+=Math.max(d,g)+n),{x:Ii(f,0,s.width-e.width),y:Ii(p,0,s.height-e.height)}}function kh(t,e,i){const s=qs(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function wh(t){return dh([],uh(t))}function Sh(t,e,i){return Qs(t,{tooltip:e,tooltipItems:i,type:"tooltip"})}function Mh(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const Ch={beforeTitle:Ve,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{const e={before:[],lines:[],after:[]},n=Mh(i,t);dh(e.before,uh(Fh(n,"beforeLabel",this,t))),dh(e.lines,Fh(n,"label",this,t)),dh(e.after,uh(Fh(n,"afterLabel",this,t))),s.push(e)}),s}getAfterBody(t,e){return wh(Fh(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fh(i,"beforeFooter",this,t),n=Fh(i,"footer",this,t),a=Fh(i,"afterFooter",this,t);let o=[];return o=dh(o,uh(s)),o=dh(o,uh(n)),o=dh(o,uh(a)),o}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],a=[];let o,r,l=[];for(o=0,r=e.length;ot.filter(e,s,n,i))),t.itemSort&&(l=l.sort((e,s)=>t.itemSort(e,s,i))),He(l,e=>{const i=Mh(t.callbacks,e);s.push(Fh(i,"labelColor",this,e)),n.push(Fh(i,"labelPointStyle",this,e)),a.push(Fh(i,"labelTextColor",this,e))}),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,a=[];if(s.length){const t=ch[i.position].call(this,s,this._eventPosition);a=this._createItems(i),this.title=this.getTitle(a,i),this.beforeBody=this.getBeforeBody(a,i),this.body=this.getBody(a,i),this.afterBody=this.getAfterBody(a,i),this.footer=this.getFooter(a,i);const e=this._size=fh(this,i),o=Object.assign({},t,e),r=xh(this.chart,i,o),l=vh(i,o,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=a,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:a,cornerRadius:o}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=Hs(o),{x:d,y:u}=t,{width:g,height:f}=e;let p,m,b,x,y,_;return"center"===n?(y=u+f/2,"left"===s?(p=d,m=p-a,x=y+a,_=y-a):(p=d+g,m=p+a,x=y-a,_=y+a),b=p):(m="left"===s?d+Math.max(r,h)+a:"right"===s?d+g-Math.max(l,c)-a:this.caretX,"top"===n?(x=u,y=x-a,p=m-a,b=m+a):(x=u+f,y=x+a,p=m+a,b=m-a),_=x),{x1:p,x2:m,x3:b,y1:x,y2:y,y3:_}}drawTitle(t,e,i){const s=this.title,n=s.length;let a,o,r;if(n){const l=Kn(i.rtl,this.x,this.width);for(t.x=kh(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",a=Xs(i.titleFont),o=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,r=0;r0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Ws(t,{x:e,y:g,w:l,h:r,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Ws(t,{x:i,y:g+1,w:l-2,h:r-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,l,r),t.strokeRect(e,g,l,r),t.fillStyle=a.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:a,displayColors:o,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Xs(i.bodyFont);let d=c.lineHeight,u=0;const g=Kn(i.rtl,this.x,this.width),f=function(i){e.fillText(i,g.x(t.x+u),t.y+d/2),t.y+=d+n},p=g.textAlign(a);let m,b,x,y,_,v,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=kh(this,p,i),e.fillStyle=i.bodyColor,He(this.beforeBody,f),u=o&&"right"!==p?"center"===a?l/2+h:l+2+h:0,y=0,v=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=ch[t.position].call(this,this._active,this._eventPosition);if(!i)return;const a=this._size=fh(this,t),o=Object.assign({},i,this._size),r=xh(e,t,o),l=vh(t,o,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=a.width,this.height=a.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}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 a=qs(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Qn(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Gn(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=!qe(i,s),a=this._positionChanged(s,e);(n||a)&&(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||[],a=this._getActiveElements(t,n,e,i),o=this._positionChanged(a,t),r=e||!qe(a,n)||o;return r&&(this._active=a,(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.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));const a=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,a=ch[n.position].call(this,t,e);return!1!==a&&(i!==a.x||s!==a.y)}}jt(Ph,"positioners",ch);var Th={id:"tooltip",_element:Ph,positioners:ch,afterInit(t,e,i){i&&(t.tooltip=new Ph({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;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;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:Ch},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"]};const Ah=(t,e,i,s)=>("string"===typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i);function Lh(t,e,i,s){const n=t.indexOf(e);if(-1===n)return Ah(t,e,i,s);const a=t.lastIndexOf(e);return n!==a?i:n}const Dh=(t,e)=>null===t?null:Ii(Math.round(t),0,e);function Ih(t){const e=this.getLabels();return t>=0&&te.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 Eh(t,e){const i=[],s=1e-14,{bounds:n,step:a,min:o,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,g=a||1,f=c-1,{min:p,max:m}=e,b=!Oe(o),x=!Oe(r),y=!Oe(h),_=(m-p)/(d+1);let v,k,w,S,M=yi((m-p)/f/g)*g;if(Mf&&(M=yi(S*M/f/g)*g),Oe(l)||(v=Math.pow(10,l),M=Math.ceil(M*v)/v),"ticks"===n?(k=Math.floor(p/M)*M,w=Math.ceil(m/M)*M):(k=p,w=m),b&&x&&a&&wi((r-o)/a,M/1e3)?(S=Math.round(Math.min((r-o)/M,c)),M=(r-o)/S,k=o,w=r):y?(k=b?o:k,w=x?r:w,S=h-1,M=(w-k)/S):(S=(w-k)/M,S=xi(S,Math.round(S),M/1e3)?Math.round(S):Math.ceil(S));const C=Math.max(Fi(M),Fi(k));v=Math.pow(10,Oe(l)?C:l),k=Math.round(k*v)/v,w=Math.round(w*v)/v;let F=0;for(b&&(u&&k!==o?(i.push({value:o}),kr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&xi(i[i.length-1].value,r,Oh(r,_,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}function Oh(t,e,{horizontal:i,minRotation:s}){const n=Mi(s),a=(i?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}jt(Vh,"id","category"),jt(Vh,"defaults",{ticks:{callback:Ih}});class Rh extends Ar{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 Oe(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 a=t=>s=e?s:t,o=t=>n=i?n:t;if(t){const t=bi(s),e=bi(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(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={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},n=this._range||this,a=Eh(s,n);return"ticks"===t.bounds&&Si(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}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 ds(t,this.chart.options.locale,this.options.ticks.format)}}class Wh extends Rh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=ze(t)?t:0,this.max=ze(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=Mi(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}}jt(Wh,"id","linear"),jt(Wh,"defaults",{ticks:{callback:fs.formatters.numeric}});const zh=t=>Math.floor(mi(t)),Bh=(t,e)=>Math.pow(10,zh(t)+e);function Nh(t){const e=t/Math.pow(10,zh(t));return 1===e}function jh(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s),a=Math.ceil(e/s);return a-n}function Uh(t,e){const i=e-t;let s=zh(i);while(jh(t,e,s)>10)s++;while(jh(t,e,s)<10)s--;return Math.min(s,zh(t))}function $h(t,{min:e,max:i}){e=Be(t.min,e);const s=[],n=zh(e);let a=Uh(e,i),o=a<0?Math.pow(10,Math.abs(a)):1;const r=Math.pow(10,a),l=n>a?Math.pow(10,n):0,h=Math.round((e-l)*o)/o,c=Math.floor((e-l)/r/10)*r*10;let d=Math.floor((h-c)/Math.pow(10,a)),u=Be(t.min,Math.round((l+c+d*Math.pow(10,a))*o)/o);while(u=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),u=Math.round((l+c+d*Math.pow(10,a))*o)/o;const g=Be(t.max,u);return s.push({value:g,major:Nh(g),significand:d}),s}class Hh extends Ar{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Rh.prototype.parse.apply(this,[t,e]);if(0!==i)return ze(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=ze(t)?Math.max(0,t):null,this.max=ze(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!ze(this._userMin)&&(this.min=t===Bh(this.min,0)?Bh(this.min,-1):Bh(this.min,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,a=t=>s=e?s:t;i===s&&(i<=0?(n(1),a(10)):(n(Bh(i,-1)),a(Bh(s,1)))),i<=0&&n(Bh(s,-1)),s<=0&&a(Bh(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},i=$h(e,this);return"ticks"===t.bounds&&Si(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return void 0===t?"0":ds(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=mi(t),this._valueRange=mi(this.max)-mi(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(mi(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function qh(t){const e=t.ticks;if(e.display&&t.display){const t=qs(e.backdropPadding);return Ne(e.font&&e.font.size,vs.font.size)+t.height}return 0}function Xh(t,e,i){return i=Re(i)?i:[i],{w:Ss(t,e.string,i),h:i.length*e.lineHeight}}function Yh(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Kh(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=[],a=t._pointLabels.length,o=t.options.pointLabels,r=o.centerPointLabels?li/a:0;for(let l=0;le.r&&(r=(s.end-e.r)/a,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+l))}function Gh(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:r}=i,l=t.getPointPosition(e,s+n+o,a),h=Math.round(Ci(Li(l.angle+gi))),c=ic(l.y,r.h,h),d=tc(h),u=ec(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Jh(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:a}=t,o=Ts({x:i,y:s},e)||Ts({x:i,y:a},e)||Ts({x:n,y:s},e)||Ts({x:n,y:a},e);return!o}function Zh(t,e,i){const s=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:r}=a.pointLabels,l={extra:qh(a)/2,additionalAngle:o?li/n:0};let h;for(let c=0;c270||i<90)&&(t-=e),t}function sc(t,e,i){const{left:s,top:n,right:a,bottom:o}=i,{backdropColor:r}=e;if(!Oe(r)){const i=Hs(e.borderRadius),l=qs(e.backdropPadding);t.fillStyle=r;const h=s-l.left,c=n-l.top,d=a-s+l.width,u=o-n+l.height;Object.values(i).some(t=>0!==t)?(t.beginPath(),Ws(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function nc(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=s.setContext(t.getPointLabelContext(n));sc(i,a,e);const o=Xs(a.font),{x:r,y:l,textAlign:h}=e;Rs(i,t._pointLabels[n],r,l+o.lineHeight/2,o,{color:a.color,textAlign:h,textBaseline:"middle"})}}function ac(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,hi);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let a=1;a{const i=$e(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?Kh(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){const e=hi/(this._pointLabels.length||1),i=this.options.startAngle||0;return Li(t*e+Mi(i))}getDistanceFromCenterForValue(t){if(Oe(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(Oe(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{if(0!==e||0===e&&this.min<0){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),o=s.setContext(i),l=n.setContext(i);oc(this,o,r,a,l)}}),i.display){for(t.save(),o=a-1;o>=0;o--){const s=i.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=s;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),l=this.getPointPosition(o,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.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,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((s,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const r=i.setContext(this.getContext(o)),l=Xs(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),r.showLabelBackdrop){t.font=l.string,a=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=qs(r.backdropPadding);t.fillRect(-a/2-e.left,-n-l.size/2-e.top,a+e.width,l.size+e.height)}Rs(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})}),t.restore()}drawTitle(){}}jt(lc,"id","radialLinear"),jt(lc,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:fs.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),jt(lc,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),jt(lc,"descriptors",{angleLines:{_fallback:"grid"}});const hc={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}},cc=Object.keys(hc);function dc(t,e){return t-e}function uc(t,e){if(Oe(e))return null;const i=t._adapter,{parser:s,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof s&&(o=s(o)),ze(o)||(o="string"===typeof s?i.parse(o,s):i.parse(o)),null===o?null:(n&&(o="week"!==n||!ki(a)&&!0!==a?i.startOf(o,n):i.startOf(o,"isoWeek",a)),+o)}function gc(t,e,i,s){const n=cc.length;for(let a=cc.indexOf(t);a=cc.indexOf(i);a--){const i=cc[a];if(hc[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return cc[i?cc.indexOf(i):0]}function pc(t){for(let e=cc.indexOf(t)+1,i=cc.length;e=e?i[s]:i[n];t[a]=!0}}else t[e]=!0}function bc(t,e,i,s){const n=t._adapter,a=+n.startOf(e[0].value,s),o=e[e.length-1].value;let r,l;for(r=a;r<=o;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}function xc(t,e,i){const s=[],n={},a=e.length;let o,r;for(o=0;o+t.value))}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 a=t.length<3?.5:.25;s=Ii(s,0,a),n=Ii(n,0,a),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,a=n.unit||gc(n.minUnit,e,i,this._getLabelCapacity(e)),o=Ne(s.ticks.stepSize,1),r="week"===a&&n.isoWeekday,l=ki(r)||!0===r,h={};let c,d,u=e;if(l&&(u=+t.startOf(u,"isoWeek",r)),u=+t.startOf(u,l?"day":a),t.diff(i,e,a)>1e5*o)throw new Error(e+" and "+i+" are too far apart with stepSize of "+o+" "+a);const g="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;c+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)}format(t,e){const i=this.options,s=i.time.displayFormats,n=this._unit,a=e||s[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,i,s){const n=this.options,a=n.ticks.callback;if(a)return $e(a,[t,e,i],this);const o=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&o[r],c=l&&o[l],d=i[e],u=l&&c&&d&&d.major;return this._adapter.format(t,s||(u?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?o: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=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=Ri(t,"pos",e)),({pos:s,time:a}=t[r]),({pos:n,time:o}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=Ri(t,"time",e)),({time:s,pos:a}=t[r]),({time:n,pos:o}=t[l]));const h=n-s;return h?a+(o-a)*(e-s)/h:a}jt(yc,"id","time"),jt(yc,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class vc extends yc{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=_c(e,this.min),this._tableRange=_c(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let a,o,r,l,h;for(a=0,o=t.length;a=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(a=0,o=s.length;at-e)}_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(_c(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return _c(this._table,i*this._tableRange+this._minPos,!0)}}jt(vc,"id","timeseries"),jt(vc,"defaults",yc.defaults);var kc=i(144);const wc={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},Sc={ariaLabel:{type:String},ariaDescribedby:{type:String}},Mc={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...wc,...Sc},Cc="2"===s.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Fc(t){return(0,kc.ju)(t)?(0,kc.ux)(t):t}function Pc(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,kc.ju)(e)?new Proxy(t,{}):t}function Tc(t,e){const i=t.options;i&&e&&Object.assign(i,e)}function Ac(t,e){t.labels=e}function Lc(t,e,i){const s=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[i]===e[i]);return n&&e.data&&!s.includes(n)?(s.push(n),Object.assign(n,e),n):{...e}})}function Dc(t,e){const i={labels:[],datasets:[]};return Ac(i,t.labels),Lc(i,t.datasets,e),i}const Ic=(0,s.pM)({props:Mc,setup(t,e){let{expose:i,slots:n}=e;const a=(0,kc.KR)(null),o=(0,kc.IJ)(null);i({chart:o});const r=()=>{if(!a.value)return;const{type:e,data:i,options:s,plugins:n,datasetIdKey:r}=t,l=Dc(i,r),h=Pc(l,i);o.value=new yl(a.value,{type:e,data:h,options:{...s},plugins:n})},l=()=>{const e=(0,kc.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},h=e=>{e.update(t.updateMode)};return(0,s.sV)(r),(0,s.hi)(l),(0,s.wB)([()=>t.options,()=>t.data],(e,i)=>{let[n,a]=e,[r,l]=i;const c=(0,kc.ux)(o.value);if(!c)return;let d=!1;if(n){const t=Fc(n),e=Fc(r);t&&t!==e&&(Tc(c,t),d=!0)}if(a){const e=Fc(a.labels),i=Fc(l.labels),s=Fc(a.datasets),n=Fc(l.datasets);e!==i&&(Ac(c.config.data,e),d=!0),s&&s!==n&&(Lc(c.config.data,s,t.datasetIdKey),d=!0)}d&&(0,s.dY)(()=>{h(c)})},{deep:!0}),()=>(0,s.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,s.h)("p",{},[n.default?n.default():""])])}});function Vc(t,e){return yl.register(e),(0,s.pM)({props:wc,setup(e,i){let{expose:n}=i;const a=(0,kc.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,s.h)(Ic,Cc({ref:o},{type:t,...e}))}})}const Ec=Vc("doughnut",ao);yl.register(Tl,Th,hh);var Oc={name:"SysCogStatus",components:{Doughnut:Ec},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Wt.rE,loadErrors:{newest:!1,oldest:!1},channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"]}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.indexInfo.typeStats||{};return{labels:Object.keys(t).map(t=>t||"未知类型"),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{label:t=>{const e=t.raw,i=t.dataset.data.reduce((t,e)=>t+e,0),s=(e/i*100).toFixed(1);return` ${e.toLocaleString()} (${s}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},async fetchIndexInfo(){this.loading=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=info",{method:"GET"});if(!t.ok)throw new Error("API请求失败");{const e=await t.json();this.indexInfo=e}}catch(t){console.error("获取索引信息失败:",t),this.$message.error("获取索引信息失败")}finally{this.loading=!1}},async rebuildIndex(){this.rebuilding=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=rebuild",{method:"GET"});if(!t.ok)throw new Error("API请求失败");this.$message.success("索引重建已启动,请稍后刷新查看最新状态"),setTimeout(()=>{this.fetchIndexInfo()},3e3)}catch(t){console.error("重建索引失败:",t),this.$message.error("重建索引失败")}finally{this.rebuilding=!1}},async backupData(){this.backing=!0;try{const t=await(0,Rt.A)("/api/manage/sysConfig/backup?action=backup",{method:"GET"});if(!t.ok){const e=await t.json();throw new Error(e.error||"API请求失败")}{const e=await t.blob(),i=window.URL.createObjectURL(e),s=document.createElement("a");s.href=i,s.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(s),s.click(),document.body.removeChild(s),window.URL.revokeObjectURL(i),this.$message.success("备份文件已下载")}}catch(t){console.error("备份数据失败:",t),this.$message.error("备份数据失败: "+t.message)}finally{this.backing=!1}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm("恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","确认恢复",{confirmButtonText:"确定恢复",cancelButtonText:"取消",type:"warning"}),await this.restoreData(e)}catch(i){"cancel"!==i&&console.error("确认恢复失败:",i)}t.target.value=""}else this.$message.error("请选择JSON格式的备份文件")},async restoreData(t){this.restoring=!0;try{const e=await(0,Rt.A)("/api/manage/sysConfig/backup?action=restore",{method:"POST",headers:{"Content-Type":"application/json"},body:await t.text()});if(!e.ok){const t=await e.json();throw new Error(t.error||"API请求失败")}{const t=await e.json();this.$message.success(`恢复完成!已恢复 ${t.stats.restoredFiles} 个文件和 ${t.stats.restoredSettings} 个设置项`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}}catch(e){console.error("恢复数据失败:",e),this.$message.error("恢复数据失败: "+e.message)}finally{this.restoring=!1}},formatTime(t){if(!t)return"未知";const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),i=e-t,s=Math.floor(i/6e4),n=Math.floor(i/36e5),a=Math.floor(i/864e5);return a>0?`${a}天前`:n>0?`${n}小时前`:s>0?`${s}分钟前`:"刚刚"},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return s.includes(i)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return s.includes(i)}}};const Rc=(0,c.A)(Oc,[["render",Ot],["__scopeId","data-v-54756a6a"]]);var Wc=Rc,zc=i(9655),Bc=(i(2893),i(1418)),Nc=(i(333),i(9623)),jc=(i(6711),i(2006)),Uc=i(5558),$c=(i(8075),i(6810));i(4396),i(4885);const Hc={class:"upload-settings"},qc={class:"upload-channel"},Xc={class:"first-title"},Yc={class:"channel-settings"},Kc={class:"second-title"},Qc={key:0},Gc={key:1},Jc={class:"quota-status"},Zc={key:2},td={class:"quota-status"},ed={key:3},id={class:"discord-limit-tip"},sd={class:"actions"};function nd(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=f.R7,c=$c.ll,d=$c.MQ,u=Uc.qi,g=jc.xE,p=jc.US,m=Nc.WK,b=k.S2,x=Bc.lq,y=zc.ve,v=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Hc,[(0,s.Lk)("div",qc,[(0,s.Lk)("h3",Xc,[e[4]||(e[4]=(0,s.eW)("上传渠道 ",-1)),(0,s.bF)(h,{content:"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{modelValue:o.activeChannel,"onUpdate:modelValue":e[0]||(e[0]=t=>o.activeChannel=t)},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.channels,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.value},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])]),(0,s.Lk)("div",Yc,[(0,s.Lk)("h4",Kc,[(0,s.eW)((0,n.v_)(r.activeChannelLabel)+" 设置 ",1),"telegram"===o.activeChannel?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})):(0,s.Q3)("",!0)]),"telegram"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Qc,[(0,s.bF)(p,{model:o.telegramSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.telegramSettings.loadBalance.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>o.telegramSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.telegramSettings.channels,(t,e)=>((0,s.uX)(),(0,s.Wv)(p,{key:e,model:t,"label-position":"top",rules:o.tgRules,ref_for:!0,ref:"tgChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.chatId,"onUpdate:modelValue":e=>t.chatId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(e),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0),"cfr2"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Gc,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.cfr2Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(p,{model:t,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[5]||(e[5]=(0,s.eW)(" 公开访问链接 ",-1)),(0,s.bF)(h,{content:"若启用图像审查,请设置该项",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.publicUrl,"onUpdate:modelValue":e=>t.publicUrl=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[6]||(e[6]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[7]||(e[7]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[8]||(e[8]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:o.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Jc,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0)]),_:2},1032,["model"]))),256))])):(0,s.Q3)("",!0),"s3"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Zc,[(0,s.bF)(p,{model:o.s3Settings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.s3Settings.loadBalance.enabled,"onUpdate:modelValue":e[2]||(e[2]=t=>o.s3Settings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.s3Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(p,{model:t,"label-position":"top",rules:o.s3Rules,ref_for:!0,ref:"s3ChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{prop:"endpoint"},{label:(0,s.k6)(()=>[e[9]||(e[9]=(0,s.eW)(" Endpoint ",-1)),(0,s.bF)(h,{content:"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.endpoint,"onUpdate:modelValue":e=>t.endpoint=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"路径风格",prop:"pathStyle"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.pathStyle,"onUpdate:modelValue":e=>t.pathStyle=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.bucketName,"onUpdate:modelValue":e=>t.bucketName=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.region,"onUpdate:modelValue":e=>t.region=e,placeholder:"默认填写 auto 即可",disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.accessKeyId,"onUpdate:modelValue":e=>t.accessKeyId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.secretAccessKey,"onUpdate:modelValue":e=>t.secretAccessKey=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[10]||(e[10]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[11]||(e[11]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[12]||(e[12]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:o.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",td,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),256))])):(0,s.Q3)("",!0),"discord"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",ed,[(0,s.bF)(p,{model:o.discordSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.discordSettings.loadBalance.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>o.discordSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.discordSettings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(p,{key:i,model:t,"label-position":"top",rules:o.discordRules,ref_for:!0,ref:"discordChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.channelId,"onUpdate:modelValue":e=>t.channelId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[13]||(e[13]=(0,s.eW)(" 代理域名 ",-1)),(0,s.bF)(h,{content:"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.proxyUrl,"onUpdate:modelValue":e=>t.proxyUrl=e,placeholder:"例如: your-proxy.example.com"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",id,[(0,s.bF)(l,{icon:"info-circle",style:{"margin-right":"5px"}}),e[14]||(e[14]=(0,s.eW)(" Discord 免费用户单文件限制 10MB,超过将自动切换其他渠道 ",-1))])]),_:1}),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0)]),(0,s.Lk)("div",sd,[(0,s.bF)(b,{type:"primary",onClick:r.addChannel},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"plus"})]),_:1},8,["onClick"]),(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[15]||(e[15]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[v,o.loading]])}i(1148);var ad={data(){return{channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlareR2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"}],activeChannel:"telegram",telegramSettings:{loadBalance:{},channels:[]},tgRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.telegramSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Telegram_env"===e){const t=this.telegramSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{},channels:[]},discordSettings:{loadBalance:{},channels:[]},discordRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.discordSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Discord_env"===e){const t=this.discordSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",trigger:"blur"}]},quotaStats:{},quotaLoading:!1,s3Rules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.s3Settings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("S3_env"===e){const t=this.s3Settings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],endpoint:[{required:!0,message:"请输入 Endpoint",trigger:"blur"}],bucketName:[{required:!0,message:"请输入存储桶名称",trigger:"blur"}],region:[{required:!0,message:"请输入存储桶区域",trigger:"blur"}],accessKeyId:[{required:!0,message:"请输入访问密钥 ID",trigger:"blur"}],secretAccessKey:[{required:!0,message:"请输入机密访问密钥",trigger:"blur"}]},loading:!1}},computed:{activeChannelLabel(){const t=this.channels.find(t=>t.value===this.activeChannel);return t?t.label:""}},methods:{addChannel(){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.push({id:this.telegramSettings.channels.length+1,name:"",type:"telegram",savePath:"database",botToken:"",chatId:"",enabled:!0,fixed:!1});break;case"cfr2":this.$message.error("R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加");break;case"s3":this.s3Settings.channels.push({id:this.s3Settings.channels.length+1,name:"",type:"s3",savePath:"database",accessKeyId:"",secretAccessKey:"",region:"",bucketName:"",endpoint:"",pathStyle:!1,enabled:!0,fixed:!1,quota:{enabled:!1,limitGB:10,threshold:95}});break;case"discord":this.discordSettings.channels.push({id:this.discordSettings.channels.length+1,name:"",type:"discord",savePath:"database",botToken:"",channelId:"",proxyUrl:"",enabled:!0,fixed:!1});break}},deleteChannel(t){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.telegramSettings.channels.splice(t,1);break;case"cfr2":this.cfr2Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.cfr2Settings.channels.splice(t,1);break;case"s3":this.s3Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.s3Settings.channels.splice(t,1);break;case"discord":this.discordSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.discordSettings.channels.splice(t,1);break}},saveSettings(){let t=[];this.$refs.tgChannelForm&&this.$refs.tgChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.s3ChannelForm&&this.$refs.s3ChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.discordChannelForm&&this.$refs.discordChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings};(0,Rt.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存")})})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10,s=e/i*100;return Math.min(100,Math.round(10*s)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${i} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?`⚠️ 已达到容量阈值 (${i}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm("首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","初始化容量统计",{confirmButtonText:"立即统计",cancelButtonText:"稍后手动统计",type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info("您可以稍后点击刷新按钮手动统计")})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info("正在统计容量,请稍候...");const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success("容量统计完成")):this.$message.error("统计失败: "+(e.error||"未知错误"))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error("统计失败")}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const od=(0,c.A)(ad,[["render",nd],["__scopeId","data-v-1385d456"]]);var rd=od,ld=i(9267),hd=(i(5616),i(850)),cd=(i(8736),i(6018)),dd=(i(6808),i(200),i(7138)),ud=(i(5802),i(2687)),gd=(i(8785),i(4752),i(5130));const fd={class:"security-settings"},pd={class:"first-settings"},md={class:"second-title token-title"},bd={class:"token-actions"},xd={class:"token-table-container"},yd={class:"table-cell-content"},_d={class:"table-cell-content"},vd={class:"token-display"},kd={class:"table-cell-content"},wd={class:"table-cell-content"},Sd={class:"table-cell-content action-buttons"},Md={class:"first-settings"},Cd={class:"second-title"},Fd={class:"first-settings"},Pd={class:"actions"},Td={class:"dialog-footer"},Ad={class:"dialog-footer"},Ld={class:"token-result"},Dd={style:{"margin-bottom":"15px",color:"#e6a23c"}},Id={class:"dialog-footer"};function Vd(t,e,i,a,o,r){const l=Nc.WK,h=jc.xE,c=jc.US,d=(0,s.g2)("font-awesome-icon"),u=k.S2,g=dd.o8,p=ud.u,m=dd.Up,b=f.R7,x=Uc.qi,y=cd.P9,v=cd.AV,w=hd.dI,S=hd.o5,M=ld.kZ,C=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",fd,[(0,s.Lk)("div",pd,[e[26]||(e[26]=(0,s.Lk)("h3",{class:"first-title"},"认证管理",-1)),e[27]||(e[27]=(0,s.Lk)("h4",{class:"second-title"},"用户端认证",-1)),(0,s.bF)(c,{model:o.authSettings.user,rules:o.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"上传密码",prop:"authCode"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:r.handleUserPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(gd.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[o.showUserPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),e[28]||(e[28]=(0,s.Lk)("h4",{class:"second-title"},"管理端认证",-1)),(0,s.bF)(c,{model:o.authSettings.admin,rules:o.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"用户名",prop:"adminUsername"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"密码",prop:"adminPassword"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:r.handleAdminPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(gd.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[o.showAdminPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,s.Lk)("h4",md,[e[23]||(e[23]=(0,s.eW)("API Token 管理 ",-1)),(0,s.Lk)("a",bd,[(0,s.bF)(u,{type:"primary",size:"small",onClick:e[5]||(e[5]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"plus"})]),_:1})])]),(0,s.Lk)("div",xd,[(0,s.bo)(((0,s.uX)(),(0,s.Wv)(m,{data:o.apiTokens,class:"token-table"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{prop:"name",label:"名称","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",yd,(0,n.v_)(t.row.name),1)]),_:1}),(0,s.bF)(g,{prop:"token",label:"Token","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",_d,[(0,s.Lk)("span",vd,(0,n.v_)(t.row.token),1)])]),_:1}),(0,s.bF)(g,{prop:"permissions",label:"权限","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",kd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.row.permissions,t=>((0,s.uX)(),(0,s.Wv)(p,{key:t,size:"small",class:"permission-tag"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1}),(0,s.bF)(g,{prop:"createdAt",label:"创建时间","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",wd,(0,n.v_)(r.formatDate(t.row.createdAt)),1)]),_:1}),(0,s.bF)(g,{label:"操作",fixed:"right","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",Sd,[(0,s.bF)(u,{class:"action-button",size:"small",onClick:e=>r.editToken(t.row)},{default:(0,s.k6)(()=>[...e[24]||(e[24]=[(0,s.eW)("编辑",-1)])]),_:1},8,["onClick"]),(0,s.bF)(u,{class:"action-button",size:"small",type:"danger",onClick:e=>r.deleteToken(t.row.id)},{default:(0,s.k6)(()=>[...e[25]||(e[25]=[(0,s.eW)("删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data"])),[[C,o.tokenLoading]])])]),(0,s.Lk)("div",Md,[e[30]||(e[30]=(0,s.Lk)("h3",{class:"first-title"},"上传管理",-1)),(0,s.Lk)("h4",Cd,[e[29]||(e[29]=(0,s.eW)("图像审查 ",-1)),(0,s.bF)(b,{content:"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(c,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"开启审查"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[7]||(e[7]=t=>o.uploadSettings.moderate.channel=t),placeholder:"请选择审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,s.bF)(y,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue"])]),_:1}),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:0,label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:1,label:"API 路径"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1},8,["model"])]),(0,s.Lk)("div",Fd,[e[33]||(e[33]=(0,s.Lk)("h3",{class:"first-title"},"访问管理",-1)),e[34]||(e[34]=(0,s.Lk)("h4",{class:"second-title"},"域名过滤",-1)),(0,s.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[31]||(e[31]=(0,s.eW)(" 放行域名 ",-1)),(0,s.bF)(b,{content:"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[10]||(e[10]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),e[35]||(e[35]=(0,s.Lk)("h4",{class:"second-title"},"白名单模式",-1)),(0,s.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[32]||(e[32]=(0,s.eW)(" 是否开启 ",-1)),(0,s.bF)(b,{content:"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[11]||(e[11]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Pd,[(0,s.bF)(u,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[36]||(e[36]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])]),(0,s.bF)(M,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[15]||(e[15]=t=>o.showCreateTokenDialog=t),title:"创建新 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Td,[(0,s.bF)(u,{onClick:e[14]||(e[14]=t=>o.showCreateTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[40]||(e[40]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.createToken},{default:(0,s.k6)(()=>[...e[41]||(e[41]=[(0,s.eW)("创建",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:o.newToken,rules:o.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.newToken.name,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newToken.name=t),placeholder:"请输入Token名称"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[37]||(e[37]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[38]||(e[38]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[39]||(e[39]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[19]||(e[19]=t=>o.showEditTokenDialog=t),title:"编辑 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Ad,[(0,s.bF)(u,{onClick:e[18]||(e[18]=t=>o.showEditTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[45]||(e[45]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.updateToken},{default:(0,s.k6)(()=>[...e[46]||(e[46]=[(0,s.eW)("更新",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:o.editingToken,rules:o.tokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[16]||(e[16]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[17]||(e[17]=t=>o.editingToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[42]||(e[42]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[43]||(e[43]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[44]||(e[44]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[22]||(e[22]=t=>o.showTokenResultDialog=t),title:"Token 创建成功",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Id,[(0,s.bF)(u,{type:"primary",onClick:e[21]||(e[21]=t=>o.showTokenResultDialog=!1)},{default:(0,s.k6)(()=>[...e[49]||(e[49]=[(0,s.eW)("我已保存",-1)])]),_:1})])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Ld,[(0,s.Lk)("p",Dd,[(0,s.bF)(d,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),e[47]||(e[47]=(0,s.eW)(" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! ",-1))]),(0,s.bF)(c,{"label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1}),(0,s.bF)(h,{label:"完整Token"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[20]||(e[20]=t=>o.createdToken.token=t),readonly:""},{append:(0,s.k6)(()=>[(0,s.bF)(u,{onClick:r.copyToken},{default:(0,s.k6)(()=>[...e[48]||(e[48]=[(0,s.eW)("复制",-1)])]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue","width"])])),[[C,o.loading]])}var Ed={data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{}},accessSettings:{},apiTokens:[],loading:!1,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,newToken:{name:"",owner:"",permissions:[]},editingToken:{id:"",name:"",owner:"",permissions:[]},createdToken:{name:"",token:""},userPassRules:{authCode:[{validator:(t,e,i)=>{const s=["%","&","?","#","/"],n=s.some(t=>e&&e.includes(t));n?i(new Error("密码不能包含部分URL保留字符: % & ? # /")):i()},trigger:"blur"}],confirmNewUserPassword:[{message:"请再次输入上传密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.user.authCode?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},adminPassRules:{confirmNewAdminPassword:[{message:"请再次输入管理密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.admin.adminPassword?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},tokenRules:{name:[{required:!0,message:"请输入Token名称",trigger:"blur"}],permissions:[{required:!0,message:"请选择权限",trigger:"change"}]}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"}},methods:{handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},getPermissionText(t){const e={upload:"上传",delete:"删除",list:"列出"};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Rt.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error("获取Token列表失败")}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.newToken)}),e=await t.json();t.ok?(this.createdToken={name:e.name,token:e.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[]},await this.loadApiTokens(),this.$message.success("Token创建成功")):this.$message.error(e.error||"Token创建失败")}catch(e){this.$message.error("Token创建失败")}})},editToken(t){this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions]},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions})}),e=await t.json();t.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success("Token权限更新成功")):this.$message.error(e.error||"Token更新失败")}catch(e){this.$message.error("Token更新失败")}})},async deleteToken(t){try{await this.$confirm("此操作将永久删除该Token,是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const e=await(0,Rt.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),i=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success("Token删除成功")):this.$message.error(i.error||"Token删除失败")}catch(e){"cancel"!==e&&this.$message.error("Token删除失败")}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success("Token已复制到剪贴板")}catch(t){this.$message.error("复制失败,请手动复制")}},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete i.auth.user.confirmNewUserPassword,delete i.auth.admin.confirmNewAdminPassword,(0,Rt.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存"),this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1})})}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=t.upload,this.accessSettings=t.access,this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Od=(0,c.A)(Ed,[["render",Vd],["__scopeId","data-v-3b7344a0"]]);var Rd=Od;const Wd={class:"page-settings"},zd={class:"first-title"},Bd={class:"actions"};function Nd(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=f.R7,c=cd.P9,d=cd.AV,u=Uc.qi,g=Nc.WK,p=jc.xE,m=jc.US,b=k.S2,x=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Wd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.groupedSettings,(t,e)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"first-settings"},[(0,s.Lk)("h3",zd,(0,n.v_)(e),1),(0,s.bF)(m,{model:o.settings,"label-width":"150px"},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t,(t,e)=>((0,s.uX)(),(0,s.Wv)(p,{key:t.id},{label:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label)+" ",1),t.tooltip?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:t.tooltip,placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,s.Q3)("",!0)]),default:(0,s.k6)(()=>["select"===t.type?((0,s.uX)(),(0,s.Wv)(d,{key:0,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder,style:{width:"100%"}},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.options,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===t.type?((0,s.uX)(),(0,s.Wv)(u,{key:1,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):((0,s.uX)(),(0,s.Wv)(g,{key:2,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"]))]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,s.Lk)("div",Bd,[(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[0]||(e[0]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[x,o.loading]])}var jd={data(){return{settings:{config:[]},loading:!1}},computed:{groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const i=e.category||"其他设置";t[i]||(t[i]=[]),t[i].push(e)}),t}},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const Ud=(0,c.A)(jd,[["render",Nd],["__scopeId","data-v-7b059a1c"]]);var $d=Ud;const Hd={class:"others-settings"},qd={class:"first-settings"},Xd={class:"first-title"},Yd={class:"first-title"},Kd={class:"first-title"},Qd={class:"first-title"},Gd={class:"actions"};function Jd(t,e,i,n,a,o){const r=(0,s.g2)("font-awesome-icon"),l=f.R7,h=Uc.qi,c=jc.xE,d=jc.US,u=Nc.WK,g=k.S2,p=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Hd,[(0,s.Lk)("div",qd,[(0,s.Lk)("h3",Xd,[e[9]||(e[9]=(0,s.eW)("远端遥测 ",-1)),(0,s.bF)(l,{content:"便于问题查找和定位,建议开启",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.telemetry,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>a.settings.telemetry.enabled=t),disabled:a.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Yd,[e[10]||(e[10]=(0,s.eW)("随机图像API ",-1)),(0,s.bF)(l,{content:"API具体用法请查阅文档",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.randomImageAPI,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>a.settings.randomImageAPI.enabled=t),disabled:a.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"randomImageAPI.allowedDir"},{label:(0,s.k6)(()=>[e[11]||(e[11]=(0,s.Lk)("span",null,"目录",-1)),(0,s.bF)(l,{content:"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[2]||(e[2]=t=>a.settings.randomImageAPI.allowedDir=t),disabled:a.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Kd,[e[12]||(e[12]=(0,s.eW)("CloudFlare API Token ",-1)),(0,s.bF)(l,{content:"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"区域ID"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[3]||(e[3]=t=>a.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:a.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"账户邮箱"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[4]||(e[4]=t=>a.settings.cloudflareApiToken.CF_EMAIL=t),disabled:a.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[5]||(e[5]=t=>a.settings.cloudflareApiToken.CF_API_KEY=t),disabled:a.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Qd,[e[13]||(e[13]=(0,s.eW)("WebDAV ",-1)),(0,s.bF)(l,{content:"启用后,可以通过WebDAV协议访问和管理图片",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.webDAV,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.webDAV.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>a.settings.webDAV.enabled=t),disabled:a.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"用户名"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.webDAV.username,"onUpdate:modelValue":e[7]||(e[7]=t=>a.settings.webDAV.username=t),disabled:a.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"密码"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.webDAV.password,"onUpdate:modelValue":e[8]||(e[8]=t=>a.settings.webDAV.password=t),disabled:a.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Gd,[(0,s.bF)(g,{type:"primary",onClick:o.saveSettings},{default:(0,s.k6)(()=>[...e[14]||(e[14]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[p,a.loading]])}var Zd={data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{}},loading:!1}},computed:{},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1})}};const tu=(0,c.A)(Zd,[["render",Jd],["__scopeId","data-v-03514366"]]);var eu=tu,iu={name:"SystemConfig",data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:p.A,SysConfigTabs:u,SysCogStatus:Wc,SysCogUpload:rd,SysCogSecurity:Rd,SysCogPage:$d,SysCogOthers:eu},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return Wc;case"upload":return rd;case"security":return Rd;case"page":return $d;case"others":return eu;default:return Wc}}},methods:{handleLogout(){this.$store.commit("setCredentials",null),this.$router.push("/adminLogin")},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){window.location.hash||this.setDefaultHash()}};const su=(0,c.A)(iu,[["render",y],["__scopeId","data-v-c5d2c9c2"]]);var nu=su}}]); -//# sourceMappingURL=275.392f87b8.js.map \ No newline at end of file +class fo{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=$i.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)}}var po=new fo;const mo="transparent",bo={boolean(t,e,i){return i>.5?e:t},color(t,e,i){const s=ss(t||mo),n=s.valid&&ss(e||mo);return n&&n.valid?n.mix(s,i).hexString():e},number(t,e,i){return t+(e-t)*i}};class xo{constructor(t,e,i,s){const n=e[i];s=Ys([t.to,s,n,t.from]);const o=Ys([t.from,n,s]);this._active=!0,this._fn=t.fn||bo[t.type||typeof o],this._easing=es[t.easing]||es.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=Ys([t.to,e,s,t.from]),this._from=Ys([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||e1?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 s=0;s{const n=t[s];if(!We(n))return;const o={};for(const t of e)o[t]=n[t];(Re(n.properties)&&n.properties||[s]).forEach(t=>{t!==s&&i.has(t)||i.set(t,o)})})}_animateOptions(t,e){const i=e.options,s=vo(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&_o(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 xo(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?(po.add(this._chart,i),!0):void 0}}function _o(t,e){const i=[],s=Object.keys(e);for(let n=0;n0||!i&&e<0)return n.index}return null}function Io(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=To(o,a,s),d=e.length;let u;for(let g=0;gi[t].axis===e).shift()}function Eo(t,e){return Qs(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Oo(t,e,i){return Qs(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}function Ro(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],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Wo=t=>"reset"===t||"none"===t,zo=(t,e)=>e?t:Object.assign({},t),Bo=(t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Mo(i,!0),values:null};class No{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.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Po(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Ro(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=Ne(i.xAxisID,Vo(t,"x")),o=e.yAxisID=Ne(i.yAxisID,Vo(t,"y")),a=e.rAxisID=Ne(i.rAxisID,Vo(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&&ji(this._data,this),t._stacked&&Ro(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(We(e)){const t=this._cachedMeta;this._data=Fo(e,t)}else if(i!==e){if(i){ji(i,this);const t=this._cachedMeta;Ro(t),t._parsed=[]}e&&Object.isExtensible(e)&&Ni(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=Po(e.vScale,e),e.stack!==i.stack&&(s=!0,Ro(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&(Io(this,e._parsed),e._stacked=Po(e.vScale,e))}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=Re(s[t])?this.parseArrayData(i,s,t,e):We(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[a]||d&&l[a]e||c=0;--d)if(!g()){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=0&&tthis.getContext(i,s,e),f=l.resolveNamedOptions(d,u,g,c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(zo(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 yo(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||Wo(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Wo(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Wo(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[a,r,l]of this._syncList)this[a](r,l);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{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;at-e))}return t._cache.$bar}function Uo(t){const e=t.iScale,i=jo(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(ni(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;s0?n[t-1]:null,r=tMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}function Xo(t,e,i,s){return Re(t)?qo(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Yo(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=i?1:-1)}function Go(t){let e,i,s,n,o;return t.horizontal?(e=t.base>t.x,i="left",s="right"):(e=t.baset.controller.options.grouped),n=i.options.stacked,o=[],a=this._cachedMeta.controller.getParsed(e),r=a&&a[i.axis],l=t=>{const e=t._parsed.find(t=>t[i.axis]===r),s=e&&e[t.vScale.axis];if(Oe(s)||isNaN(s))return!0};for(const h of s)if((void 0===e||!l(h))&&((!1===n||-1===o.indexOf(h.stack)||void 0===n&&void 0===h.stack)&&o.push(h.stack),h.index===t))break;return o.length||o.push(void 0),o}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(i=>t[i].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const i of this.chart.data.datasets)t[Ne("x"===this.chart.options.indexAxis?i.xAxisID:i.yAxisID,e)]=!0;return Object.keys(t)}_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=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}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,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;dDi(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),f=(t,e,s)=>Di(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=g(0,h,d),m=g(gi,c,u),b=f(li,h,d),x=f(li+gi,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}jt(na,"id","bubble"),jt(na,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),jt(na,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class aa extends No{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(We(i[t])){const{key:t="value"}=this._parsing;a=e=>+ii(i[e],t)}for(n=t,o=t+e;n0&&!isNaN(t)?hi*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ds(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"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),jt(aa,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:i,textAlign:s,color:n,useBorderRadius:o,borderRadius:a}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,r)=>{const l=t.getDatasetMeta(0),h=l.controller.getStyle(r);return{text:e,fillStyle:h.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(r),lineDash:h.borderDash,lineDashOffset:h.borderDashOffset,lineJoin:h.borderJoinStyle,lineWidth:h.borderWidth,strokeStyle:h.borderColor,textAlign:s,pointStyle:i,borderRadius:o&&(a||h.borderRadius),index:r}}):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}});class ra extends No{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!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}=Qi(e,s,o);this._drawStart=a,this._drawCount=r,Gi(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,{sharedOptions:h,includeOptions:c}=this._getSharedOptions(e,s),d=o.axis,u=a.axis,{spanGaps:g,segment:f}=this.options,p=ki(g)?g:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===s,b=e+i,x=t.length;let y=e>0&&this.getParsed(e-1);for(let _=0;_=b){g.skip=!0;continue}const x=this.getParsed(_),v=Oe(x[u]),k=g[d]=o.getPixelForValue(x[d],_),w=g[u]=n||v?a.getBasePixel():a.getPixelForValue(r?this.applyStack(a,x,r):x[u],_);g.skip=isNaN(k)||isNaN(w)||v,g.stop=_>0&&Math.abs(x[d]-y[d])>p,f&&(g.parsed=x,g.raw=l.data[_]),c&&(g.options=h||this.resolveDataElementOptions(_,i.active?"active":s)),m||this.updateElement(i,_,g,s),y=x}}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()}}jt(ra,"id","line"),jt(ra,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),jt(ra,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class la extends No{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=ds(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return bn.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))}),e}_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=Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0),a=(n-o)/t.getVisibleDatasetCount();this.outerRadius=n-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options,r=a.animation,l=this._cachedMeta.rScale,h=l.xCenter,c=l.yCenter,d=l.getIndexAngle(0)-.5*li;let u,g=d;const f=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?Mi(this.resolveDataElementOptions(t,e).angle||i):0}}jt(la,"id","polarArea"),jt(la,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),jt(la,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map((e,n)=>{const o=t.getDatasetMeta(0),a=o.controller.getStyle(n);return{text:e,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,fontColor:s,lineWidth:a.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class ha extends aa{}jt(ha,"id","pie"),jt(ha,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class ca extends No{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return bn.bind(this)(t,e,i,s)}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._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(i[u]-x[u])>m,p&&(h.parsed=i,h.raw=l.data[y]),d&&(h.options=c||this.resolveDataElementOptions(y,e.active?"active":s)),b||this.updateElement(e,y,h,s),x=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}jt(da,"id","scatter"),jt(da,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),jt(da,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function ua(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class ga{static override(t){Object.assign(ga.prototype,t)}constructor(t){jt(this,"options",void 0),this.options=t||{}}init(){}formats(){return ua()}parse(){return ua()}format(){return ua()}add(){return ua()}diff(){return ua()}startOf(){return ua()}endOf(){return ua()}}var fa={_date:ga};function pa(t,e,i,s){const{controller:n,data:o,_sorted:a}=t,r=n._cachedMeta.iScale,l=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(r&&e===r.axis&&"r"!==e&&a&&o.length){const a=r._reversePixels?Wi:Ri;if(!s){const s=a(o,e,i);if(l){const{vScale:e}=n._cachedMeta,{_parsed:i}=t,o=i.slice(0,s.lo+1).reverse().findIndex(t=>!Oe(t[e.axis]));s.lo-=Math.max(0,o);const a=i.slice(s.hi).findIndex(t=>!Oe(t[e.axis]));s.hi+=Math.max(0,a)}return s}if(n._sharedOptions){const t=o[0],s="function"===typeof t.getRange&&t.getRange(e);if(s){const t=a(o,e,i-s),n=a(o,e,i+s);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:o.length-1}}function ma(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let r=0,l=o.length;r{t[a]&&t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))}),s&&!r?[]:o}var wa={evaluateInteractionItems:ma,modes:{index(t,e,i,s){const n=Rn(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?xa(t,n,o,s,a):va(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})}),l):[]},dataset(t,e,i,s){const n=Rn(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?xa(t,n,o,s,a):va(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tt.pos===e)}function Ca(t,e){return t.filter(t=>-1===Sa.indexOf(t.pos)&&t.box.axis===e)}function Fa(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 Pa(t){const e=[];let i,s,n,o,a,r;for(i=0,s=(t||[]).length;it.box.fullSize),!0),s=Fa(Ma(e,"left"),!0),n=Fa(Ma(e,"right")),o=Fa(Ma(e,"top"),!0),a=Fa(Ma(e,"bottom")),r=Ca(e,"x"),l=Ca(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ma(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}function Da(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function Ia(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 Va(t,e,i,s){const{pos:n,box:o}=i,a=t.maxPadding;if(!We(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&&Ia(a,o.getPadding());const r=Math.max(0,e.outerWidth-Da(a,t,"left","right")),l=Math.max(0,e.outerHeight-Da(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 Ea(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")}function Oa(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 Ra(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;o{"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);Ia(u,qs(s));const g=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),f=Aa(l.concat(h),d);Ra(r.fullSize,g,d,f),Ra(l,g,d,f),Ra(h,g,d,f)&&Ra(l,g,d,f),Ea(g),za(r.leftAndTop,g,d,f),g.x+=g.w,g.y+=g.h,za(r.rightAndBottom,g,d,f),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},He(r.chartArea,e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})})}};class Na{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 ja extends Na{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Ua="$chartjs",$a={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Ha=t=>null===t||""===t;function qa(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[Ua]={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",Ha(n)){const e=Un(t,"width");void 0!==e&&(t.width=e)}if(Ha(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Un(t,"height");void 0!==e&&(t.height=e)}return t}const Xa=!!jn&&{passive:!0};function Ya(t,e,i){t&&t.addEventListener(e,i,Xa)}function Ka(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,Xa)}function Qa(t,e){const i=$a[t.type]||t.type,{x:s,y:n}=Rn(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}function Ga(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Ja(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Ga(i.addedNodes,s),e=e&&!Ga(i.removedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}function Za(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Ga(i.removedNodes,s),e=e&&!Ga(i.addedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}const tr=new Map;let er=0;function ir(){const t=window.devicePixelRatio;t!==er&&(er=t,tr.forEach((e,i)=>{i.currentDevicePixelRatio!==t&&e()}))}function sr(t,e){tr.size||window.addEventListener("resize",ir),tr.set(t,e)}function nr(t){tr.delete(t),tr.size||window.removeEventListener("resize",ir)}function or(t,e,i){const s=t.canvas,n=s&&Tn(s);if(!n)return;const o=Hi((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)});return a.observe(n),sr(t,o),a}function ar(t,e,i){i&&i.disconnect(),"resize"===e&&nr(t)}function rr(t,e,i){const s=t.canvas,n=Hi(e=>{null!==t.ctx&&i(Qa(e,t))},t);return Ya(s,e,n),n}class lr extends Na{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(qa(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[Ua])return!1;const i=e[Ua].initial;["height","width"].forEach(t=>{const s=i[t];Oe(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[Ua],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Ja,detach:Za,resize:or},o=n[e]||rr;s[e]=o(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;const n={attach:ar,detach:ar,resize:ar},o=n[e]||Ka;o(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Bn(t,e,i,s)}isAttached(t){const e=t&&Tn(t);return!(!e||!e.isConnected)}}function hr(t){return!Pn()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ja:lr}class cr{constructor(){jt(this,"x",void 0),jt(this,"y",void 0),jt(this,"active",!1),jt(this,"options",void 0),jt(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return ki(this.x)&&ki(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}}function dr(t,e){const i=t.options.ticks,s=ur(t),n=Math.min(i.maxTicksLimit||s,s),o=i.major.enabled?fr(e):[],a=o.length,r=o[0],l=o[a-1],h=[];if(a>n)return pr(e,h,o,a/n),h;const c=gr(o,e,n);if(a>0){let t,i;const s=a>1?Math.round((l-r)/(a-1)):null;for(mr(e,h,c,Oe(s)?0:r-s,r),t=0,i=a-1;tn)return t}return Math.max(n,1)}function fr(t){const e=[];let i,s;for(i=0,s=t.length;i"left"===t?"right":"right"===t?"left":t,yr=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,_r=(t,e)=>Math.min(e||t,t);function vr(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function wr(t,e){He(t,t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;ns?s:i,s=n&&i>s?i:s,{min:Be(i,Be(s,i)),max:Be(s,Be(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||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){$e(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=Ks(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=Ii(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-Sr(t.grid)-e.padding-Mr(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Ci(Math.min(Math.asin(Ii((h.highest.height+6)/o,-1,1)),Math.asin(Ii(a/r,-1,1))-Math.asin(Ii(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){$e(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$e(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=Mr(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Sr(n)+o):(t.height=this.maxHeight,t.width=Sr(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=Mi(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:"inner"!==n&&(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(){$e(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({width:o[t]||0,height:a[t]||0});return{first:w(0),last:w(e-1),widest:w(v),highest:w(k),widths:o,heights:a}}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 Vi(this._alignToPixels?Ms(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&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:o,border:a}=s,r=n.offset,l=this.isHorizontal(),h=this.ticks,c=h.length+(r?1:0),d=Sr(n),u=[],g=a.setContext(this.getContext()),f=g.display?g.width:0,p=f/2,m=function(t){return Ms(i,t,f)};let b,x,y,_,v,k,w,S,M,C,F,P;if("top"===o)b=m(this.bottom),k=this.bottom-d,S=b-p,C=m(t.top)+p,P=t.bottom;else if("bottom"===o)b=m(this.top),C=t.top,P=m(t.bottom)-p,k=b+p,S=this.top+d;else if("left"===o)b=m(this.right),v=this.right-d,w=b-p,M=m(t.left)+p,F=t.right;else if("right"===o)b=m(this.left),M=t.left,F=m(t.right)-p,v=b+p,w=this.left+d;else if("x"===e){if("center"===o)b=m((t.top+t.bottom)/2+.5);else if(We(o)){const t=Object.keys(o)[0],e=o[t];b=m(this.chart.scales[t].getPixelForValue(e))}C=t.top,P=t.bottom,k=b+p,S=k+d}else if("y"===e){if("center"===o)b=m((t.left+t.right)/2);else if(We(o)){const t=Object.keys(o)[0],e=o[t];b=m(this.chart.scales[t].getPixelForValue(e))}v=b-p,w=v-d,M=t.left,F=t.right}const T=Ne(s.ticks.maxTicksLimit,c),A=Math.max(1,Math.ceil(c/T));for(x=0;x0&&(o-=s/2);break}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}p.push({label:y,font:S,textOffset:F,options:{rotation:f,color:i,strokeColor:r,strokeWidth:h,textAlign:u,textBaseline:P,translation:[_,v],backdrop:d}})}return p}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,i=-Mi(this.labelRotation);if(i)return"top"===t?"left":"right";let s="center";return"start"===e.align?s="left":"end"===e.align?s="right":"inner"===e.align&&(s="inner"),s}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=this._getLabelSizes(),a=t+n,r=o.widest.width;let l,h;return"left"===e?s?(h=this.right+n,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h+=r)):(h=this.right-a,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h=this.left)):"right"===e?s?(h=this.left+n,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h-=r)):(h=this.left+a,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h=this.right)):l="right",{textAlign:l,x:h}}_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,s=i.findIndex(e=>e.value===t);if(s>=0){const t=e.setContext(this.getContext(s));return t.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{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,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{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");vs.route(o,n,l,r)})}function Vr(t){return"id"in t&&"defaults"in t}class Er{constructor(){this.controllers=new Lr(No,"datasets",!0),this.elements=new Lr(cr,"elements"),this.plugins=new Lr(Object,"plugins"),this.scales=new Lr(Ar,"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):He(e,e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)})})}_exec(t,e,i){const s=si(t);$e(i["before"+s],[],i),e[t](i),$e(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.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 Wr(t){const e={},i=[],s=Object.keys(Or.plugins.items);for(let o=0;o1&&Hr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Yr(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function Kr(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(i.length)return Yr(t,"x",i[0])||Yr(t,"y",i[0])}return{}}function Qr(t,e){const i=ms[t.type]||{scales:{}},s=e.scales||{},n=jr(t.type,e),o=Object.create(null);return Object.keys(s).forEach(e=>{const a=s[e];if(!We(a))return console.error(`Invalid scale configuration for scale: ${e}`);if(a._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const r=Xr(e,a,Kr(e,t),vs.scales[a.type]),l=$r(r,n),h=i.scales||{};o[e]=Ge(Object.create(null),[{axis:r},a,h[r],h[l]])}),t.data.datasets.forEach(i=>{const n=i.type||t.type,a=i.indexAxis||jr(n,e),r=ms[n]||{},l=r.scales||{};Object.keys(l).forEach(t=>{const e=Ur(t,a),n=i[e+"AxisID"]||e;o[n]=o[n]||Object.create(null),Ge(o[n],[{axis:e},s[n],l[t]])})}),Object.keys(o).forEach(t=>{const e=o[t];Ge(e,[vs.scales[e.type],vs.scale])}),o}function Gr(t){const e=t.options||(t.options={});e.plugins=Ne(e.plugins,{}),e.scales=Qr(t,e)}function Jr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Zr(t){return t=t||{},t.data=Jr(t.data),Gr(t),t}const tl=new Map,el=new Set;function il(t,e){let i=tl.get(t);return i||(i=e(),tl.set(t,i),el.add(i)),i}const sl=(t,e,i)=>{const s=ii(e,i);void 0!==s&&t.add(s)};class nl{constructor(t){this._config=Zr(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=Jr(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(),Gr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return il(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return il(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return il(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,i=this.type;return il(`${i}-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=>sl(r,t,e))),e.forEach(t=>sl(r,s,t)),e.forEach(t=>sl(r,ms[n]||{},t)),e.forEach(t=>sl(r,vs,t)),e.forEach(t=>sl(r,bs,t))});const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),el.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,ms[e]||{},vs.datasets[e]||{},{type:e},vs,bs]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:o,subPrefixes:a}=ol(this._resolverCache,t,s);let r=o;if(rl(o,e)){n.$shared=!1,i=oi(i)?i():i;const e=this.createResolver(t,i,a);r=Js(o,i,e)}for(const l of e)n[l]=r[l];return n}createResolver(t,e,i=[""],s){const{resolver:n}=ol(this._resolverCache,t,i);return We(e)?Js(n,e,void 0,s):n}}function ol(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){const t=Gs(e,i);o={resolver:t,subPrefixes:i.filter(t=>!t.toLowerCase().includes("hover"))},s.set(n,o)}return o}const al=t=>We(t)&&Object.getOwnPropertyNames(t).some(e=>oi(t[e]));function rl(t,e){const{isScriptable:i,isIndexable:s}=Zs(t);for(const n of e){const e=i(n),o=s(n),a=(o||e)&&t[n];if(e&&(oi(a)||al(a))||o&&Re(a))return!0}return!1}var ll="4.5.1";const hl=["top","bottom","left","right","chartArea"];function cl(t,e){return"top"===t||"bottom"===t||-1===hl.indexOf(t)&&"x"===e}function dl(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function ul(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),$e(i&&i.onComplete,[t],e)}function gl(t){const e=t.chart,i=e.options.animation;$e(i&&i.onProgress,[t],e)}function fl(t){return Pn()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const pl={},ml=t=>{const e=fl(t);return Object.values(pl).filter(t=>t.canvas===e).pop()};function bl(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)}}}function xl(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}class yl{static register(...t){Or.add(...t),_l()}static unregister(...t){Or.remove(...t),_l()}constructor(t,e){const i=this.config=new nl(e),s=fl(t),n=ml(s);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const o=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||hr(s)),this.platform.updateConfig(i);const a=this.platform.acquireContext(s,o.aspectRatio),r=a&&a.canvas,l=r&&r.height,h=r&&r.width;this.id=Ee(),this.ctx=a,this.canvas=r,this.width=h,this.height=l,this._options=o,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 Rr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=qi(t=>this.update(t),o.resizeDelay||0),this._dataChanges=[],pl[this.id]=this,a&&r?(po.listen(this,"complete",ul),po.listen(this,"progress",gl),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 Oe(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}get registry(){return Or}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Nn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Cs(this.canvas,this.ctx),this}stop(){return po.stop(this),this}resize(t,e){po.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,Nn(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),$e(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};He(e,(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=Xr(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}}))),He(n,e=>{const n=e.options,o=n.id,a=Xr(o,n),r=Ne(n.type,e.dtype);void 0!==n.position&&cl(n.position,a)===cl(e.dposition)||(n.position=e.dposition),s[o]=!0;let l=null;if(o in i&&i[o].type===r)l=i[o];else{const t=Or.getScale(r);l=new t({id:o,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)}),He(s,(t,e)=>{t||delete i[e]}),He(i,t=>{Ba.configure(this,t,t.options),Ba.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;te.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{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 l=0,h=this.data.datasets.length;l{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(dl("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){He(this.scales,t=>{Ba.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);ai(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){const e="_removeElements"===i?-n:n;bl(t,s,e)}}_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 n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Ba.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],He(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=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i={meta:t,index:t.index,cancelable:!0},s=go(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",i)&&(s&&As(e,s),t.controller.draw(),s&&Ls(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Ts(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=wa.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=Qs(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){const i=this.getDatasetMeta(t);i.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);ni(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(),po.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};He(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(){He(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},He(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{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}}),s=!qe(i,e);s&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_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:this.isPointInArea(t)},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=ri(t),l=xl(t,this._lastEvent,i,r);i&&(this._lastEvent=null,$e(n.onHover,[t,a,this],this),r&&$e(n.onClick,[t,a,this],this));const h=!qe(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)}}function _l(){return He(yl.instances,t=>t._plugins.invalidate())}function vl(t,e,i){const{startAngle:s,x:n,y:o,outerRadius:a,innerRadius:r,options:l}=e,{borderWidth:h,borderJoinStyle:c}=l,d=Math.min(h/a,Li(s-i));if(t.beginPath(),t.arc(n,o,a-h/2,s+d/2,i-d/2),r>0){const e=Math.min(h/r,Li(s-i));t.arc(n,o,r+h/2,i-e/2,s+e/2,!0)}else{const e=Math.min(h/2,a*Li(s-i));if("round"===c)t.arc(n,o,e,i-li/2,s+li/2,!0);else if("bevel"===c){const a=2*e*e,r=-a*Math.cos(i+li/2)+n,l=-a*Math.sin(i+li/2)+o,h=a*Math.cos(s+li/2)+n,c=a*Math.sin(s+li/2)+o;t.lineTo(r,l),t.lineTo(h,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function kl(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+gi,s-gi),t.closePath(),t.clip()}function wl(t){return Us(t,["outerStart","outerEnd","innerStart","innerEnd"])}function Sl(t,e,i,s){const n=wl(t.options.borderRadius),o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return Ii(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Ii(n.innerStart,0,a),innerEnd:Ii(n.innerEnd,0,a)}}function Ml(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Cl(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let g=0;const f=n-l;if(s){const t=c>0?c-s:0,e=d>0?d-s:0,i=(t+e)/2,n=0!==i?f*i/(i+s):f;g=(f-n)/2}const p=Math.max(.001,f*d-i/li)/d,m=(f-p)/2,b=l+m+g,x=n-m-g,{outerStart:y,outerEnd:_,innerStart:v,innerEnd:k}=Sl(e,u,d,x-b),w=d-y,S=d-_,M=b+y/w,C=x-_/S,F=u+v,P=u+k,T=b+v/F,A=x-k/P;if(t.beginPath(),o){const e=(M+C)/2;if(t.arc(a,r,d,M,e),t.arc(a,r,d,e,C),_>0){const e=Ml(S,C,a,r);t.arc(e.x,e.y,_,C,x+gi)}const i=Ml(P,x,a,r);if(t.lineTo(i.x,i.y),k>0){const e=Ml(P,A,a,r);t.arc(e.x,e.y,k,x+gi,A+Math.PI)}const s=(x-k/u+(b+v/u))/2;if(t.arc(a,r,u,x-k/u,s,!0),t.arc(a,r,u,s,b+v/u,!0),v>0){const e=Ml(F,T,a,r);t.arc(e.x,e.y,v,T+Math.PI,b-gi)}const n=Ml(w,b,a,r);if(t.lineTo(n.x,n.y),y>0){const e=Ml(w,M,a,r);t.arc(e.x,e.y,y,b-gi,M)}}else{t.moveTo(a,r);const e=Math.cos(M)*d+a,i=Math.sin(M)*d+r;t.lineTo(e,i);const s=Math.cos(C)*d+a,n=Math.sin(C)*d+r;t.lineTo(s,n)}t.closePath()}function Fl(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){Cl(t,e,i,s,l,n);for(let e=0;e=li&&0===g&&"miter"!==c&&vl(t,e,p),o||(Cl(t,e,i,s,p,n),t.stroke())}jt(yl,"defaults",vs),jt(yl,"instances",pl),jt(yl,"overrides",ms),jt(yl,"registry",Or),jt(yl,"version",ll),jt(yl,"getChart",ml);class Tl extends cr{constructor(t){super(),jt(this,"circumference",void 0),jt(this,"endAngle",void 0),jt(this,"fullCircles",void 0),jt(this,"innerRadius",void 0),jt(this,"outerRadius",void 0),jt(this,"pixelMargin",void 0),jt(this,"startAngle",void 0),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}=Pi(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+this.options.borderWidth)/2,u=Ne(c,r-a),g=Di(n,a,r)&&a!==r,f=u>=hi||g,p=Ei(o,l+d,h+d);return f&&p}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],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)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>hi?Math.floor(i/hi):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=1-Math.sin(Math.min(li,i||0)),l=s*r;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,Fl(t,this,l,n,o),Pl(t,this,l,n,o),t.restore()}}function Al(t,e,i=e){t.lineCap=Ne(i.borderCapStyle,e.borderCapStyle),t.setLineDash(Ne(i.borderDash,e.borderDash)),t.lineDashOffset=Ne(i.borderDashOffset,e.borderDashOffset),t.lineJoin=Ne(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Ne(i.borderWidth,e.borderWidth),t.strokeStyle=Ne(i.borderColor,e.borderColor)}function Ll(t,e,i){t.lineTo(i.x,i.y)}function Dl(t){return t.stepped?Ds:t.tension||"monotone"===t.cubicInterpolationMode?Is:Ll}function Il(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=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,y=()=>{g!==f&&(t.lineTo(m,f),t.lineTo(m,g),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(if&&(f=i),m=(b*m+e)/++b):(y(),t.lineTo(e,i),u=s,b=0,g=f=i),p=i}y()}function Ol(t){const e=t.options,i=e.borderDash&&e.borderDash.length,s=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!i;return s?El:Vl}function Rl(t){return t.stepped?Hn:t.tension||"monotone"===t.cubicInterpolationMode?qn:$n}function Wl(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Al(t,e.options),t.stroke(n)}function zl(t,e,i,s){const{segments:n,options:o}=e,a=Ol(e);for(const r of n)Al(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}jt(Tl,"id","arc"),jt(Tl,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),jt(Tl,"defaultRoutes",{backgroundColor:"backgroundColor"}),jt(Tl,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Bl="function"===typeof Path2D;function Nl(t,e,i,s){Bl&&!e.options.segment?Wl(t,e,i,s):zl(t,e,i,s)}class jl extends cr{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;Fn(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=oo(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=io(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=Rl(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t&&"fill"!==t});class $l extends cr{constructor(t){super(),jt(this,"parsed",void 0),jt(this,"skip",void 0),jt(this,"stop",void 0),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){let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}},ih=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class sh extends cr{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=$e(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=Xs(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=eh(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,s,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,g)=>{const f=i+e/2+n.measureText(t.text).width;(0===g||l[l.length-1]+f+2*a>o)&&(c+=h,l[l.length-(g>0?0:1)]=0,u+=h,d++),r[g]={left:0,top:u,row:d,width:f,height:s},l[l.length-1]+=f+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,g=0,f=0;return this.legendItems.forEach((t,o)=>{const{itemWidth:p,itemHeight:m}=nh(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),g+=d+a,f++,d=u=0),r[o]={left:g,top:u,col:f,width:p,height:m},d=Math.max(d,p),u+=m+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:n}}=this,o=Kn(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=Yi(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=Yi(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=Yi(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=Yi(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;As(t,this),this._draw(),Ls(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=vs.color,r=Kn(t.rtl,this.left,this.width),l=Xs(o.font),{padding:h}=o,c=l.size,d=c/2;let u;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=l.string;const{boxWidth:g,boxHeight:f,itemHeight:p}=eh(o,c),m=function(t,e,i){if(isNaN(g)||g<=0||isNaN(f)||f<0)return;s.save();const n=Ne(i.lineWidth,1);if(s.fillStyle=Ne(i.fillStyle,a),s.lineCap=Ne(i.lineCap,"butt"),s.lineDashOffset=Ne(i.lineDashOffset,0),s.lineJoin=Ne(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=Ne(i.strokeStyle,a),s.setLineDash(Ne(i.lineDash,[])),o.usePointStyle){const a={radius:f*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2),h=e+d;Ps(s,a,l,h,o.pointStyleWidth&&g)}else{const o=e+Math.max((c-f)/2,0),a=r.leftForLtr(t,g),l=Hs(i.borderRadius);s.beginPath(),Object.values(l).some(t=>0!==t)?Ws(s,{x:a,y:o,w:g,h:f,radius:l}):s.rect(a,o,g,f),s.fill(),0!==n&&s.stroke()}s.restore()},b=function(t,e,i){Rs(s,i.text,t,e+p/2,l,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})},x=this.isHorizontal(),y=this._computeTitleHeight();u=x?{x:Yi(n,this.left+h,this.right-i[0]),y:this.top+h+y,line:0}:{x:this.left+h,y:Yi(n,this.top+y+h,this.bottom-e[0].height),line:0},Qn(this.ctx,t.textDirection);const _=p+h;this.legendItems.forEach((a,c)=>{s.strokeStyle=a.fontColor,s.fillStyle=a.fontColor;const f=s.measureText(a.text).width,p=r.textAlign(a.textAlign||(a.textAlign=o.textAlign)),v=g+d+f;let k=u.x,w=u.y;r.setWidth(this.width),x?c>0&&k+v+h>this.right&&(w=u.y+=_,u.line++,k=u.x=Yi(n,this.left+h,this.right-i[u.line])):c>0&&w+_>this.bottom&&(k=u.x=k+e[u.line].width+h,u.line++,w=u.y=Yi(n,this.top+y+h,this.bottom-e[u.line].height));const S=r.x(k);if(m(S,w,a),k=Ki(p,k+g+d,x?k+v:this.right,t.rtl),b(r.x(k),w,a),x)u.x+=v+h;else if("string"!==typeof a.text){const t=l.lineHeight;u.y+=rh(a,t)+h}else u.y+=_}),Gn(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Xs(e.font),s=qs(e.padding);if(!e.display)return;const n=Kn(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=Yi(t.align,c,this.right-d);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);h=l+Yi(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Yi(a,c,c+d);o.textAlign=n.textAlign(Xi(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Rs(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Xs(t.font),i=qs(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Ei(t,this.left,this.right)&&Ei(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.length>e.length?t:e)),e+i.size/2+s.measureText(n).width}function ah(t,e,i){let s=t;return"string"!==typeof e.text&&(s=rh(e,i)),s}function rh(t,e){const i=t.text?t.text.length:0;return e*i}function lh(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var hh={id:"legend",_element:sh,start(t,e,i){const s=t.legend=new sh({ctx:t.ctx,options:i,chart:t});Ba.configure(t,s,i),Ba.addBox(t,s)},stop(t){Ba.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;Ba.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,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const l=t.controller.getStyle(i?0:void 0),h=qs(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),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)}}};new WeakMap;const ch={average(t){if(!t.length)return!1;let e,i,s=new Set,n=0,o=0;for(e=0,i=t.length;et+e)/s.size;return{x:a,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-1?t.split("\n"):t}function gh(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 fh(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Xs(e.bodyFont),h=Xs(e.titleFont),c=Xs(e.footerFont),d=o.length,u=n.length,g=s.length,f=qs(e.padding);let p=f.height,m=0,b=s.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(r,l.lineHeight):l.lineHeight;p+=g*t+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let x=0;const y=function(t){m=Math.max(m,i.measureText(t).width+x)};return i.save(),i.font=h.string,He(t.title,y),i.font=l.string,He(t.beforeBody.concat(t.afterBody),y),x=e.displayColors?a+2+e.boxPadding:0,He(s,t=>{He(t.before,y),He(t.lines,y),He(t.after,y)}),x=0,i.font=c.string,He(t.footer,y),i.restore(),m+=f.width,{width:m,height:p}}function ph(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}function mh(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)}function bh(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"),mh(h,t,e,i)&&(h="center"),h}function xh(t,e,i){const s=i.yAlign||e.yAlign||ph(t,i);return{xAlign:i.xAlign||e.xAlign||bh(t,e,i,s),yAlign:s}}function yh(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}function _h(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}function vh(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:g}=Hs(a);let f=yh(e,r);const p=_h(e,l,h);return"center"===l?"left"===r?f+=h:"right"===r&&(f-=h):"left"===r?f-=Math.max(c,u)+n:"right"===r&&(f+=Math.max(d,g)+n),{x:Ii(f,0,s.width-e.width),y:Ii(p,0,s.height-e.height)}}function kh(t,e,i){const s=qs(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function wh(t){return dh([],uh(t))}function Sh(t,e,i){return Qs(t,{tooltip:e,tooltipItems:i,type:"tooltip"})}function Mh(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const Ch={beforeTitle:Ve,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{const e={before:[],lines:[],after:[]},n=Mh(i,t);dh(e.before,uh(Fh(n,"beforeLabel",this,t))),dh(e.lines,Fh(n,"label",this,t)),dh(e.after,uh(Fh(n,"afterLabel",this,t))),s.push(e)}),s}getAfterBody(t,e){return wh(Fh(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fh(i,"beforeFooter",this,t),n=Fh(i,"footer",this,t),o=Fh(i,"afterFooter",this,t);let a=[];return a=dh(a,uh(s)),a=dh(a,uh(n)),a=dh(a,uh(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;at.filter(e,s,n,i))),t.itemSort&&(l=l.sort((e,s)=>t.itemSort(e,s,i))),He(l,e=>{const i=Mh(t.callbacks,e);s.push(Fh(i,"labelColor",this,e)),n.push(Fh(i,"labelPointStyle",this,e)),o.push(Fh(i,"labelTextColor",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=ch[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=fh(this,i),a=Object.assign({},t,e),r=xh(this.chart,i,a),l=vh(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}=Hs(a),{x:d,y:u}=t,{width:g,height:f}=e;let p,m,b,x,y,_;return"center"===n?(y=u+f/2,"left"===s?(p=d,m=p-o,x=y+o,_=y-o):(p=d+g,m=p+o,x=y-o,_=y+o),b=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+g-Math.max(l,c)-o:this.caretX,"top"===n?(x=u,y=x-o,p=m-o,b=m+o):(x=u+f,y=x+o,p=m+o,b=m-o),_=x),{x1:p,x2:m,x3:b,y1:x,y2:y,y3:_}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Kn(i.rtl,this.x,this.width);for(t.x=kh(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Xs(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Ws(t,{x:e,y:g,w:l,h:r,radius:a}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),Ws(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=Xs(i.bodyFont);let d=c.lineHeight,u=0;const g=Kn(i.rtl,this.x,this.width),f=function(i){e.fillText(i,g.x(t.x+u),t.y+d/2),t.y+=d+n},p=g.textAlign(o);let m,b,x,y,_,v,k;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=kh(this,p,i),e.fillStyle=i.bodyColor,He(this.beforeBody,f),u=a&&"right"!==p?"center"===o?l/2+h:l+2+h:0,y=0,v=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=ch[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=fh(this,t),a=Object.assign({},i,this._size),r=xh(e,t,a),l=vh(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))}}_willRender(){return!!this.opacity}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=qs(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),Qn(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Gn(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=!qe(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||!qe(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.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));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=ch[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}jt(Ph,"positioners",ch);var Th={id:"tooltip",_element:Ph,positioners:ch,afterInit(t,e,i){i&&(t.tooltip=new Ph({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;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;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:Ch},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"]};const Ah=(t,e,i,s)=>("string"===typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i);function Lh(t,e,i,s){const n=t.indexOf(e);if(-1===n)return Ah(t,e,i,s);const o=t.lastIndexOf(e);return n!==o?i:n}const Dh=(t,e)=>null===t?null:Ii(Math.round(t),0,e);function Ih(t){const e=this.getLabels();return t>=0&&te.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 Eh(t,e){const i=[],s=1e-14,{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,g=o||1,f=c-1,{min:p,max:m}=e,b=!Oe(a),x=!Oe(r),y=!Oe(h),_=(m-p)/(d+1);let v,k,w,S,M=yi((m-p)/f/g)*g;if(Mf&&(M=yi(S*M/f/g)*g),Oe(l)||(v=Math.pow(10,l),M=Math.ceil(M*v)/v),"ticks"===n?(k=Math.floor(p/M)*M,w=Math.ceil(m/M)*M):(k=p,w=m),b&&x&&o&&wi((r-a)/o,M/1e3)?(S=Math.round(Math.min((r-a)/M,c)),M=(r-a)/S,k=a,w=r):y?(k=b?a:k,w=x?r:w,S=h-1,M=(w-k)/S):(S=(w-k)/M,S=xi(S,Math.round(S),M/1e3)?Math.round(S):Math.ceil(S));const C=Math.max(Fi(M),Fi(k));v=Math.pow(10,Oe(l)?C:l),k=Math.round(k*v)/v,w=Math.round(w*v)/v;let F=0;for(b&&(u&&k!==a?(i.push({value:a}),kr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&xi(i[i.length-1].value,r,Oh(r,_,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}function Oh(t,e,{horizontal:i,minRotation:s}){const n=Mi(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(""+t).length;return Math.min(e/o,a)}jt(Vh,"id","category"),jt(Vh,"defaults",{ticks:{callback:Ih}});class Rh extends Ar{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 Oe(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=bi(s),e=bi(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1: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={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},n=this._range||this,o=Eh(s,n);return"ticks"===t.bounds&&Si(o,this,"value"),t.reverse?(o.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),o}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 ds(t,this.chart.options.locale,this.options.ticks.format)}}class Wh extends Rh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=ze(t)?t:0,this.max=ze(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=Mi(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}}jt(Wh,"id","linear"),jt(Wh,"defaults",{ticks:{callback:fs.formatters.numeric}});const zh=t=>Math.floor(mi(t)),Bh=(t,e)=>Math.pow(10,zh(t)+e);function Nh(t){const e=t/Math.pow(10,zh(t));return 1===e}function jh(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s),o=Math.ceil(e/s);return o-n}function Uh(t,e){const i=e-t;let s=zh(i);while(jh(t,e,s)>10)s++;while(jh(t,e,s)<10)s--;return Math.min(s,zh(t))}function $h(t,{min:e,max:i}){e=Be(t.min,e);const s=[],n=zh(e);let o=Uh(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const r=Math.pow(10,o),l=n>o?Math.pow(10,n):0,h=Math.round((e-l)*a)/a,c=Math.floor((e-l)/r/10)*r*10;let d=Math.floor((h-c)/Math.pow(10,o)),u=Be(t.min,Math.round((l+c+d*Math.pow(10,o))*a)/a);while(u=10?d=d<15?15:20:d++,d>=20&&(o++,d=2,a=o>=0?1:a),u=Math.round((l+c+d*Math.pow(10,o))*a)/a;const g=Be(t.max,u);return s.push({value:g,major:Nh(g),significand:d}),s}class Hh extends Ar{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Rh.prototype.parse.apply(this,[t,e]);if(0!==i)return ze(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=ze(t)?Math.max(0,t):null,this.max=ze(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!ze(this._userMin)&&(this.min=t===Bh(this.min,0)?Bh(this.min,-1):Bh(this.min,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;i===s&&(i<=0?(n(1),o(10)):(n(Bh(i,-1)),o(Bh(s,1)))),i<=0&&n(Bh(s,-1)),s<=0&&o(Bh(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},i=$h(e,this);return"ticks"===t.bounds&&Si(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return void 0===t?"0":ds(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=mi(t),this._valueRange=mi(this.max)-mi(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(mi(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function qh(t){const e=t.ticks;if(e.display&&t.display){const t=qs(e.backdropPadding);return Ne(e.font&&e.font.size,vs.font.size)+t.height}return 0}function Xh(t,e,i){return i=Re(i)?i:[i],{w:Ss(t,e.string,i),h:i.length*e.lineHeight}}function Yh(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Kh(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?li/o:0;for(let l=0;le.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Gh(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Ci(Li(l.angle+gi))),c=ic(l.y,r.h,h),d=tc(h),u=ec(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Jh(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t,a=Ts({x:i,y:s},e)||Ts({x:i,y:o},e)||Ts({x:n,y:s},e)||Ts({x:n,y:o},e);return!a}function Zh(t,e,i){const s=[],n=t._pointLabels.length,o=t.options,{centerPointLabels:a,display:r}=o.pointLabels,l={extra:qh(o)/2,additionalAngle:a?li/n:0};let h;for(let c=0;c270||i<90)&&(t-=e),t}function sc(t,e,i){const{left:s,top:n,right:o,bottom:a}=i,{backdropColor:r}=e;if(!Oe(r)){const i=Hs(e.borderRadius),l=qs(e.backdropPadding);t.fillStyle=r;const h=s-l.left,c=n-l.top,d=o-s+l.width,u=a-n+l.height;Object.values(i).some(t=>0!==t)?(t.beginPath(),Ws(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function nc(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));sc(i,o,e);const a=Xs(o.font),{x:r,y:l,textAlign:h}=e;Rs(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:"middle"})}}function oc(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,hi);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o{const i=$e(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?Kh(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){const e=hi/(this._pointLabels.length||1),i=this.options.startAngle||0;return Li(t*e+Mi(i))}getDistanceFromCenterForValue(t){if(Oe(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(Oe(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{if(0!==e||0===e&&this.min<0){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);ac(this,a,r,o,l)}}),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.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&&this.min>=0&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Xs(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=qs(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Rs(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})}),t.restore()}drawTitle(){}}jt(lc,"id","radialLinear"),jt(lc,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:fs.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),jt(lc,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),jt(lc,"descriptors",{angleLines:{_fallback:"grid"}});const hc={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}},cc=Object.keys(hc);function dc(t,e){return t-e}function uc(t,e){if(Oe(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)),ze(a)||(a="string"===typeof s?i.parse(a,s):i.parse(a)),null===a?null:(n&&(a="week"!==n||!ki(o)&&!0!==o?i.startOf(a,n):i.startOf(a,"isoWeek",o)),+a)}function gc(t,e,i,s){const n=cc.length;for(let o=cc.indexOf(t);o=cc.indexOf(i);o--){const i=cc[o];if(hc[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return cc[i?cc.indexOf(i):0]}function pc(t){for(let e=cc.indexOf(t)+1,i=cc.length;e=e?i[s]:i[n];t[o]=!0}}else t[e]=!0}function bc(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}function xc(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a+t.value))}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=Ii(s,0,o),n=Ii(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||gc(n.minUnit,e,i,this._getLabelCapacity(e)),a=Ne(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,l=ki(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 g="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;c+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)}format(t,e){const i=this.options,s=i.time.displayFormats,n=this._unit,o=e||s[n];return this._adapter.format(t,o)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return $e(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],d=i[e],u=l&&c&&d&&d.major;return this._adapter.format(t,s||(u?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?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=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=Ri(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}=Ri(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}jt(yc,"id","time"),jt(yc,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class vc extends yc{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=_c(e,this.min),this._tableRange=_c(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=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;ot-e)}_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(_c(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return _c(this._table,i*this._tableRange+this._minPos,!0)}}jt(vc,"id","timeseries"),jt(vc,"defaults",yc.defaults);var kc=i(144);const wc={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},Sc={ariaLabel:{type:String},ariaDescribedby:{type:String}},Mc={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...wc,...Sc},Cc="2"===s.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Fc(t){return(0,kc.ju)(t)?(0,kc.ux)(t):t}function Pc(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,kc.ju)(e)?new Proxy(t,{}):t}function Tc(t,e){const i=t.options;i&&e&&Object.assign(i,e)}function Ac(t,e){t.labels=e}function Lc(t,e,i){const s=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[i]===e[i]);return n&&e.data&&!s.includes(n)?(s.push(n),Object.assign(n,e),n):{...e}})}function Dc(t,e){const i={labels:[],datasets:[]};return Ac(i,t.labels),Lc(i,t.datasets,e),i}const Ic=(0,s.pM)({props:Mc,setup(t,e){let{expose:i,slots:n}=e;const o=(0,kc.KR)(null),a=(0,kc.IJ)(null);i({chart:a});const r=()=>{if(!o.value)return;const{type:e,data:i,options:s,plugins:n,datasetIdKey:r}=t,l=Dc(i,r),h=Pc(l,i);a.value=new yl(o.value,{type:e,data:h,options:{...s},plugins:n})},l=()=>{const e=(0,kc.ux)(a.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),a.value=null},t.destroyDelay):(e.destroy(),a.value=null))},h=e=>{e.update(t.updateMode)};return(0,s.sV)(r),(0,s.hi)(l),(0,s.wB)([()=>t.options,()=>t.data],(e,i)=>{let[n,o]=e,[r,l]=i;const c=(0,kc.ux)(a.value);if(!c)return;let d=!1;if(n){const t=Fc(n),e=Fc(r);t&&t!==e&&(Tc(c,t),d=!0)}if(o){const e=Fc(o.labels),i=Fc(l.labels),s=Fc(o.datasets),n=Fc(l.datasets);e!==i&&(Ac(c.config.data,e),d=!0),s&&s!==n&&(Lc(c.config.data,s,t.datasetIdKey),d=!0)}d&&(0,s.dY)(()=>{h(c)})},{deep:!0}),()=>(0,s.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:o},[(0,s.h)("p",{},[n.default?n.default():""])])}});function Vc(t,e){return yl.register(e),(0,s.pM)({props:wc,setup(e,i){let{expose:n}=i;const o=(0,kc.IJ)(null),a=t=>{o.value=t?.chart};return n({chart:o}),()=>(0,s.h)(Ic,Cc({ref:a},{type:t,...e}))}})}const Ec=Vc("doughnut",aa);yl.register(Tl,Th,hh);var Oc={name:"SysCogStatus",components:{Doughnut:Ec},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Wt.rE,loadErrors:{newest:!1,oldest:!1},channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"]}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.indexInfo.typeStats||{};return{labels:Object.keys(t).map(t=>t||"未知类型"),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{label:t=>{const e=t.raw,i=t.dataset.data.reduce((t,e)=>t+e,0),s=(e/i*100).toFixed(1);return` ${e.toLocaleString()} (${s}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},async fetchIndexInfo(){this.loading=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=info",{method:"GET"});if(!t.ok)throw new Error("API请求失败");{const e=await t.json();this.indexInfo=e}}catch(t){console.error("获取索引信息失败:",t),this.$message.error("获取索引信息失败")}finally{this.loading=!1}},async rebuildIndex(){this.rebuilding=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=rebuild",{method:"GET"});if(!t.ok)throw new Error("API请求失败");this.$message.success("索引重建已启动,请稍后刷新查看最新状态"),setTimeout(()=>{this.fetchIndexInfo()},3e3)}catch(t){console.error("重建索引失败:",t),this.$message.error("重建索引失败")}finally{this.rebuilding=!1}},async backupData(){this.backing=!0;try{const t=await(0,Rt.A)("/api/manage/sysConfig/backup?action=backup",{method:"GET"});if(!t.ok){const e=await t.json();throw new Error(e.error||"API请求失败")}{const e=await t.blob(),i=window.URL.createObjectURL(e),s=document.createElement("a");s.href=i,s.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(s),s.click(),document.body.removeChild(s),window.URL.revokeObjectURL(i),this.$message.success("备份文件已下载")}}catch(t){console.error("备份数据失败:",t),this.$message.error("备份数据失败: "+t.message)}finally{this.backing=!1}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm("恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","确认恢复",{confirmButtonText:"确定恢复",cancelButtonText:"取消",type:"warning"}),await this.restoreData(e)}catch(i){"cancel"!==i&&console.error("确认恢复失败:",i)}t.target.value=""}else this.$message.error("请选择JSON格式的备份文件")},async restoreData(t){this.restoring=!0;try{const e=await(0,Rt.A)("/api/manage/sysConfig/backup?action=restore",{method:"POST",headers:{"Content-Type":"application/json"},body:await t.text()});if(!e.ok){const t=await e.json();throw new Error(t.error||"API请求失败")}{const t=await e.json();this.$message.success(`恢复完成!已恢复 ${t.stats.restoredFiles} 个文件和 ${t.stats.restoredSettings} 个设置项`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}}catch(e){console.error("恢复数据失败:",e),this.$message.error("恢复数据失败: "+e.message)}finally{this.restoring=!1}},formatTime(t){if(!t)return"未知";const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),i=e-t,s=Math.floor(i/6e4),n=Math.floor(i/36e5),o=Math.floor(i/864e5);return o>0?`${o}天前`:n>0?`${n}小时前`:s>0?`${s}分钟前`:"刚刚"},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return s.includes(i)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return s.includes(i)}}};const Rc=(0,c.A)(Oc,[["render",Ot],["__scopeId","data-v-54756a6a"]]);var Wc=Rc,zc=i(9655),Bc=(i(2893),i(1418)),Nc=(i(333),i(9623)),jc=(i(6711),i(2006)),Uc=i(5558),$c=(i(8075),i(6810));i(4396),i(4885);const Hc={class:"upload-settings"},qc={class:"upload-channel"},Xc={class:"first-title"},Yc={class:"channel-settings"},Kc={class:"second-title"},Qc={key:0},Gc={key:1},Jc={class:"quota-status"},Zc={key:2},td={class:"quota-status"},ed={key:3},id={class:"discord-limit-tip"},sd={class:"actions"};function nd(t,e,i,o,a,r){const l=(0,s.g2)("font-awesome-icon"),h=f.R7,c=$c.ll,d=$c.MQ,u=Uc.qi,g=jc.xE,p=jc.US,m=Nc.WK,b=k.S2,x=Bc.lq,y=zc.ve,v=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Hc,[(0,s.Lk)("div",qc,[(0,s.Lk)("h3",Xc,[e[4]||(e[4]=(0,s.eW)("上传渠道 ",-1)),(0,s.bF)(h,{content:"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{modelValue:a.activeChannel,"onUpdate:modelValue":e[0]||(e[0]=t=>a.activeChannel=t)},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.channels,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.value},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])]),(0,s.Lk)("div",Yc,[(0,s.Lk)("h4",Kc,[(0,s.eW)((0,n.v_)(r.activeChannelLabel)+" 设置 ",1),"telegram"===a.activeChannel?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})):(0,s.Q3)("",!0)]),"telegram"===a.activeChannel?((0,s.uX)(),(0,s.CE)("div",Qc,[(0,s.bF)(p,{model:a.telegramSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.telegramSettings.loadBalance.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>a.telegramSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.telegramSettings.channels,(t,e)=>((0,s.uX)(),(0,s.Wv)(p,{key:e,model:t,"label-position":"top",rules:a.tgRules,ref_for:!0,ref:"tgChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.chatId,"onUpdate:modelValue":e=>t.chatId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(e),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0),"cfr2"===a.activeChannel?((0,s.uX)(),(0,s.CE)("div",Gc,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.cfr2Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(p,{model:t,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[5]||(e[5]=(0,s.eW)(" 公开访问链接 ",-1)),(0,s.bF)(h,{content:"若启用图像审查,请设置该项",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.publicUrl,"onUpdate:modelValue":e=>t.publicUrl=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[6]||(e[6]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[7]||(e[7]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[8]||(e[8]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:a.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Jc,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0)]),_:2},1032,["model"]))),256))])):(0,s.Q3)("",!0),"s3"===a.activeChannel?((0,s.uX)(),(0,s.CE)("div",Zc,[(0,s.bF)(p,{model:a.s3Settings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.s3Settings.loadBalance.enabled,"onUpdate:modelValue":e[2]||(e[2]=t=>a.s3Settings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.s3Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(p,{model:t,"label-position":"top",rules:a.s3Rules,ref_for:!0,ref:"s3ChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{prop:"endpoint"},{label:(0,s.k6)(()=>[e[9]||(e[9]=(0,s.eW)(" Endpoint ",-1)),(0,s.bF)(h,{content:"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.endpoint,"onUpdate:modelValue":e=>t.endpoint=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"路径风格",prop:"pathStyle"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.pathStyle,"onUpdate:modelValue":e=>t.pathStyle=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.bucketName,"onUpdate:modelValue":e=>t.bucketName=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.region,"onUpdate:modelValue":e=>t.region=e,placeholder:"默认填写 auto 即可",disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.accessKeyId,"onUpdate:modelValue":e=>t.accessKeyId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.secretAccessKey,"onUpdate:modelValue":e=>t.secretAccessKey=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[10]||(e[10]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[11]||(e[11]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[12]||(e[12]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:a.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",td,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),256))])):(0,s.Q3)("",!0),"discord"===a.activeChannel?((0,s.uX)(),(0,s.CE)("div",ed,[(0,s.bF)(p,{model:a.discordSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.discordSettings.loadBalance.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>a.discordSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.discordSettings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(p,{key:i,model:t,"label-position":"top",rules:a.discordRules,ref_for:!0,ref:"discordChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.channelId,"onUpdate:modelValue":e=>t.channelId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[13]||(e[13]=(0,s.eW)(" 代理域名 ",-1)),(0,s.bF)(h,{content:"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.proxyUrl,"onUpdate:modelValue":e=>t.proxyUrl=e,placeholder:"例如: your-proxy.example.com"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[14]||(e[14]=(0,s.eW)(" Nitro 会员 ",-1)),(0,s.bF)(h,{content:"开启后单文件限制提升至 25MB,关闭则为 10MB",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.isNitro,"onUpdate:modelValue":e=>t.isNitro=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",id,[(0,s.bF)(l,{icon:"info-circle",style:{"margin-right":"5px"}}),(0,s.eW)(" "+(0,n.v_)(t.isNitro?"Nitro 会员单文件限制 25MB,超过将自动切换其他渠道":"Discord 免费用户单文件限制 10MB,超过将自动切换其他渠道"),1)])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0)]),(0,s.Lk)("div",sd,[(0,s.bF)(b,{type:"primary",onClick:r.addChannel},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"plus"})]),_:1},8,["onClick"]),(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[15]||(e[15]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[v,a.loading]])}i(1148);var od={data(){return{channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlareR2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"}],activeChannel:"telegram",telegramSettings:{loadBalance:{},channels:[]},tgRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.telegramSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Telegram_env"===e){const t=this.telegramSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{},channels:[]},discordSettings:{loadBalance:{},channels:[]},discordRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.discordSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Discord_env"===e){const t=this.discordSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",trigger:"blur"}]},quotaStats:{},quotaLoading:!1,s3Rules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.s3Settings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("S3_env"===e){const t=this.s3Settings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],endpoint:[{required:!0,message:"请输入 Endpoint",trigger:"blur"}],bucketName:[{required:!0,message:"请输入存储桶名称",trigger:"blur"}],region:[{required:!0,message:"请输入存储桶区域",trigger:"blur"}],accessKeyId:[{required:!0,message:"请输入访问密钥 ID",trigger:"blur"}],secretAccessKey:[{required:!0,message:"请输入机密访问密钥",trigger:"blur"}]},loading:!1}},computed:{activeChannelLabel(){const t=this.channels.find(t=>t.value===this.activeChannel);return t?t.label:""}},methods:{addChannel(){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.push({id:this.telegramSettings.channels.length+1,name:"",type:"telegram",savePath:"database",botToken:"",chatId:"",enabled:!0,fixed:!1});break;case"cfr2":this.$message.error("R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加");break;case"s3":this.s3Settings.channels.push({id:this.s3Settings.channels.length+1,name:"",type:"s3",savePath:"database",accessKeyId:"",secretAccessKey:"",region:"",bucketName:"",endpoint:"",pathStyle:!1,enabled:!0,fixed:!1,quota:{enabled:!1,limitGB:10,threshold:95}});break;case"discord":this.discordSettings.channels.push({id:this.discordSettings.channels.length+1,name:"",type:"discord",savePath:"database",botToken:"",channelId:"",proxyUrl:"",isNitro:!1,enabled:!0,fixed:!1});break}},deleteChannel(t){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.telegramSettings.channels.splice(t,1);break;case"cfr2":this.cfr2Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.cfr2Settings.channels.splice(t,1);break;case"s3":this.s3Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.s3Settings.channels.splice(t,1);break;case"discord":this.discordSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.discordSettings.channels.splice(t,1);break}},saveSettings(){let t=[];this.$refs.tgChannelForm&&this.$refs.tgChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.s3ChannelForm&&this.$refs.s3ChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.discordChannelForm&&this.$refs.discordChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings};(0,Rt.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存")})})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10,s=e/i*100;return Math.min(100,Math.round(10*s)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${i} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?`⚠️ 已达到容量阈值 (${i}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm("首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","初始化容量统计",{confirmButtonText:"立即统计",cancelButtonText:"稍后手动统计",type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info("您可以稍后点击刷新按钮手动统计")})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info("正在统计容量,请稍候...");const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success("容量统计完成")):this.$message.error("统计失败: "+(e.error||"未知错误"))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error("统计失败")}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const ad=(0,c.A)(od,[["render",nd],["__scopeId","data-v-f5e0f39c"]]);var rd=ad,ld=i(9267),hd=(i(5616),i(850)),cd=(i(8736),i(6018)),dd=(i(6808),i(200),i(7138)),ud=(i(5802),i(2687)),gd=(i(8785),i(4752),i(5130));const fd={class:"security-settings"},pd={class:"first-settings"},md={class:"second-title token-title"},bd={class:"token-actions"},xd={class:"token-table-container"},yd={class:"table-cell-content"},_d={class:"table-cell-content"},vd={class:"token-display"},kd={class:"table-cell-content"},wd={class:"table-cell-content"},Sd={class:"table-cell-content action-buttons"},Md={class:"first-settings"},Cd={class:"second-title"},Fd={class:"first-settings"},Pd={class:"actions"},Td={class:"dialog-footer"},Ad={class:"dialog-footer"},Ld={class:"token-result"},Dd={style:{"margin-bottom":"15px",color:"#e6a23c"}},Id={class:"dialog-footer"};function Vd(t,e,i,o,a,r){const l=Nc.WK,h=jc.xE,c=jc.US,d=(0,s.g2)("font-awesome-icon"),u=k.S2,g=dd.o8,p=ud.u,m=dd.Up,b=f.R7,x=Uc.qi,y=cd.P9,v=cd.AV,w=hd.dI,S=hd.o5,M=ld.kZ,C=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",fd,[(0,s.Lk)("div",pd,[e[26]||(e[26]=(0,s.Lk)("h3",{class:"first-title"},"认证管理",-1)),e[27]||(e[27]=(0,s.Lk)("h4",{class:"second-title"},"用户端认证",-1)),(0,s.bF)(c,{model:a.authSettings.user,rules:a.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"上传密码",prop:"authCode"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>a.authSettings.user.authCode=t),type:"password","show-password":"",onInput:r.handleUserPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(gd.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[a.showUserPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>a.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),e[28]||(e[28]=(0,s.Lk)("h4",{class:"second-title"},"管理端认证",-1)),(0,s.bF)(c,{model:a.authSettings.admin,rules:a.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"用户名",prop:"adminUsername"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.authSettings.admin.adminUsername,"onUpdate:modelValue":e[2]||(e[2]=t=>a.authSettings.admin.adminUsername=t),autocomplete:"new-password"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"密码",prop:"adminPassword"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.authSettings.admin.adminPassword,"onUpdate:modelValue":e[3]||(e[3]=t=>a.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:r.handleAdminPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(gd.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[a.showAdminPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>a.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,s.Lk)("h4",md,[e[23]||(e[23]=(0,s.eW)("API Token 管理 ",-1)),(0,s.Lk)("a",bd,[(0,s.bF)(u,{type:"primary",size:"small",onClick:e[5]||(e[5]=t=>a.showCreateTokenDialog=!0),circle:""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"plus"})]),_:1})])]),(0,s.Lk)("div",xd,[(0,s.bo)(((0,s.uX)(),(0,s.Wv)(m,{data:a.apiTokens,class:"token-table"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{prop:"name",label:"名称","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",yd,(0,n.v_)(t.row.name),1)]),_:1}),(0,s.bF)(g,{prop:"token",label:"Token","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",_d,[(0,s.Lk)("span",vd,(0,n.v_)(t.row.token),1)])]),_:1}),(0,s.bF)(g,{prop:"permissions",label:"权限","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",kd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.row.permissions,t=>((0,s.uX)(),(0,s.Wv)(p,{key:t,size:"small",class:"permission-tag"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1}),(0,s.bF)(g,{prop:"createdAt",label:"创建时间","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",wd,(0,n.v_)(r.formatDate(t.row.createdAt)),1)]),_:1}),(0,s.bF)(g,{label:"操作",fixed:"right","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",Sd,[(0,s.bF)(u,{class:"action-button",size:"small",onClick:e=>r.editToken(t.row)},{default:(0,s.k6)(()=>[...e[24]||(e[24]=[(0,s.eW)("编辑",-1)])]),_:1},8,["onClick"]),(0,s.bF)(u,{class:"action-button",size:"small",type:"danger",onClick:e=>r.deleteToken(t.row.id)},{default:(0,s.k6)(()=>[...e[25]||(e[25]=[(0,s.eW)("删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data"])),[[C,a.tokenLoading]])])]),(0,s.Lk)("div",Md,[e[30]||(e[30]=(0,s.Lk)("h3",{class:"first-title"},"上传管理",-1)),(0,s.Lk)("h4",Cd,[e[29]||(e[29]=(0,s.eW)("图像审查 ",-1)),(0,s.bF)(b,{content:"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(c,{model:a.uploadSettings.moderate,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"开启审查"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:a.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>a.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:a.uploadSettings.moderate.channel,"onUpdate:modelValue":e[7]||(e[7]=t=>a.uploadSettings.moderate.channel=t),placeholder:"请选择审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,s.bF)(y,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue"])]),_:1}),"moderatecontent.com"===a.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:0,label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[8]||(e[8]=t=>a.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0),"nsfwjs"===a.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:1,label:"API 路径"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[9]||(e[9]=t=>a.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1},8,["model"])]),(0,s.Lk)("div",Fd,[e[33]||(e[33]=(0,s.Lk)("h3",{class:"first-title"},"访问管理",-1)),e[34]||(e[34]=(0,s.Lk)("h4",{class:"second-title"},"域名过滤",-1)),(0,s.bF)(c,{model:a.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[31]||(e[31]=(0,s.eW)(" 放行域名 ",-1)),(0,s.bF)(b,{content:"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.accessSettings.allowedDomains,"onUpdate:modelValue":e[10]||(e[10]=t=>a.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),e[35]||(e[35]=(0,s.Lk)("h4",{class:"second-title"},"白名单模式",-1)),(0,s.bF)(c,{model:a.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[32]||(e[32]=(0,s.eW)(" 是否开启 ",-1)),(0,s.bF)(b,{content:"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:a.accessSettings.whiteListMode,"onUpdate:modelValue":e[11]||(e[11]=t=>a.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Pd,[(0,s.bF)(u,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[36]||(e[36]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])]),(0,s.bF)(M,{modelValue:a.showCreateTokenDialog,"onUpdate:modelValue":e[15]||(e[15]=t=>a.showCreateTokenDialog=t),title:"创建新 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Td,[(0,s.bF)(u,{onClick:e[14]||(e[14]=t=>a.showCreateTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[40]||(e[40]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.createToken},{default:(0,s.k6)(()=>[...e[41]||(e[41]=[(0,s.eW)("创建",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:a.newToken,rules:a.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.newToken.name,"onUpdate:modelValue":e[12]||(e[12]=t=>a.newToken.name=t),placeholder:"请输入Token名称"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:a.newToken.permissions,"onUpdate:modelValue":e[13]||(e[13]=t=>a.newToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[37]||(e[37]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[38]||(e[38]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[39]||(e[39]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:a.showEditTokenDialog,"onUpdate:modelValue":e[19]||(e[19]=t=>a.showEditTokenDialog=t),title:"编辑 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Ad,[(0,s.bF)(u,{onClick:e[18]||(e[18]=t=>a.showEditTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[45]||(e[45]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.updateToken},{default:(0,s.k6)(()=>[...e[46]||(e[46]=[(0,s.eW)("更新",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:a.editingToken,rules:a.tokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.editingToken.name,"onUpdate:modelValue":e[16]||(e[16]=t=>a.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:a.editingToken.permissions,"onUpdate:modelValue":e[17]||(e[17]=t=>a.editingToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[42]||(e[42]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[43]||(e[43]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[44]||(e[44]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:a.showTokenResultDialog,"onUpdate:modelValue":e[22]||(e[22]=t=>a.showTokenResultDialog=t),title:"Token 创建成功",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Id,[(0,s.bF)(u,{type:"primary",onClick:e[21]||(e[21]=t=>a.showTokenResultDialog=!1)},{default:(0,s.k6)(()=>[...e[49]||(e[49]=[(0,s.eW)("我已保存",-1)])]),_:1})])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Ld,[(0,s.Lk)("p",Dd,[(0,s.bF)(d,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),e[47]||(e[47]=(0,s.eW)(" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! ",-1))]),(0,s.bF)(c,{"label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.Lk)("span",null,(0,n.v_)(a.createdToken.name),1)]),_:1}),(0,s.bF)(h,{label:"完整Token"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:a.createdToken.token,"onUpdate:modelValue":e[20]||(e[20]=t=>a.createdToken.token=t),readonly:""},{append:(0,s.k6)(()=>[(0,s.bF)(u,{onClick:r.copyToken},{default:(0,s.k6)(()=>[...e[48]||(e[48]=[(0,s.eW)("复制",-1)])]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue","width"])])),[[C,a.loading]])}var Ed={data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{}},accessSettings:{},apiTokens:[],loading:!1,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,newToken:{name:"",owner:"",permissions:[]},editingToken:{id:"",name:"",owner:"",permissions:[]},createdToken:{name:"",token:""},userPassRules:{authCode:[{validator:(t,e,i)=>{const s=["%","&","?","#","/"],n=s.some(t=>e&&e.includes(t));n?i(new Error("密码不能包含部分URL保留字符: % & ? # /")):i()},trigger:"blur"}],confirmNewUserPassword:[{message:"请再次输入上传密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.user.authCode?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},adminPassRules:{confirmNewAdminPassword:[{message:"请再次输入管理密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.admin.adminPassword?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},tokenRules:{name:[{required:!0,message:"请输入Token名称",trigger:"blur"}],permissions:[{required:!0,message:"请选择权限",trigger:"change"}]}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"}},methods:{handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},getPermissionText(t){const e={upload:"上传",delete:"删除",list:"列出"};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Rt.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error("获取Token列表失败")}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.newToken)}),e=await t.json();t.ok?(this.createdToken={name:e.name,token:e.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[]},await this.loadApiTokens(),this.$message.success("Token创建成功")):this.$message.error(e.error||"Token创建失败")}catch(e){this.$message.error("Token创建失败")}})},editToken(t){this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions]},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions})}),e=await t.json();t.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success("Token权限更新成功")):this.$message.error(e.error||"Token更新失败")}catch(e){this.$message.error("Token更新失败")}})},async deleteToken(t){try{await this.$confirm("此操作将永久删除该Token,是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const e=await(0,Rt.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),i=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success("Token删除成功")):this.$message.error(i.error||"Token删除失败")}catch(e){"cancel"!==e&&this.$message.error("Token删除失败")}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success("Token已复制到剪贴板")}catch(t){this.$message.error("复制失败,请手动复制")}},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete i.auth.user.confirmNewUserPassword,delete i.auth.admin.confirmNewAdminPassword,(0,Rt.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存"),this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1})})}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=t.upload,this.accessSettings=t.access,this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Od=(0,c.A)(Ed,[["render",Vd],["__scopeId","data-v-3b7344a0"]]);var Rd=Od;const Wd={class:"page-settings"},zd={class:"first-title"},Bd={class:"actions"};function Nd(t,e,i,o,a,r){const l=(0,s.g2)("font-awesome-icon"),h=f.R7,c=cd.P9,d=cd.AV,u=Uc.qi,g=Nc.WK,p=jc.xE,m=jc.US,b=k.S2,x=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Wd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.groupedSettings,(t,e)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"first-settings"},[(0,s.Lk)("h3",zd,(0,n.v_)(e),1),(0,s.bF)(m,{model:a.settings,"label-width":"150px"},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t,(t,e)=>((0,s.uX)(),(0,s.Wv)(p,{key:t.id},{label:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label)+" ",1),t.tooltip?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:t.tooltip,placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,s.Q3)("",!0)]),default:(0,s.k6)(()=>["select"===t.type?((0,s.uX)(),(0,s.Wv)(d,{key:0,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder,style:{width:"100%"}},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.options,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===t.type?((0,s.uX)(),(0,s.Wv)(u,{key:1,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):((0,s.uX)(),(0,s.Wv)(g,{key:2,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"]))]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,s.Lk)("div",Bd,[(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[0]||(e[0]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[x,a.loading]])}var jd={data(){return{settings:{config:[]},loading:!1}},computed:{groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const i=e.category||"其他设置";t[i]||(t[i]=[]),t[i].push(e)}),t}},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const Ud=(0,c.A)(jd,[["render",Nd],["__scopeId","data-v-7b059a1c"]]);var $d=Ud;const Hd={class:"others-settings"},qd={class:"first-settings"},Xd={class:"first-title"},Yd={class:"first-title"},Kd={class:"first-title"},Qd={class:"first-title"},Gd={class:"actions"};function Jd(t,e,i,n,o,a){const r=(0,s.g2)("font-awesome-icon"),l=f.R7,h=Uc.qi,c=jc.xE,d=jc.US,u=Nc.WK,g=k.S2,p=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Hd,[(0,s.Lk)("div",qd,[(0,s.Lk)("h3",Xd,[e[9]||(e[9]=(0,s.eW)("远端遥测 ",-1)),(0,s.bF)(l,{content:"便于问题查找和定位,建议开启",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>o.settings.telemetry.enabled=t),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Yd,[e[10]||(e[10]=(0,s.eW)("随机图像API ",-1)),(0,s.bF)(l,{content:"API具体用法请查阅文档",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>o.settings.randomImageAPI.enabled=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"randomImageAPI.allowedDir"},{label:(0,s.k6)(()=>[e[11]||(e[11]=(0,s.Lk)("span",null,"目录",-1)),(0,s.bF)(l,{content:"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[2]||(e[2]=t=>o.settings.randomImageAPI.allowedDir=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Kd,[e[12]||(e[12]=(0,s.eW)("CloudFlare API Token ",-1)),(0,s.bF)(l,{content:"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"区域ID"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[3]||(e[3]=t=>o.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"账户邮箱"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[4]||(e[4]=t=>o.settings.cloudflareApiToken.CF_EMAIL=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[5]||(e[5]=t=>o.settings.cloudflareApiToken.CF_API_KEY=t),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Qd,[e[13]||(e[13]=(0,s.eW)("WebDAV ",-1)),(0,s.bF)(l,{content:"启用后,可以通过WebDAV协议访问和管理图片",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.settings.webDAV.enabled=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"用户名"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":e[7]||(e[7]=t=>o.settings.webDAV.username=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"密码"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":e[8]||(e[8]=t=>o.settings.webDAV.password=t),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Gd,[(0,s.bF)(g,{type:"primary",onClick:a.saveSettings},{default:(0,s.k6)(()=>[...e[14]||(e[14]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[p,o.loading]])}var Zd={data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{}},loading:!1}},computed:{},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1})}};const tu=(0,c.A)(Zd,[["render",Jd],["__scopeId","data-v-03514366"]]);var eu=tu,iu={name:"SystemConfig",data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:p.A,SysConfigTabs:u,SysCogStatus:Wc,SysCogUpload:rd,SysCogSecurity:Rd,SysCogPage:$d,SysCogOthers:eu},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return Wc;case"upload":return rd;case"security":return Rd;case"page":return $d;case"others":return eu;default:return Wc}}},methods:{handleLogout(){this.$store.commit("setCredentials",null),this.$router.push("/adminLogin")},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){window.location.hash||this.setDefaultHash()}};const su=(0,c.A)(iu,[["render",y],["__scopeId","data-v-c5d2c9c2"]]);var nu=su},2893:function(t,e,i){i(5331)},4396:function(t,e,i){i(5331),i(4885)},4752:function(t,e,i){i(5331),i(8736),i(8785)},4885:function(t,e,i){i(5331)},5616:function(t,e,i){i(5331),i(7197)},5802:function(t,e,i){i(5331),i(8736),i(213),i(5970)}}]); +//# sourceMappingURL=357.c54040b4.js.map \ No newline at end of file diff --git a/js/357.c54040b4.js.gz b/js/357.c54040b4.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..a35f2215b5fd0faa76787d4fc173d8d2f8b98360 GIT binary patch literal 82344 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

Ihh!ojA>31ioOvMWMobg%iE%Q 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≪HVzOv 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 G4g>(hiQO6i literal 0 HcmV?d00001 diff --git a/js/357.c54040b4.js.map b/js/357.c54040b4.js.map new file mode 100644 index 00000000..29e79457 --- /dev/null +++ b/js/357.c54040b4.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/357.c54040b4.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/SysConfigTabs.vue?60fe","webpack://sanyue_imghub/./src/components/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/SysConfigTabs.vue?909a","webpack://sanyue_imghub/./src/views/SystemConfig.vue?5830","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?b122","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://sanyue_imghub/./node_modules/@kurkle/color/dist/color.esm.js","webpack://sanyue_imghub/../../src/helpers/helpers.core.ts","webpack://sanyue_imghub/../../src/helpers/helpers.math.ts","webpack://sanyue_imghub/../../src/helpers/helpers.collection.ts","webpack://sanyue_imghub/../../src/helpers/helpers.extras.ts","webpack://sanyue_imghub/../../src/helpers/helpers.easing.ts","webpack://sanyue_imghub/../../src/helpers/helpers.color.ts","webpack://sanyue_imghub/../../src/core/core.animations.defaults.js","webpack://sanyue_imghub/../../src/core/core.layouts.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.intl.ts","webpack://sanyue_imghub/../../src/core/core.ticks.js","webpack://sanyue_imghub/../../src/core/core.scale.defaults.js","webpack://sanyue_imghub/../../src/core/core.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.canvas.ts","webpack://sanyue_imghub/../../src/helpers/helpers.options.ts","webpack://sanyue_imghub/../../src/helpers/helpers.config.ts","webpack://sanyue_imghub/../../src/helpers/helpers.curve.ts","webpack://sanyue_imghub/../../src/helpers/helpers.dom.ts","webpack://sanyue_imghub/../../src/helpers/helpers.interpolation.ts","webpack://sanyue_imghub/../../src/helpers/helpers.rtl.ts","webpack://sanyue_imghub/../../src/helpers/helpers.segment.js","webpack://sanyue_imghub/../../src/helpers/helpers.dataset.ts","webpack://sanyue_imghub/../src/core/core.animator.js","webpack://sanyue_imghub/../src/core/core.animation.js","webpack://sanyue_imghub/../src/core/core.animations.js","webpack://sanyue_imghub/../src/core/core.datasetController.js","webpack://sanyue_imghub/../src/controllers/controller.bar.js","webpack://sanyue_imghub/../src/controllers/controller.bubble.js","webpack://sanyue_imghub/../src/controllers/controller.doughnut.js","webpack://sanyue_imghub/../src/controllers/controller.line.js","webpack://sanyue_imghub/../src/controllers/controller.polarArea.js","webpack://sanyue_imghub/../src/controllers/controller.pie.js","webpack://sanyue_imghub/../src/controllers/controller.radar.js","webpack://sanyue_imghub/../src/controllers/controller.scatter.js","webpack://sanyue_imghub/../src/core/core.adapters.ts","webpack://sanyue_imghub/../src/core/core.interaction.js","webpack://sanyue_imghub/../src/core/core.layouts.js","webpack://sanyue_imghub/../src/platform/platform.base.js","webpack://sanyue_imghub/../src/platform/platform.basic.js","webpack://sanyue_imghub/../src/platform/platform.dom.js","webpack://sanyue_imghub/../src/platform/index.js","webpack://sanyue_imghub/../src/core/core.element.ts","webpack://sanyue_imghub/../src/core/core.scale.autoskip.js","webpack://sanyue_imghub/../src/core/core.scale.js","webpack://sanyue_imghub/../src/core/core.typedRegistry.js","webpack://sanyue_imghub/../src/core/core.registry.js","webpack://sanyue_imghub/../src/core/core.plugins.js","webpack://sanyue_imghub/../src/core/core.config.js","webpack://sanyue_imghub/../src/core/core.controller.js","webpack://sanyue_imghub/../src/elements/element.arc.ts","webpack://sanyue_imghub/../src/elements/element.line.js","webpack://sanyue_imghub/../src/elements/element.point.ts","webpack://sanyue_imghub/../src/elements/element.bar.js","webpack://sanyue_imghub/../src/plugins/plugin.legend.js","webpack://sanyue_imghub/../src/plugins/plugin.subtitle.js","webpack://sanyue_imghub/../src/plugins/plugin.tooltip.js","webpack://sanyue_imghub/../src/scales/scale.category.js","webpack://sanyue_imghub/../src/scales/scale.linearbase.js","webpack://sanyue_imghub/../src/scales/scale.linear.js","webpack://sanyue_imghub/../src/scales/scale.logarithmic.js","webpack://sanyue_imghub/../src/scales/scale.radialLinear.js","webpack://sanyue_imghub/../src/scales/scale.time.js","webpack://sanyue_imghub/../src/scales/scale.timeseries.js","webpack://sanyue_imghub/../src/props.ts","webpack://sanyue_imghub/../src/utils.ts","webpack://sanyue_imghub/../src/chart.ts","webpack://sanyue_imghub/../src/typedCharts.ts","webpack://sanyue_imghub/./src/components/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?535e","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?57c2","webpack://sanyue_imghub/./src/components/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?5e68","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?22c7","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?e29e","webpack://sanyue_imghub/./src/components/SysCogPage.vue?9732","webpack://sanyue_imghub/./src/components/SysCogPage.vue","webpack://sanyue_imghub/./src/components/SysCogPage.vue?c23d","webpack://sanyue_imghub/./src/components/SysCogOthers.vue?0def","webpack://sanyue_imghub/./src/components/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/SysCogOthers.vue?ad31","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269"],"sourcesContent":["import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"menu-list\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"menu-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"sidebar-container\", {\n 'is-collapsed': $props.isCollapse\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.menuItems, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(item.title), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 2);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n title: '系统状态'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n title: '上传设置'\n }, {\n index: 'security',\n icon: 'shield',\n title: '安全设置'\n }, {\n index: 'page',\n icon: 'pager',\n title: '网页设置'\n }, {\n index: 'others',\n icon: 'cog',\n title: '其他设置'\n }]\n };\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n }\n },\n mounted() {\n this.checkMobile();\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=2bd8175a&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=2bd8175a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2bd8175a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: \"退出登录\",\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createTextVNode as _createTextVNode, withCtx as _withCtx, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-value\"\n};\nconst _hoisted_6 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_7 = {\n class: \"card-icon\"\n};\nconst _hoisted_8 = {\n class: \"card-content\"\n};\nconst _hoisted_9 = {\n class: \"card-value\"\n};\nconst _hoisted_10 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_11 = {\n class: \"card-icon\"\n};\nconst _hoisted_12 = {\n class: \"card-content\"\n};\nconst _hoisted_13 = {\n class: \"card-value\"\n};\nconst _hoisted_14 = {\n class: \"charts-section\"\n};\nconst _hoisted_15 = {\n class: \"chart-card\"\n};\nconst _hoisted_16 = {\n class: \"chart-header\"\n};\nconst _hoisted_17 = {\n class: \"chart-content\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_20 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_21 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_22 = {\n class: \"center-value\"\n};\nconst _hoisted_23 = {\n class: \"chart-legend\"\n};\nconst _hoisted_24 = {\n class: \"legend-label\"\n};\nconst _hoisted_25 = {\n class: \"legend-value\"\n};\nconst _hoisted_26 = {\n class: \"legend-percent\"\n};\nconst _hoisted_27 = {\n class: \"chart-card\"\n};\nconst _hoisted_28 = {\n class: \"chart-header\"\n};\nconst _hoisted_29 = {\n class: \"chart-content\"\n};\nconst _hoisted_30 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_32 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_33 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_34 = {\n class: \"center-value\"\n};\nconst _hoisted_35 = {\n class: \"chart-legend\"\n};\nconst _hoisted_36 = {\n class: \"legend-label\"\n};\nconst _hoisted_37 = {\n class: \"legend-value\"\n};\nconst _hoisted_38 = {\n class: \"legend-percent\"\n};\nconst _hoisted_39 = {\n class: \"actions-section\"\n};\nconst _hoisted_40 = {\n class: \"action-card\"\n};\nconst _hoisted_41 = {\n class: \"action-header\"\n};\nconst _hoisted_42 = {\n class: \"action-content\"\n};\nconst _hoisted_43 = {\n class: \"action-buttons\"\n};\nconst _hoisted_44 = {\n class: \"restore-section\"\n};\nconst _hoisted_45 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_46 = {\n key: 0,\n class: \"file-info-card info-card-newest\"\n};\nconst _hoisted_47 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_48 = [\"src\"];\nconst _hoisted_49 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_50 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_51 = {\n class: \"info-card-header\"\n};\nconst _hoisted_52 = {\n class: \"header-badge\"\n};\nconst _hoisted_53 = {\n class: \"info-card-content\"\n};\nconst _hoisted_54 = {\n class: \"info-details\"\n};\nconst _hoisted_55 = {\n class: \"file-name\"\n};\nconst _hoisted_56 = {\n class: \"file-meta\"\n};\nconst _hoisted_57 = {\n key: 1,\n class: \"file-info-card info-card-oldest\"\n};\nconst _hoisted_58 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_59 = [\"src\"];\nconst _hoisted_60 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_61 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_62 = {\n class: \"info-card-header\"\n};\nconst _hoisted_63 = {\n class: \"header-badge warning\"\n};\nconst _hoisted_64 = {\n class: \"info-card-content\"\n};\nconst _hoisted_65 = {\n class: \"info-details\"\n};\nconst _hoisted_66 = {\n class: \"file-name\"\n};\nconst _hoisted_67 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_cache[7] || (_cache[7] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"文件总数\", -1)), _createElementVNode(\"div\", _hoisted_5, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[8] || (_cache[8] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击刷新\", -1))])]), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_8, [_cache[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"索引更新时间\", -1)), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_12, [_cache[10] || (_cache[10] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"系统版本\", -1)), _createElementVNode(\"div\", _hoisted_13, \"v\" + _toDisplayString($data.version), 1), _cache[11] || (_cache[11] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击查看更新日志\", -1))])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _cache[12] || (_cache[12] = _createElementVNode(\"span\", null, \"上传渠道分布\", -1))]), _createElementVNode(\"div\", _hoisted_17, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[14] || (_cache[14] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"文件总数\", -1))])]), _createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_24, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_25, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_26, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_27, [_createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"文件状态分布\", -1))]), _createElementVNode(\"div\", _hoisted_29, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _cache[17] || (_cache[17] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"状态类型\", -1))])]), _createElementVNode(\"div\", _hoisted_35, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.typeStats, (count, type, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: type,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_36, _toDisplayString(type || '未知类型'), 1), _createElementVNode(\"span\", _hoisted_37, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_38, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_39, [_createElementVNode(\"div\", _hoisted_40, [_createElementVNode(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"系统维护\", -1))]), _createElementVNode(\"div\", _hoisted_42, [_createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_el_tooltip, {\n content: \"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? '重建中...' : '重建索引'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"备份所有文件元数据和系统设置到JSON文件\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? '备份中...' : '备份数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_44, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[2] || (_cache[2] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? '恢复中...' : '恢复数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n _: 1\n })])])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_46, [_createElementVNode(\"div\", _hoisted_47, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[3] || (_cache[3] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[4] || (_cache[4] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_48)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_49, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_50, [_createElementVNode(\"div\", _hoisted_51, [_createElementVNode(\"div\", _hoisted_52, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _cache[19] || (_cache[19] = _createElementVNode(\"span\", null, \"最近上传\", -1))])]), _createElementVNode(\"div\", _hoisted_53, [_createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_56, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_57, [_createElementVNode(\"div\", _hoisted_58, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[5] || (_cache[5] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_59)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_60, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_61, [_createElementVNode(\"div\", _hoisted_62, [_createElementVNode(\"div\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _cache[20] || (_cache[20] = _createElementVNode(\"span\", null, \"最早上传\", -1))])]), _createElementVNode(\"div\", _hoisted_64, [_createElementVNode(\"div\", _hoisted_65, [_createElementVNode(\"div\", _hoisted_66, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_67, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {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};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../package.json';\nimport { Doughnut } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js';\nChartJS.register(ArcElement, Tooltip, Legend);\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16']\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据\n typeChartData() {\n const stats = this.indexInfo.typeStats || {};\n return {\n labels: Object.keys(stats).map(k => k || '未知类型'),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.typeColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=info', {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error('获取索引信息失败');\n } finally {\n this.loading = false;\n }\n },\n // 重建索引\n async rebuildIndex() {\n this.rebuilding = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=rebuild', {\n method: 'GET'\n });\n if (response.ok) {\n this.$message.success('索引重建已启动,请稍后刷新查看最新状态');\n // 延迟刷新数据\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 3000);\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('重建索引失败:', error);\n this.$message.error('重建索引失败');\n } finally {\n this.rebuilding = false;\n }\n },\n // 备份数据\n async backupData() {\n this.backing = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=backup', {\n method: 'GET'\n });\n if (response.ok) {\n // 创建下载链接\n const blob = await response.blob();\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n this.$message.success('备份文件已下载');\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('备份数据失败:', error);\n this.$message.error('备份数据失败: ' + error.message);\n } finally {\n this.backing = false;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error('请选择JSON格式的备份文件');\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm('恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?', '确认恢复', {\n confirmButtonText: '确定恢复',\n cancelButtonText: '取消',\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据\n async restoreData(file) {\n this.restoring = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=restore', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: await file.text()\n });\n if (response.ok) {\n const result = await response.json();\n this.$message.success(`恢复完成!已恢复 ${result.stats.restoredFiles} 个文件和 ${result.stats.restoredSettings} 个设置项`);\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('恢复数据失败:', error);\n this.$message.error('恢复数据失败: ' + error.message);\n } finally {\n this.restoring = false;\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return '未知';\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return `${days}天前`;\n if (hours > 0) return `${hours}小时前`;\n if (minutes > 0) return `${minutes}分钟前`;\n return '刚刚';\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=54756a6a&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=54756a6a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-54756a6a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"upload-channel\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"channel-settings\"\n};\nconst _hoisted_5 = {\n class: \"second-title\"\n};\nconst _hoisted_6 = {\n key: 0\n};\nconst _hoisted_7 = {\n key: 1\n};\nconst _hoisted_8 = {\n class: \"quota-status\"\n};\nconst _hoisted_9 = {\n key: 2\n};\nconst _hoisted_10 = {\n class: \"quota-status\"\n};\nconst _hoisted_11 = {\n key: 3\n};\nconst _hoisted_12 = {\n class: \"discord-limit-tip\"\n};\nconst _hoisted_13 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[4] || (_cache[4] = _createTextVNode(\"上传渠道 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_radio_group, {\n modelValue: $data.activeChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.activeChannel = $event)\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.channels, channel => {\n return _openBlock(), _createBlock(_component_el_radio, {\n key: channel.value,\n label: channel.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(channel.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"h4\", _hoisted_5, [_createTextVNode(_toDisplayString($options.activeChannelLabel) + \" 设置 \", 1), $data.activeChannel === 'telegram' ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: \"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), $data.activeChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_el_form, {\n model: $data.telegramSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.telegramSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.telegramSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.telegramSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.tgRules,\n ref_for: true,\n ref: \"tgChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.chatId,\n \"onUpdate:modelValue\": $event => channel.chatId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.cfr2Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[5] || (_cache[5] = _createTextVNode(\" 公开访问链接 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"若启用图像审查,请设置该项\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.publicUrl,\n \"onUpdate:modelValue\": $event => channel.publicUrl = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[6] || (_cache[6] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[7] || (_cache[7] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[8] || (_cache[8] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1032, [\"model\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 's3' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createVNode(_component_el_form, {\n model: $data.s3Settings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.s3Settings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.s3Settings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.s3Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n rules: $data.s3Rules,\n ref_for: true,\n ref: \"s3ChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n prop: \"endpoint\"\n }, {\n label: _withCtx(() => [_cache[9] || (_cache[9] = _createTextVNode(\" Endpoint \", -1)), _createVNode(_component_el_tooltip, {\n content: \"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.endpoint,\n \"onUpdate:modelValue\": $event => channel.endpoint = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"路径风格\",\n prop: \"pathStyle\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.pathStyle,\n \"onUpdate:modelValue\": $event => channel.pathStyle = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.bucketName,\n \"onUpdate:modelValue\": $event => channel.bucketName = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.region,\n \"onUpdate:modelValue\": $event => channel.region = $event,\n placeholder: \"默认填写 auto 即可\",\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.accessKeyId,\n \"onUpdate:modelValue\": $event => channel.accessKeyId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.secretAccessKey,\n \"onUpdate:modelValue\": $event => channel.secretAccessKey = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[10] || (_cache[10] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[11] || (_cache[11] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[12] || (_cache[12] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'discord' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_el_form, {\n model: $data.discordSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.discordSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.discordSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.discordSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.discordRules,\n ref_for: true,\n ref: \"discordChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.channelId,\n \"onUpdate:modelValue\": $event => channel.channelId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[13] || (_cache[13] = _createTextVNode(\" 代理域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.proxyUrl,\n \"onUpdate:modelValue\": $event => channel.proxyUrl = $event,\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[14] || (_cache[14] = _createTextVNode(\" Nitro 会员 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"开启后单文件限制提升至 25MB,关闭则为 10MB\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.isNitro,\n \"onUpdate:modelValue\": $event => channel.isNitro = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_12, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(channel.isNitro ? 'Nitro 会员单文件限制 25MB,超过将自动切换其他渠道' : 'Discord 免费用户单文件限制 10MB,超过将自动切换其他渠道'), 1)])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.addChannel\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[15] || (_cache[15] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n // 一级设置:上传渠道\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlareR2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }],\n activeChannel: 'telegram',\n // 当前选中的上传渠道\n\n // 二级设置:Telegram 配置\n telegramSettings: {\n loadBalance: {},\n channels: []\n },\n tgRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.telegramSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Telegram_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.telegramSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: '请输入 Chat ID',\n trigger: 'blur'\n }]\n },\n // 二级设置:CFR2 配置\n cfr2Settings: {\n channels: []\n },\n // 二级设置:S3 配置\n s3Settings: {\n loadBalance: {},\n channels: []\n },\n // 二级设置:Discord 配置\n discordSettings: {\n loadBalance: {},\n channels: []\n },\n discordRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.discordSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Discord_env') {\n const savePath = this.discordSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: '请输入 Channel ID',\n trigger: 'blur'\n }]\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n s3Rules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.s3Settings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'S3_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.s3Settings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: '请输入 Endpoint',\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: '请输入存储桶名称',\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: '请输入存储桶区域',\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: '请输入访问密钥 ID',\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: '请输入机密访问密钥',\n trigger: 'blur'\n }]\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 当前选中渠道的标签\n activeChannelLabel() {\n const channel = this.channels.find(item => item.value === this.activeChannel);\n return channel ? channel.label : '';\n }\n },\n methods: {\n addChannel() {\n switch (this.activeChannel) {\n case 'telegram':\n this.telegramSettings.channels.push({\n id: this.telegramSettings.channels.length + 1,\n name: '',\n type: 'telegram',\n savePath: 'database',\n botToken: '',\n chatId: '',\n enabled: true,\n fixed: false\n });\n break;\n case 'cfr2':\n // this.cfr2Settings.channels.push({\n // id: this.cfr2Settings.channels.length + 1,\n // name: '',\n // type: 'cfr2',\n // savePath: 'database',\n // enabled: true,\n // fixed: false\n // });\n this.$message.error('R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加');\n break;\n case 's3':\n this.s3Settings.channels.push({\n id: this.s3Settings.channels.length + 1,\n name: '',\n type: 's3',\n savePath: 'database',\n accessKeyId: '',\n secretAccessKey: '',\n region: '',\n bucketName: '',\n endpoint: '',\n pathStyle: false,\n enabled: true,\n fixed: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n });\n break;\n case 'discord':\n this.discordSettings.channels.push({\n id: this.discordSettings.channels.length + 1,\n name: '',\n type: 'discord',\n savePath: 'database',\n botToken: '',\n channelId: '',\n proxyUrl: '',\n isNitro: false,\n enabled: true,\n fixed: false\n });\n break;\n }\n },\n deleteChannel(index) {\n switch (this.activeChannel) {\n case 'telegram':\n // 调整 id\n this.telegramSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.telegramSettings.channels.splice(index, 1);\n break;\n case 'cfr2':\n // 调整 id\n this.cfr2Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.cfr2Settings.channels.splice(index, 1);\n break;\n case 's3':\n // 调整 id\n this.s3Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.s3Settings.channels.splice(index, 1);\n break;\n case 'discord':\n // 调整 id\n this.discordSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.discordSettings.channels.splice(index, 1);\n break;\n }\n },\n saveSettings() {\n // 所有表单的 Promise 数组\n let validationPromises = [];\n\n // Telegram\n if (this.$refs.tgChannelForm) {\n this.$refs.tgChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // S3\n if (this.$refs.s3ChannelForm) {\n this.$refs.s3ChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // Discord\n if (this.$refs.discordChannelForm) {\n this.$refs.discordChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n });\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm('首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?', '初始化容量统计', {\n confirmButtonText: '立即统计',\n cancelButtonText: '稍后手动统计',\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info('您可以稍后点击刷新按钮手动统计');\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info('正在统计容量,请稍候...');\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success('容量统计完成');\n } else {\n this.$message.error('统计失败: ' + (data.error || '未知错误'));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error('统计失败');\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=f5e0f39c&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=f5e0f39c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f5e0f39c\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_4 = {\n class: \"token-actions\"\n};\nconst _hoisted_5 = {\n class: \"token-table-container\"\n};\nconst _hoisted_6 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_7 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_8 = {\n class: \"token-display\"\n};\nconst _hoisted_9 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_10 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_12 = {\n class: \"first-settings\"\n};\nconst _hoisted_13 = {\n class: \"second-title\"\n};\nconst _hoisted_14 = {\n class: \"first-settings\"\n};\nconst _hoisted_15 = {\n class: \"actions\"\n};\nconst _hoisted_16 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_17 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_18 = {\n class: \"token-result\"\n};\nconst _hoisted_19 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_20 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_cache[26] || (_cache[26] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"认证管理\", -1)), _cache[27] || (_cache[27] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"用户端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $data.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"上传密码\",\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _cache[28] || (_cache[28] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"管理端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $data.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"用户名\",\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\",\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_3, [_cache[23] || (_cache[23] = _createTextVNode(\"API Token 管理 \", -1)), _createElementVNode(\"a\", _hoisted_4, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_5, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: \"名称\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_6, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: \"Token\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: \"权限\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: \"创建时间\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n label: \"操作\",\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\"编辑\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [...(_cache[25] || (_cache[25] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_12, [_cache[30] || (_cache[30] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"上传管理\", -1)), _createElementVNode(\"h4\", _hoisted_13, [_cache[29] || (_cache[29] = _createTextVNode(\"图像审查 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"开启审查\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: \"请选择审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: \"API 路径\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_14, [_cache[33] || (_cache[33] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"访问管理\", -1)), _cache[34] || (_cache[34] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"域名过滤\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[31] || (_cache[31] = _createTextVNode(\" 放行域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _cache[35] || (_cache[35] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"白名单模式\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[32] || (_cache[32] = _createTextVNode(\" 是否开启 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[36] || (_cache[36] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.showCreateTokenDialog = $event),\n title: \"创建新 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_16, [_createVNode(_component_el_button, {\n onClick: _cache[14] || (_cache[14] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[40] || (_cache[40] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [...(_cache[41] || (_cache[41] = [_createTextVNode(\"创建\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $data.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newToken.name = $event),\n placeholder: \"请输入Token名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[37] || (_cache[37] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[38] || (_cache[38] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[39] || (_cache[39] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showEditTokenDialog = $event),\n title: \"编辑 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_17, [_createVNode(_component_el_button, {\n onClick: _cache[18] || (_cache[18] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[45] || (_cache[45] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [...(_cache[46] || (_cache[46] = [_createTextVNode(\"更新\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $data.tokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[42] || (_cache[42] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[43] || (_cache[43] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[44] || (_cache[44] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showTokenResultDialog = $event),\n title: \"Token 创建成功\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[21] || (_cache[21] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[49] || (_cache[49] = [_createTextVNode(\"我已保存\", -1)]))]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"p\", _hoisted_19, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[47] || (_cache[47] = _createTextVNode(\" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! \", -1))]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"完整Token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [...(_cache[48] || (_cache[48] = [_createTextVNode(\"复制\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {}\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: false,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n newToken: {\n name: '',\n owner: '',\n permissions: []\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: []\n },\n createdToken: {\n name: '',\n token: ''\n },\n userPassRules: {\n authCode: [{\n validator: (rule, value, callback) => {\n // URL保留字符列表\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error('密码不能包含部分URL保留字符: % & ? # /'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n message: '请再次输入上传密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.user.authCode) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n adminPassRules: {\n confirmNewAdminPassword: [{\n message: '请再次输入管理密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.admin.adminPassword) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n tokenRules: {\n name: [{\n required: true,\n message: '请输入Token名称',\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: '请选择权限',\n trigger: 'change'\n }]\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n },\n methods: {\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': '上传',\n 'delete': '删除',\n 'list': '列出'\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error('获取Token列表失败');\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.newToken)\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: []\n };\n await this.loadApiTokens();\n this.$message.success('Token创建成功');\n } else {\n this.$message.error(data.error || 'Token创建失败');\n }\n } catch (error) {\n this.$message.error('Token创建失败');\n }\n });\n },\n editToken(token) {\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions]\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success('Token权限更新成功');\n } else {\n this.$message.error(data.error || 'Token更新失败');\n }\n } catch (error) {\n this.$message.error('Token更新失败');\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm('此操作将永久删除该Token,是否继续?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success('Token删除成功');\n } else {\n this.$message.error(data.error || 'Token删除失败');\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error('Token删除失败');\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success('Token已复制到剪贴板');\n } catch (error) {\n this.$message.error('复制失败,请手动复制');\n }\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n // 更新原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = data.upload;\n this.accessSettings = data.access;\n\n // 保存原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=3b7344a0&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=3b7344a0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3b7344a0\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(setting.label) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: setting.tooltip,\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder,\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: option.label,\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[0] || (_cache[0] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = setting.category || '其他设置';\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=7b059a1c&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=7b059a1c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7b059a1c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[9] || (_cache[9] = _createTextVNode(\"远端遥测 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"便于问题查找和定位,建议开启\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_cache[10] || (_cache[10] = _createTextVNode(\"随机图像API \", -1)), _createVNode(_component_el_tooltip, {\n content: \"API具体用法请查阅文档\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[11] || (_cache[11] = _createElementVNode(\"span\", null, \"目录\", -1)), _createVNode(_component_el_tooltip, {\n content: \"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_cache[12] || (_cache[12] = _createTextVNode(\"CloudFlare API Token \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"区域ID\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"账户邮箱\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_cache[13] || (_cache[13] = _createTextVNode(\"WebDAV \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,可以通过WebDAV协议访问和管理图片\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"用户名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[14] || (_cache[14] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {}\n },\n // 加载状态\n loading: false\n };\n },\n computed: {},\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=03514366&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=03514366&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-03514366\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/SysCogStatus.vue';\nimport SysCogUpload from '@/components/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/SysCogSecurity.vue';\nimport SysCogPage from '@/components/SysCogPage.vue';\nimport SysCogOthers from '@/components/SysCogOthers.vue';\nexport default {\n name: 'SystemConfig',\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n this.$store.commit('setCredentials', null);\n this.$router.push('/adminLogin');\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=c5d2c9c2&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=c5d2c9c2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c5d2c9c2\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","title","args","toggleCollapse","name","props","type","String","default","Boolean","data","methods","this","$emit","checkMobile","isMobile","window","innerWidth","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_component_Doughnut","_component_el_button","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","Object","keys","channelStats","length","channelChartData","options","chartOptions","count","channel","style","background","getChartColor","getPercentage","typeStats","typeChartData","getTypeChartColor","loading","rebuilding","rebuildIndex","backing","backupData","ref","accept","onChange","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","_typeof","o","Symbol","iterator","constructor","prototype","toPrimitive","t","r","e","i","call","TypeError","Number","toPropertyKey","_defineProperty","defineProperty","value","enumerable","configurable","writable","round","v","lim","l","h","Math","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","f","hex","h1","h2","eq","isShort","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","hueValue","rgb2hsl","range","calln","Array","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","from","interpolate","rgb1","rgb2","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","toString","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","size","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","width","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","match","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","add","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","el","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","date","callbacks","numSteps","initial","currentStep","_refresh","_update","Date","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","remove","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","contains","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","amount","refRect","BarElement","addRectPath","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","_args","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","unshift","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","watch","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","components","newest","oldest","channelColors","typeColors","computed","stats","percentage","toFixed","response","fetchWithAuth","json","$message","success","errorData","blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","message","$refs","fileInput","file","files","$confirm","confirmButtonText","cancelButtonText","restoreData","headers","restoredFiles","restoredSettings","minutes","hours","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_el_radio","_component_el_radio_group","_component_el_switch","_component_el_form_item","_component_el_form","_component_el_input","_component_el_input_number","_component_el_progress","modelValue","activeChannel","channels","activeChannelLabel","model","telegramSettings","loadBalance","rules","tgRules","ref_for","fixed","botToken","autocomplete","chatId","deleteChannel","cfr2Settings","publicUrl","quota","onQuotaEnabledChange","limitGB","threshold","link","refreshQuota","quotaLoading","getQuotaPercentage","status","getQuotaStatus","getQuotaText","isQuotaExceeded","getQuotaStatusText","s3Settings","s3Rules","endpoint","pathStyle","bucketName","region","placeholder","accessKeyId","secretAccessKey","discordSettings","discordRules","channelId","proxyUrl","isNitro","addChannel","saveSettings","validator","rule","savePath","quotaStats","validationPromises","tgChannelForm","form","validate","s3ChannelForm","discordChannelForm","results","isValid","every","settings","telegram","cfr2","s3","discord","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","catch","finally","_component_el_table_column","_component_el_tag","_component_el_table","_component_el_option","_component_el_select","_component_el_checkbox","_component_el_checkbox_group","_component_el_dialog","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","adminPassword","handleAdminPassInput","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","circle","apiTokens","token","permissions","perm","getPermissionText","formatDate","createdAt","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","dialogWidth","createToken","newToken","tokenRules","showEditTokenDialog","updateToken","editingToken","showTokenResultDialog","createdToken","readonly","append","copyToken","oriUserPassword","oriAdminPassword","owner","urlReservedChars","hasReservedChar","char","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","editTokenForm","tokenId","navigator","clipboard","writeText","userPassForm","adminPassForm","auth","upload","access","groupedSettings","categoryGroup","categoryName","setting","category","telemetry","randomImageAPI","allowedDir","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","webDAV","username","password","immediate","newHash","scrollTo","newIndex","hash","$router","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","$store","commit","setDefaultHash","defaultHash","location"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/357.c54040b4.js.map.gz b/js/357.c54040b4.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..ad18070edfbcd5b5c8cca64f1b8e9fc3c9a725c9 GIT binary patch literal 298891 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
-b43ry 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%0DD7p-^ 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 dd*z@1`!6*h{if(e.withAuthCode){const t=a().get("authCode");t&&(e.headers["authCode"]=t)}return e},e=>Promise.reject(e)),l.interceptors.response.use(e=>e,e=>(e.config?.withAuthCode&&401===e.response?.status&&(i.nk.error("认证失败,请重新登录!"),s.A.push("/login")),Promise.reject(e))),t.A=l},3354:function(e,t,o){o(8111),o(7588);var n=o(5130),r=o(3888),a=o(4068),s=(o(9436),o(372),o(8950)),i=o(2353),l=o(292),u=o(6768);function c(e,t,o,n,r,a){const s=(0,u.g2)("router-view");return(0,u.uX)(),(0,u.Wv)(s)}var d=o(8401),p=o(3785),m={computed:{...(0,d.L8)(["userConfig","useDarkMode"])},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars()})},watch:{useDarkMode(){this.setSiteIcon()}},methods:{initOverlayScrollbars(){try{if(p.ae.valid(document.body))return;(0,p.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setSiteIcon(){const e=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');e.forEach(e=>e.remove());const t=document.createElement("link"),o=document.createElement("link"),n=document.createElement("link");t.rel="icon",o.rel="apple-touch-icon",n.rel="mask-icon",this.useDarkMode?(t.href=this.userConfig?.siteIcon||"/logo-dark.png",o.href=this.userConfig?.siteIcon||"/logo-dark.png",n.href=this.userConfig?.siteIcon||"/logo-dark.png"):(t.href=this.userConfig?.siteIcon||"/logo.png",o.href=this.userConfig?.siteIcon||"/logo.png",n.href=this.userConfig?.siteIcon||"/logo.png"),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(n)}}},f=o(1241);const h=(0,f.A)(m,[["render",c]]);var g=h,b=o(6915),k=o(5507),y=o(7477);o(1862),o(635);s.Yv.add(i.X7I);const C=(0,n.Ef)(g),v=(0,r.Zf)();C.component("font-awesome-icon",l.gc);for(const[M,E]of Object.entries(y))C.component(M,E);const A=()=>{const e=document.documentElement;let t;if(k.A.state.cusDarkMode&&null!==k.A.state.useDarkMode)t=k.A.state.useDarkMode;else{if(t=window.matchMedia("(prefers-color-scheme: dark)").matches,!t){const e=new Date,o=e.getHours();t=o>=22||o<6}k.A.commit("setUseDarkMode",t)}t?e.classList.add("dark"):e.classList.remove("dark")},U=e=>{const t=document.documentElement;e?t.classList.add("dark"):t.classList.remove("dark")},w=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},S=(e,t)=>{const o=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');o.forEach(e=>e.remove());const n=document.createElement("link"),r=document.createElement("link"),a=document.createElement("link");n.rel="icon",r.rel="apple-touch-icon",a.rel="mask-icon",e?(n.href=t?.siteIcon||"/logo-dark.png",r.href=t?.siteIcon||"/logo-dark.png",a.href=t?.siteIcon||"/logo-dark.png"):(n.href=t?.siteIcon||"/logo.png",r.href=t?.siteIcon||"/logo.png",a.href=t?.siteIcon||"/logo.png"),document.head.appendChild(n),document.head.appendChild(r),document.head.appendChild(a)};k.A.dispatch("fetchUserConfig").then(()=>{A(),w(k.A.getters.userConfig),S(k.A.state.useDarkMode,k.A.getters.userConfig),k.A.subscribe((e,t)=>{"setUseDarkMode"===e.type&&k.A.state.cusDarkMode&&(U(t.useDarkMode),S(t.useDarkMode,k.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),S(k.A.state.useDarkMode,k.A.getters.userConfig))}),C.use(k.A).use(b.A).use(a.A).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),C.use(k.A).use(b.A).use(a.A).use(v).mount("#app")})},5507:function(e,t,o){o(8111),o(1701);var n=o(8401),r=o(457),a=o(5131);t.A=(0,n.y$)({state:{userConfig:null,bingWallPapers:[],credentials:null,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:!0,compressQuality:4,compressBar:5,serverCompress:!0},storeUploadChannel:"",storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.credentials,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,t){e.userConfig=t},setBingWallPapers(e,t){e.bingWallPapers=t},setCredentials(e,t){e.credentials=t},setUploadMethod(e,t){e.uploadMethod=t},setUploadCopyUrlForm(e,t){e.uploadCopyUrlForm=t},setCompressConfig(e,{key:t,value:o}){e.compressConfig[t]=o},setStoreUploadChannel(e,t){e.storeUploadChannel=t},setStoreUploadNameType(e,t){e.storeUploadNameType=t},setCustomUrlSettings(e,{key:t,value:o}){e.customUrlSettings[t]=o},setStoreAutoRetry(e,t){e.storeAutoRetry=t},setAdminUrlSettings(e,{key:t,value:o}){e.adminUrlSettings[t]=o},setUseDarkMode(e,t){e.useDarkMode=t},setCusDarkMode(e,t){e.cusDarkMode=t},setStoreUploadFolder(e,t){e.uploadFolder=t,localStorage.setItem("uploadFolder",t)},setStoreAutoReUpload(e,t){e.autoReUpload=t}},actions:{async fetchUserConfig({commit:e}){try{const t=await r.A.get("/api/userConfig");e("setUserConfig",t.data)}catch(t){console.log(t)}},async fetchBingWallPapers({commit:e}){try{const t=await r.A.get("/api/bing/wallpaper"),o=t.data.data,n=o.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(n.map(e=>new Promise((t,o)=>{const n=new Image;n.onload=t,n.onerror=o,n.src=e.url}))),e("setBingWallPapers",n)}catch(t){console.log(t)}}},modules:{},plugins:[(0,a.A)()]})},6915:function(e,t,o){o(4979);var n=o(8512),r=o(1219),a=o(4570),s=o.n(a),i=o(5507),l=o(457);const u=(e,t,o)=>{const n=i.A.getters.credentials;if(null===n&&"adminLogin"!==e.name){const e=btoa("unset:unset");l.A.get("/api/manage/check",{headers:{Authorization:"Basic "+e},withCredentials:!0}).then(t=>{if(200!==t.status)throw new Error("认证失败!");i.A.commit("setCredentials",e),o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"adminLogin"})})}else o()},c=(e,t,o)=>{let n=s().get("authCode");null===n&&"login"!==e.name?l.A.post("/api/login",{authCode:"unset"}).then(e=>{if(200!==e.status)throw new Error("认证失败!");s().set("authCode","unset","14d"),n="unset",o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"login"})}):o()},d=[{path:"/",name:"home",component:()=>Promise.all([o.e(171),o.e(196)]).then(o.bind(o,9210)),beforeEnter:c},{path:"/login",name:"login",component:()=>Promise.all([o.e(171),o.e(672)]).then(o.bind(o,2560))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([o.e(239),o.e(946)]).then(o.bind(o,3946)),beforeEnter:u},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([o.e(239),o.e(419)]).then(o.bind(o,8419)),beforeEnter:u},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([o.e(239),o.e(275)]).then(o.bind(o,9275)),beforeEnter:u},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([o.e(171),o.e(698)]).then(o.bind(o,3950))},{path:"/blockimg",name:"blockimg",component:()=>o.e(917).then(o.bind(o,4917))},{path:"/whiteliston",name:"whiteliston",component:()=>o.e(845).then(o.bind(o,7226))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>o.e(226).then(o.bind(o,8226))}],p=(0,n.aE)({history:(0,n.LA)("/"),routes:d});t.A=p}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,o),a.exports}o.m=e,function(){var e=[];o.O=function(t,n,r,a){if(!n){var s=1/0;for(c=0;c=a)&&Object.keys(o.O).every(function(e){return o.O[e](n[l])})?n.splice(l--,1):(i=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[n,r,a]}}(),function(){o.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return o.d(t,{a:t}),t}}(),function(){o.d=function(e,t){for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){o.f={},o.e=function(e){return Promise.all(Object.keys(o.f).reduce(function(t,n){return o.f[n](e,t),t},[]))}}(),function(){o.u=function(e){return"js/"+e+"."+{171:"833208d0",196:"81b1627f",226:"577ea134",239:"32572dba",275:"392f87b8",419:"99e00aec",672:"11bec4e1",698:"77f859a8",845:"6b4cb4a5",917:"5bf3db27",946:"45a1d5c4"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{196:"3609e672",226:"6548e7b4",239:"6563616d",275:"8c46d2f3",419:"1d235d6e",672:"aed3581b",698:"aed3581b",845:"6b45e8e3",917:"8529ad1e",946:"238d597a"}[e]+".css"}}(),function(){o.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="sanyue_imghub:";o.l=function(n,r,a,s){if(e[n])e[n].push(r);else{var i,l;if(void 0!==a)for(var u=document.getElementsByTagName("script"),c=0;c{if(e.withAuthCode){const t=a().get("authCode");t&&(e.headers["authCode"]=t)}return e},e=>Promise.reject(e)),l.interceptors.response.use(e=>e,e=>(e.config?.withAuthCode&&401===e.response?.status&&(i.nk.error("认证失败,请重新登录!"),s.A.push("/login")),Promise.reject(e))),t.A=l},3354:function(e,t,o){o(8111),o(7588);var n=o(5130),r=o(3888),a=o(4068),s=(o(9436),o(372),o(8950)),i=o(2353),l=o(292),u=o(6768);function c(e,t,o,n,r,a){const s=(0,u.g2)("router-view");return(0,u.uX)(),(0,u.Wv)(s)}var d=o(8401),p=o(3785),m={computed:{...(0,d.L8)(["userConfig","useDarkMode"])},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars()})},watch:{useDarkMode(){this.setSiteIcon()}},methods:{initOverlayScrollbars(){try{if(p.ae.valid(document.body))return;(0,p.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setSiteIcon(){const e=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');e.forEach(e=>e.remove());const t=document.createElement("link"),o=document.createElement("link"),n=document.createElement("link");t.rel="icon",o.rel="apple-touch-icon",n.rel="mask-icon",this.useDarkMode?(t.href=this.userConfig?.siteIcon||"/logo-dark.png",o.href=this.userConfig?.siteIcon||"/logo-dark.png",n.href=this.userConfig?.siteIcon||"/logo-dark.png"):(t.href=this.userConfig?.siteIcon||"/logo.png",o.href=this.userConfig?.siteIcon||"/logo.png",n.href=this.userConfig?.siteIcon||"/logo.png"),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(n)}}},f=o(1241);const h=(0,f.A)(m,[["render",c]]);var g=h,b=o(6915),k=o(5507),y=o(7477);o(1862),o(635);s.Yv.add(i.X7I);const C=(0,n.Ef)(g),v=(0,r.Zf)();C.component("font-awesome-icon",l.gc);for(const[M,E]of Object.entries(y))C.component(M,E);const A=()=>{const e=document.documentElement;let t;if(k.A.state.cusDarkMode&&null!==k.A.state.useDarkMode)t=k.A.state.useDarkMode;else{if(t=window.matchMedia("(prefers-color-scheme: dark)").matches,!t){const e=new Date,o=e.getHours();t=o>=22||o<6}k.A.commit("setUseDarkMode",t)}t?e.classList.add("dark"):e.classList.remove("dark")},U=e=>{const t=document.documentElement;e?t.classList.add("dark"):t.classList.remove("dark")},w=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},S=(e,t)=>{const o=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');o.forEach(e=>e.remove());const n=document.createElement("link"),r=document.createElement("link"),a=document.createElement("link");n.rel="icon",r.rel="apple-touch-icon",a.rel="mask-icon",e?(n.href=t?.siteIcon||"/logo-dark.png",r.href=t?.siteIcon||"/logo-dark.png",a.href=t?.siteIcon||"/logo-dark.png"):(n.href=t?.siteIcon||"/logo.png",r.href=t?.siteIcon||"/logo.png",a.href=t?.siteIcon||"/logo.png"),document.head.appendChild(n),document.head.appendChild(r),document.head.appendChild(a)};k.A.dispatch("fetchUserConfig").then(()=>{A(),w(k.A.getters.userConfig),S(k.A.state.useDarkMode,k.A.getters.userConfig),k.A.subscribe((e,t)=>{"setUseDarkMode"===e.type&&k.A.state.cusDarkMode&&(U(t.useDarkMode),S(t.useDarkMode,k.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),S(k.A.state.useDarkMode,k.A.getters.userConfig))}),C.use(k.A).use(b.A).use(a.A).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),C.use(k.A).use(b.A).use(a.A).use(v).mount("#app")})},5507:function(e,t,o){o(8111),o(1701);var n=o(8401),r=o(457),a=o(5131);t.A=(0,n.y$)({state:{userConfig:null,bingWallPapers:[],credentials:null,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:!0,compressQuality:4,compressBar:5,serverCompress:!0},storeUploadChannel:"",storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.credentials,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,t){e.userConfig=t},setBingWallPapers(e,t){e.bingWallPapers=t},setCredentials(e,t){e.credentials=t},setUploadMethod(e,t){e.uploadMethod=t},setUploadCopyUrlForm(e,t){e.uploadCopyUrlForm=t},setCompressConfig(e,{key:t,value:o}){e.compressConfig[t]=o},setStoreUploadChannel(e,t){e.storeUploadChannel=t},setStoreUploadNameType(e,t){e.storeUploadNameType=t},setCustomUrlSettings(e,{key:t,value:o}){e.customUrlSettings[t]=o},setStoreAutoRetry(e,t){e.storeAutoRetry=t},setAdminUrlSettings(e,{key:t,value:o}){e.adminUrlSettings[t]=o},setUseDarkMode(e,t){e.useDarkMode=t},setCusDarkMode(e,t){e.cusDarkMode=t},setStoreUploadFolder(e,t){e.uploadFolder=t,localStorage.setItem("uploadFolder",t)},setStoreAutoReUpload(e,t){e.autoReUpload=t}},actions:{async fetchUserConfig({commit:e}){try{const t=await r.A.get("/api/userConfig");e("setUserConfig",t.data)}catch(t){console.log(t)}},async fetchBingWallPapers({commit:e}){try{const t=await r.A.get("/api/bing/wallpaper"),o=t.data.data,n=o.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(n.map(e=>new Promise((t,o)=>{const n=new Image;n.onload=t,n.onerror=o,n.src=e.url}))),e("setBingWallPapers",n)}catch(t){console.log(t)}}},modules:{},plugins:[(0,a.A)()]})},6915:function(e,t,o){o(4979);var n=o(8512),r=o(1219),a=o(4570),s=o.n(a),i=o(5507),l=o(457);const u=(e,t,o)=>{const n=i.A.getters.credentials;if(null===n&&"adminLogin"!==e.name){const e=btoa("unset:unset");l.A.get("/api/manage/check",{headers:{Authorization:"Basic "+e},withCredentials:!0}).then(t=>{if(200!==t.status)throw new Error("认证失败!");i.A.commit("setCredentials",e),o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"adminLogin"})})}else o()},c=(e,t,o)=>{let n=s().get("authCode");null===n&&"login"!==e.name?l.A.post("/api/login",{authCode:"unset"}).then(e=>{if(200!==e.status)throw new Error("认证失败!");s().set("authCode","unset","14d"),n="unset",o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"login"})}):o()},d=[{path:"/",name:"home",component:()=>Promise.all([o.e(171),o.e(196)]).then(o.bind(o,9210)),beforeEnter:c},{path:"/login",name:"login",component:()=>Promise.all([o.e(171),o.e(672)]).then(o.bind(o,2560))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([o.e(239),o.e(946)]).then(o.bind(o,3946)),beforeEnter:u},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([o.e(239),o.e(419)]).then(o.bind(o,8419)),beforeEnter:u},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([o.e(239),o.e(357)]).then(o.bind(o,357)),beforeEnter:u},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([o.e(171),o.e(698)]).then(o.bind(o,3950))},{path:"/blockimg",name:"blockimg",component:()=>o.e(917).then(o.bind(o,4917))},{path:"/whiteliston",name:"whiteliston",component:()=>o.e(845).then(o.bind(o,7226))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>o.e(226).then(o.bind(o,8226))}],p=(0,n.aE)({history:(0,n.LA)("/"),routes:d});t.A=p}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,o),a.exports}o.m=e,function(){var e=[];o.O=function(t,n,r,a){if(!n){var s=1/0;for(c=0;c=a)&&Object.keys(o.O).every(function(e){return o.O[e](n[l])})?n.splice(l--,1):(i=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[n,r,a]}}(),function(){o.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return o.d(t,{a:t}),t}}(),function(){o.d=function(e,t){for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){o.f={},o.e=function(e){return Promise.all(Object.keys(o.f).reduce(function(t,n){return o.f[n](e,t),t},[]))}}(),function(){o.u=function(e){return"js/"+e+"."+{171:"833208d0",196:"81b1627f",226:"577ea134",239:"32572dba",357:"c54040b4",419:"99e00aec",672:"11bec4e1",698:"77f859a8",845:"6b4cb4a5",917:"5bf3db27",946:"45a1d5c4"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{196:"3609e672",226:"6548e7b4",239:"6563616d",357:"1ca52a5a",419:"1d235d6e",672:"aed3581b",698:"aed3581b",845:"6b45e8e3",917:"8529ad1e",946:"238d597a"}[e]+".css"}}(),function(){o.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="sanyue_imghub:";o.l=function(n,r,a,s){if(e[n])e[n].push(r);else{var i,l;if(void 0!==a)for(var u=document.getElementsByTagName("script"),c=0;cBPGzFR46jXUSKo5?mMEZP*ssJa9m%SjM}0eQ8Aa=L$3 zWdBmAV95ln-JSdE^6_M(f;Vgjx7F2WI>XOOW(^B3TE0KdTBG$?w{Hdw+e8i>{*LutToC$lhyLbvg^AMzc&PVb2 zIRV+32aeqH*y(gq6qwX4paRM2q5*EpM6)S^Z@v-cwM&w&Y72ID-}PxGMRa0(=OHRc zu%#Ow*@95}n0~_QDHhpO63Rv@8d|wS|oWaaNS>PJ~121iIardf{rKT z1m*k$N%XC`Kxg6%1?X%O4#EfxJDqlGn6wZLFZ&T1hSRX$9?TGJxBC(54F-aToi3v7 z&Siu;?cSiBOgVz+9HF?^ZFO7IE~4G=GD4S^qSb%mB1W`7Xh$dvry}l(5YhhSFhYaD zY}mWxLqvz&UWEG7ZanSs9-^1wAVR(AtdmUJ14J*o{Rnk?JWP6V7ZqbMIYYs>20a#V znacFWn3t#Ij7?ookgU^hU5fsoT}syPb%$awtt9LB`kj8*PfE$cnD^Se$4kk=q}}Ny zeNlf(#zoTU4Z~?E+5WYXtS5$|Q%W}MwJ&)Ric+$6XPERZ2fUIjHm5|Jv)XGq!$>*z zfOa+XkJYR(&(xG>Zx^YlqUjzof(oqK(~Hz>w~z?FtT3Y55F)sCr+<=?ziq3i_&4DA z5!32ukCiJ*&t7R|6`%|j+`M^^)rRtM9TtBatD*eN362(I+>O;Y>2kivrx6;dAlp-O zL5CX0KO7arofqz-98LVap^MBkJ2;0psiHu>zbTrF>i*4qzJAN+&;h~l=|sA+h){nn z=~R!EE!F;;CFvT zk#4s*gVQ8^@*-=;R~p0%u8pt^<#u*HgiCc9H=8M>_%)hR$yoS7SY)1Nhypt>MaN7M z3Myq|J#h!gs(y?rvPpMUb6Sm6t{t$w*(04Rm8&kKOti zh+3{8s;32^VOw;ejI2bguiilk-AR5t4nRV)X7lNLvJ`p+$J;o6N#$VMMyUv7J2&i0*yKrO3itp?N1lw|BU=z5#z}!|C z`OIxcSUG0R&gSO8tr0vzgj5bWfvjp5Wh7J0rXPTwjC*#@w109}vD>Ys8LL(3uM|&G zId9zD-ZtVzF7F!d0Bg+L4PAfm*Ak;Md4{3}I!n(GaorZk^BKB<*|6MUg3ml+XkMb5 z+uLt$zI^wyKmX>{o9i#Wd3pWSs~2Cuuv3YoS@i)YOQ|{7faa+UXb9yvBm30+gpL52 zzig)RO4c!@(gUg%z0o$6H53&rb9q_PYp`f*Ne4ka;o29$q+UDD5T<}Ri%2cpAb1g%Q4NdnV!fwEl zrqpc~KmdJC%{IMuH)?+s@Zm>=>Byqqnl4`pU78lU>@0LiS?F@H(4}CZ%e+FDaD^_< z3SD{?79%|tlPg=E{$nvAk*hh!V$y6X_gfoe5Lh=VkJA`GTJ z&T*RV;+&y+98Q1Sc?&5dHZ-Hi5jjU^*5#m71#b?Fw%Z>q*i2(PDMr42Jz-Z!Lz#pY zLCPfb2Qntd?Fr49v#tr?V?2Bc_p=f=@o`Npn~OCPgpwE6SuW9;w$tF z@*7xUn@x))8Rh#}k)NFr&dfNUP;XCYJ%}-%_}_7Bf+2mg;}h1}7t(KVOdvuSk+`S6VGc03u$UAAUxnGtksy@Rqk*n>&{ff}Q_0}0-gnL8c#THOhK+zn6| zKCUO=`EI%-1$-3wXBQVgY8aL4SiI(|RVwH2e*TK_)hg&GA&&>sLGZ1C3#0!7c8O8( Ha4`S?OjtM! delta 2183 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 J(O7XY007H|Lz4gi diff --git a/js/app.8353468e.js.map b/js/app.6d1ac7b7.js.map similarity index 99% rename from js/app.8353468e.js.map rename to js/app.6d1ac7b7.js.map index 864651a4..1fe8f65f 100644 --- a/js/app.8353468e.js.map +++ b/js/app.6d1ac7b7.js.map @@ -1 +1 @@ -{"version":3,"file":"js/app.8353468e.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/App.vue?0365","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\nimport cookies from 'vue-cookies';\r\nimport router from '@/router/index';\r\nimport { ElMessage } from 'element-plus'\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n});\r\n\r\n// 请求拦截器\r\ninstance.interceptors.request.use(\r\n (config) => {\r\n // 如果配置中标记了withAuthCode,则添加authCode到header\r\n if (config.withAuthCode) {\r\n const authCode = cookies.get('authCode');\r\n if (authCode) {\r\n config.headers['authCode'] = authCode;\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// 响应拦截器\r\ninstance.interceptors.response.use(\r\n (response) => {\r\n return response;\r\n },\r\n (error) => {\r\n // 如果请求配置了withAuthCode且返回401,则跳转到登录页\r\n if (error.config?.withAuthCode && error.response?.status === 401) {\r\n ElMessage.error('认证失败,请重新登录!');\r\n router.push('/login');\r\n }\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport default instance;\r\n","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n return _openBlock(), _createBlock(_component_router_view);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nexport default {\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode'])\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n });\n },\n watch: {\n useDarkMode() {\n this.setSiteIcon();\n }\n },\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setSiteIcon() {\n // 同时更改 icon apple-touch-icon 和 mask-icon\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\n existingIcons.forEach(icon => icon.remove());\n const iconLink = document.createElement('link');\n const appleIconLink = document.createElement('link');\n const maskIconLink = document.createElement('link');\n iconLink.rel = 'icon';\n appleIconLink.rel = 'apple-touch-icon';\n maskIconLink.rel = 'mask-icon';\n if (this.useDarkMode) {\n iconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n } else {\n iconLink.href = this.userConfig?.siteIcon || '/logo.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n }\n document.head.appendChild(iconLink);\n document.head.appendChild(appleIconLink);\n document.head.appendChild(maskIconLink);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=7d6c298a\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=7d6c298a&lang=css\"\nimport \"./App.vue?vue&type=style&index=1&id=7d6c298a&lang=css\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'; // 引入所有 solid 图标\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(fas);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(head).mount('#app');\r\n})\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n credentials: null,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: true,\r\n compressQuality: 4,\r\n compressBar: 5,\r\n serverCompress: true,\r\n },\r\n storeUploadChannel: '',\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n credentials: state => state.credentials,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n setCredentials(state, credentials) {\r\n state.credentials = credentials;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState()]\r\n})\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport cookies from 'vue-cookies'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n // 从store中获取凭据\r\n const credentials = store.getters.credentials\r\n if (credentials === null && to.name !== 'adminLogin') {\r\n // 尝试未设置密码的情况\r\n const credentials = btoa('unset:unset')\r\n axios.get('/api/manage/check', {\r\n headers: {\r\n 'Authorization': 'Basic ' + credentials\r\n },\r\n withCredentials: true\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n store.commit('setCredentials', credentials)\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'adminLogin' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n let authCode = cookies.get('authCode');\r\n if (authCode === null && to.name !== 'login') {\r\n // 尝试未设置密码的情况\r\n axios.post('/api/login', {\r\n authCode: 'unset'\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n cookies.set('authCode', 'unset', '14d')\r\n authCode = 'unset'\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'login' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"171\":\"833208d0\",\"196\":\"81b1627f\",\"226\":\"577ea134\",\"239\":\"32572dba\",\"275\":\"392f87b8\",\"419\":\"99e00aec\",\"672\":\"11bec4e1\",\"698\":\"77f859a8\",\"845\":\"6b4cb4a5\",\"917\":\"5bf3db27\",\"946\":\"45a1d5c4\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"196\":\"3609e672\",\"226\":\"6548e7b4\",\"239\":\"6563616d\",\"275\":\"8c46d2f3\",\"419\":\"1d235d6e\",\"672\":\"aed3581b\",\"698\":\"aed3581b\",\"845\":\"6b45e8e3\",\"917\":\"8529ad1e\",\"946\":\"238d597a\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"196\":1,\"226\":1,\"239\":1,\"275\":1,\"419\":1,\"672\":1,\"698\":1,\"845\":1,\"917\":1,\"946\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(3354); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","interceptors","request","use","config","withAuthCode","authCode","cookies","headers","error","Promise","reject","response","status","ElMessage","router","push","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","computed","mounted","this","$nextTick","initOverlayScrollbars","watch","useDarkMode","setSiteIcon","methods","valid","document","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","console","log","existingIcons","querySelectorAll","forEach","icon","remove","iconLink","createElement","appleIconLink","maskIconLink","rel","href","userConfig","siteIcon","head","appendChild","__exports__","library","add","fas","app","createApp","App","createHead","component","FontAwesomeIcon","key","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","documentElement","isDarkMode","store","state","cusDarkMode","window","matchMedia","matches","now","Date","hour","getHours","commit","classList","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","dispatch","then","getters","subscribe","mutation","type","payload","ElementPlus","mount","catch","createStore","bingWallPapers","credentials","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","compressQuality","compressBar","serverCompress","storeUploadChannel","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","value","setStoreUploadChannel","uploadChannel","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","get","data","fetchBingWallPapers","wallpapers","map","wallpaper","url","all","resolve","img","Image","onload","onerror","src","modules","plugins","createPersistedState","adminAuthGuard","to","from","next","name","btoa","withCredentials","res","Error","err","userAuthGuard","post","routes","path","beforeEnter","createRouter","history","createWebHistory","process","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","code","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/app.6d1ac7b7.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/App.vue?0365","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\nimport cookies from 'vue-cookies';\r\nimport router from '@/router/index';\r\nimport { ElMessage } from 'element-plus'\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n});\r\n\r\n// 请求拦截器\r\ninstance.interceptors.request.use(\r\n (config) => {\r\n // 如果配置中标记了withAuthCode,则添加authCode到header\r\n if (config.withAuthCode) {\r\n const authCode = cookies.get('authCode');\r\n if (authCode) {\r\n config.headers['authCode'] = authCode;\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// 响应拦截器\r\ninstance.interceptors.response.use(\r\n (response) => {\r\n return response;\r\n },\r\n (error) => {\r\n // 如果请求配置了withAuthCode且返回401,则跳转到登录页\r\n if (error.config?.withAuthCode && error.response?.status === 401) {\r\n ElMessage.error('认证失败,请重新登录!');\r\n router.push('/login');\r\n }\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport default instance;\r\n","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n return _openBlock(), _createBlock(_component_router_view);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nexport default {\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode'])\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n });\n },\n watch: {\n useDarkMode() {\n this.setSiteIcon();\n }\n },\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setSiteIcon() {\n // 同时更改 icon apple-touch-icon 和 mask-icon\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\n existingIcons.forEach(icon => icon.remove());\n const iconLink = document.createElement('link');\n const appleIconLink = document.createElement('link');\n const maskIconLink = document.createElement('link');\n iconLink.rel = 'icon';\n appleIconLink.rel = 'apple-touch-icon';\n maskIconLink.rel = 'mask-icon';\n if (this.useDarkMode) {\n iconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n } else {\n iconLink.href = this.userConfig?.siteIcon || '/logo.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n }\n document.head.appendChild(iconLink);\n document.head.appendChild(appleIconLink);\n document.head.appendChild(maskIconLink);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=7d6c298a\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=7d6c298a&lang=css\"\nimport \"./App.vue?vue&type=style&index=1&id=7d6c298a&lang=css\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'; // 引入所有 solid 图标\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(fas);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(head).mount('#app');\r\n})\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n credentials: null,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: true,\r\n compressQuality: 4,\r\n compressBar: 5,\r\n serverCompress: true,\r\n },\r\n storeUploadChannel: '',\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n credentials: state => state.credentials,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n setCredentials(state, credentials) {\r\n state.credentials = credentials;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState()]\r\n})\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport cookies from 'vue-cookies'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n // 从store中获取凭据\r\n const credentials = store.getters.credentials\r\n if (credentials === null && to.name !== 'adminLogin') {\r\n // 尝试未设置密码的情况\r\n const credentials = btoa('unset:unset')\r\n axios.get('/api/manage/check', {\r\n headers: {\r\n 'Authorization': 'Basic ' + credentials\r\n },\r\n withCredentials: true\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n store.commit('setCredentials', credentials)\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'adminLogin' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n let authCode = cookies.get('authCode');\r\n if (authCode === null && to.name !== 'login') {\r\n // 尝试未设置密码的情况\r\n axios.post('/api/login', {\r\n authCode: 'unset'\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n cookies.set('authCode', 'unset', '14d')\r\n authCode = 'unset'\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'login' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"171\":\"833208d0\",\"196\":\"81b1627f\",\"226\":\"577ea134\",\"239\":\"32572dba\",\"357\":\"c54040b4\",\"419\":\"99e00aec\",\"672\":\"11bec4e1\",\"698\":\"77f859a8\",\"845\":\"6b4cb4a5\",\"917\":\"5bf3db27\",\"946\":\"45a1d5c4\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"196\":\"3609e672\",\"226\":\"6548e7b4\",\"239\":\"6563616d\",\"357\":\"1ca52a5a\",\"419\":\"1d235d6e\",\"672\":\"aed3581b\",\"698\":\"aed3581b\",\"845\":\"6b45e8e3\",\"917\":\"8529ad1e\",\"946\":\"238d597a\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"196\":1,\"226\":1,\"239\":1,\"357\":1,\"419\":1,\"672\":1,\"698\":1,\"845\":1,\"917\":1,\"946\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(3354); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","interceptors","request","use","config","withAuthCode","authCode","cookies","headers","error","Promise","reject","response","status","ElMessage","router","push","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","computed","mounted","this","$nextTick","initOverlayScrollbars","watch","useDarkMode","setSiteIcon","methods","valid","document","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","console","log","existingIcons","querySelectorAll","forEach","icon","remove","iconLink","createElement","appleIconLink","maskIconLink","rel","href","userConfig","siteIcon","head","appendChild","__exports__","library","add","fas","app","createApp","App","createHead","component","FontAwesomeIcon","key","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","documentElement","isDarkMode","store","state","cusDarkMode","window","matchMedia","matches","now","Date","hour","getHours","commit","classList","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","dispatch","then","getters","subscribe","mutation","type","payload","ElementPlus","mount","catch","createStore","bingWallPapers","credentials","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","compressQuality","compressBar","serverCompress","storeUploadChannel","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","value","setStoreUploadChannel","uploadChannel","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","get","data","fetchBingWallPapers","wallpapers","map","wallpaper","url","all","resolve","img","Image","onload","onerror","src","modules","plugins","createPersistedState","adminAuthGuard","to","from","next","name","btoa","withCredentials","res","Error","err","userAuthGuard","post","routes","path","beforeEnter","createRouter","history","createWebHistory","process","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","code","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/app.6d1ac7b7.js.map.gz b/js/app.6d1ac7b7.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..638f9f933a7c0e55fac38e96073532393a5f5353 GIT binary patch literal 15203 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 literal 0 HcmV?d00001 diff --git a/js/app.8353468e.js.map.gz b/js/app.8353468e.js.map.gz deleted file mode 100644 index 6fdd9bedc7fbd66b14388c757e75c625a74f3b13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15198 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