From c1cf176698ec703c66038e2c951e33de31cd7a74 Mon Sep 17 00:00:00 2001 From: MarSeventh <1193267292@qq.com> Date: Fri, 23 Jan 2026 21:20:56 +0800 Subject: [PATCH] update v2.5.4 --- css/157.6f29c6ed.css | 1 - css/157.6f29c6ed.css.gz | Bin 8828 -> 0 bytes css/925.b22712db.css | 1 + css/925.b22712db.css.gz | Bin 0 -> 9084 bytes index.html | 2 +- index.html.gz | Bin 510 -> 510 bytes js/157.4b1645b7.js.gz | Bin 92557 -> 0 bytes js/157.4b1645b7.js.map.gz | Bin 327773 -> 0 bytes js/{157.4b1645b7.js => 925.2ee8e454.js} | 6 +++--- js/925.2ee8e454.js.gz | Bin 0 -> 92555 bytes ...57.4b1645b7.js.map => 925.2ee8e454.js.map} | 2 +- js/925.2ee8e454.js.map.gz | Bin 0 -> 327772 bytes js/{app.98eb0a2b.js => app.0ada2a3c.js} | 4 ++-- js/{app.98eb0a2b.js.gz => app.0ada2a3c.js.gz} | Bin 5171 -> 5170 bytes ...pp.98eb0a2b.js.map => app.0ada2a3c.js.map} | 2 +- js/app.0ada2a3c.js.map.gz | Bin 0 -> 16002 bytes js/app.98eb0a2b.js.map.gz | Bin 16004 -> 0 bytes 17 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 css/157.6f29c6ed.css delete mode 100644 css/157.6f29c6ed.css.gz create mode 100644 css/925.b22712db.css create mode 100644 css/925.b22712db.css.gz delete mode 100644 js/157.4b1645b7.js.gz delete mode 100644 js/157.4b1645b7.js.map.gz rename js/{157.4b1645b7.js => 925.2ee8e454.js} (99%) create mode 100644 js/925.2ee8e454.js.gz rename js/{157.4b1645b7.js.map => 925.2ee8e454.js.map} (99%) create mode 100644 js/925.2ee8e454.js.map.gz rename js/{app.98eb0a2b.js => app.0ada2a3c.js} (95%) rename js/{app.98eb0a2b.js.gz => app.0ada2a3c.js.gz} (65%) rename js/{app.98eb0a2b.js.map => app.0ada2a3c.js.map} (98%) create mode 100644 js/app.0ada2a3c.js.map.gz delete mode 100644 js/app.98eb0a2b.js.map.gz diff --git a/css/157.6f29c6ed.css b/css/157.6f29c6ed.css deleted file mode 100644 index fdf1d78..0000000 --- a/css/157.6f29c6ed.css +++ /dev/null @@ -1 +0,0 @@ -.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}}.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%}}.status-panel[data-v-1132f6a8]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-1132f6a8]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-1132f6a8]{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-1132f6a8]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow);background:var(--admin-dashborad-stats-hover-bg-color)}.card-icon[data-v-1132f6a8]{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,#60a5fa,#93c5fd);color:#fff}.card-content[data-v-1132f6a8]{flex:1}.card-title[data-v-1132f6a8]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-1132f6a8]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-1132f6a8]{font-size:11px;color:#999;margin-top:4px;opacity:.8}.charts-section[data-v-1132f6a8]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:20px;margin-bottom:30px;overflow:visible}.chart-card[data-v-1132f6a8]{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-1132f6a8]:hover{box-shadow:var(--admin-dashboard-stats-hover-shadow)}.chart-card[data-v-1132f6a8],.chart-content[data-v-1132f6a8],.pie-chart-container[data-v-1132f6a8],.pie-chart-wrapper[data-v-1132f6a8]{overflow:visible}.chart-header[data-v-1132f6a8]{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-1132f6a8]{margin-right:10px;color:var(--admin-purple)}.chart-content[data-v-1132f6a8]{min-height:160px;padding:15px;margin:-5px}.empty-state[data-v-1132f6a8]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#999;font-size:14px}.empty-state .fa-icon[data-v-1132f6a8]{font-size:32px;margin-bottom:10px}.stats-list[data-v-1132f6a8]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-1132f6a8]{display:flex;align-items:center;gap:12px}.stats-label[data-v-1132f6a8]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-1132f6a8]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-1132f6a8]{height:100%;background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:4px;transition:width .6s ease}.type-fill[data-v-1132f6a8]{background:linear-gradient(90deg,#4caf50,#81c784)}.stats-value[data-v-1132f6a8]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-1132f6a8]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-1132f6a8]{position:relative;width:180px;height:180px;flex-shrink:0;padding:15px;box-sizing:content-box;overflow:visible;isolation:isolate}.chart-center-text[data-v-1132f6a8]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:-1}.center-value[data-v-1132f6a8]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-1132f6a8]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-1132f6a8]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-1132f6a8]{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-1132f6a8]:hover{background:rgba(0,0,0,.06);transform:translateX(4px)}html.dark .legend-item[data-v-1132f6a8]{background:hsla(0,0%,100%,.05)}html.dark .legend-item[data-v-1132f6a8]:hover{background:hsla(0,0%,100%,.1)}.legend-color[data-v-1132f6a8]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-1132f6a8]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-1132f6a8]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-1132f6a8]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-1132f6a8]{margin-bottom:30px}.action-card[data-v-1132f6a8]{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-1132f6a8]{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-1132f6a8]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-1132f6a8]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-1132f6a8]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-1132f6a8]{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-1132f6a8]{flex:1;width:auto;min-width:0;height:auto}}.action-btn[data-v-1132f6a8]:hover{transform:translateY(-2px)}.action-btn .fa-icon[data-v-1132f6a8]{margin-right:8px}.rebuild-btn[data-v-1132f6a8]{background:linear-gradient(135deg,var(--admin-purple),#e1bee7)}.rebuild-btn[data-v-1132f6a8]:hover{box-shadow:0 6px 16px rgba(179,157,219,.4)}.backup-btn[data-v-1132f6a8]{background:linear-gradient(135deg,#4caf50,#81c784)}.backup-btn[data-v-1132f6a8]:hover{box-shadow:0 6px 16px rgba(76,175,80,.4)}.restore-btn[data-v-1132f6a8]{background:linear-gradient(135deg,#ff9800,#ffb74d)}.restore-btn[data-v-1132f6a8]:hover{box-shadow:0 6px 16px rgba(255,152,0,.4)}.restore-section[data-v-1132f6a8]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-1132f6a8],.action-buttons>.restore-section[data-v-1132f6a8],.restore-section[data-v-1132f6a8]{flex:1;width:100%}.action-btn[data-v-1132f6a8]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-1132f6a8]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-1132f6a8]{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}.card-bg-media[data-v-1132f6a8]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-1132f6a8],.card-bg-media[data-v-1132f6a8] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-1132f6a8] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-1132f6a8]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-1132f6a8]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-1132f6a8]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.6),transparent);z-index:2}.file-card-header .fa-icon[data-v-1132f6a8]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-1132f6a8]{color:#f59e0b}.info-card-footer[data-v-1132f6a8]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.7),transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-1132f6a8]{font-size:14px;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)}.info-card-footer .file-meta[data-v-1132f6a8]{font-size:12px;color:hsla(0,0%,100%,.8);text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-1132f6a8]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-1132f6a8]{height:450px}}.file-info-card[data-v-1132f6a8]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.file-info-card:hover .card-bg-media[data-v-1132f6a8]{transform:scale(1.05)}@media (max-width:768px){.status-panel[data-v-1132f6a8]{padding:15px}.charts-section[data-v-1132f6a8],.file-info-section[data-v-1132f6a8],.overview-cards[data-v-1132f6a8]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-1132f6a8]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-1132f6a8]{font-size:24px}.action-buttons[data-v-1132f6a8]{flex-direction:column;gap:12px}.action-btn[data-v-1132f6a8]{width:100%;min-width:unset}}.stats-fill[data-v-1132f6a8]{animation:fillAnimation-1132f6a8 1s ease-out}@keyframes fillAnimation-1132f6a8{0%{width:0}}.progress-container[data-v-1132f6a8]{width:100%;padding:20px;text-align:center}.progress-header[data-v-1132f6a8]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-1132f6a8]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-1132f6a8]{font-size:18px;font-weight:700;color:var(--admin-purple)}.progress-bar[data-v-1132f6a8]{margin-bottom:16px}.progress-bar[data-v-1132f6a8] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-1132f6a8] .el-progress-bar__inner{background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:6px;transition:width .3s ease}.progress-details[data-v-1132f6a8]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-1132f6a8],.progress-time[data-v-1132f6a8]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-1132f6a8],.progress-time .fa-icon[data-v-1132f6a8]{color:var(--admin-purple);font-size:12px}.progress-message[data-v-1132f6a8]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-1132f6a8]{margin-top:8px}.cancel-btn .fa-icon[data-v-1132f6a8]{margin-right:6px}.error-container[data-v-1132f6a8]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-1132f6a8]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-1132f6a8]{text-align:center}.error-message[data-v-1132f6a8]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-1132f6a8]{font-size:13px;color:#666}.error-actions[data-v-1132f6a8]{display:flex;gap:12px}.error-actions .fa-icon[data-v-1132f6a8]{margin-right:6px}html.dark .progress-count[data-v-1132f6a8],html.dark .progress-time[data-v-1132f6a8]{color:#aaa}html.dark .progress-message[data-v-1132f6a8]{color:#999}html.dark .error-container[data-v-1132f6a8]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-1132f6a8]{color:#aaa}@media (max-width:768px){.error-container[data-v-1132f6a8],.progress-container[data-v-1132f6a8]{padding:16px}.progress-header[data-v-1132f6a8]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-1132f6a8]{flex-direction:column;gap:8px}.error-actions[data-v-1132f6a8]{flex-direction:column;width:100%}.error-actions .el-button[data-v-1132f6a8]{width:100%}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}: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-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-input-number{display:inline-flex}.el-input-number{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}.custom-select[data-v-6c59d112]{position:relative}.custom-select-trigger[data-v-6c59d112]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:var(--el-bg-color);border:1px solid var(--el-border-color);border-radius:8px;cursor:pointer;transition:all .2s ease;box-sizing:border-box}.custom-select-trigger[data-v-6c59d112]:hover{border-color:var(--el-color-primary-light-5)}.custom-select.is-open .custom-select-trigger[data-v-6c59d112]{border-color:var(--el-color-primary)}.custom-select-value[data-v-6c59d112]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-6c59d112],.custom-select-value.is-placeholder[data-v-6c59d112]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-6c59d112]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-6c59d112]{transform:rotate(180deg)}.custom-select-dropdown[data-v-6c59d112]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);border-radius:8px;box-shadow:var(--el-box-shadow-light);z-index:2000;overflow:hidden}.custom-select-option[data-v-6c59d112]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-6c59d112]:hover{background:var(--el-fill-color-light)}.custom-select-option.is-selected[data-v-6c59d112]{color:var(--el-color-primary);font-weight:500}.option-icon[data-v-6c59d112]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-6c59d112],.dropdown-fade-leave-active[data-v-6c59d112]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-6c59d112],.dropdown-fade-leave-to[data-v-6c59d112]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-89234e52]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-89234e52]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-89234e52]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-89234e52]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.add-btn[data-v-89234e52]{border-radius:8px}.header-actions[data-v-89234e52]{display:flex;gap:12px}.header-actions[data-v-89234e52] .el-button{border-radius:8px}.channel-group[data-v-89234e52]{margin-bottom:32px;background:var(--el-bg-color);border-radius:12px;border:1px solid var(--el-border-color-lighter);overflow:hidden}.group-header[data-v-89234e52]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--el-fill-color-lighter);border-bottom:1px solid var(--el-border-color-lighter)}.group-title[data-v-89234e52]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-89234e52]{font-size:18px;color:var(--el-color-primary)}.channel-count[data-v-89234e52]{font-size:12px}.load-balance-switch[data-v-89234e52]{display:flex;align-items:center;gap:8px}.switch-label[data-v-89234e52]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-89234e52]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-89234e52]{background:var(--el-bg-color);border-radius:10px;border:1px solid var(--el-border-color-extra-light);border-left:3px solid var(--el-border-color-light);transition:all .25s ease;overflow:hidden;position:relative;display:flex;flex-direction:column}.card-glow[data-v-89234e52]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card[data-v-89234e52]:hover{border-color:var(--el-border-color-light);box-shadow:0 4px 12px rgba(0,0,0,.08)}.channel-card.disabled[data-v-89234e52]{opacity:.6;background:var(--el-fill-color-lighter)}.channel-card.telegram[data-v-89234e52]{border-left-color:#54a9eb}.channel-card.cfr2[data-v-89234e52]{border-left-color:#f6821f}.channel-card.s3[data-v-89234e52]{border-left-color:#569a31}.channel-card.discord[data-v-89234e52]{border-left-color:#5865f2}.channel-card.huggingface[data-v-89234e52]{border-left-color:#ffd21e}.channel-card.fixed[data-v-89234e52]{border-left-width:3px;border-left-style:dashed}.card-header[data-v-89234e52]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--el-fill-color-lighter);border-bottom:1px solid var(--el-border-color-lighter)}.card-title[data-v-89234e52]{display:flex;align-items:center;gap:8px}.channel-name[data-v-89234e52]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-89234e52]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-89234e52]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-89234e52]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-89234e52]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-89234e52]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-89234e52]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-89234e52] .el-progress{margin-bottom:4px}.quota-text[data-v-89234e52]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-89234e52]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--el-border-color-lighter);background:var(--el-fill-color-blank);margin-top:auto}.empty-tip[data-v-89234e52]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-89234e52]{font-size:32px}.channel-warning[data-v-89234e52]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.select-option-icon[data-v-89234e52]{width:18px;margin-right:8px;text-align:center}.form-tip[data-v-89234e52]{margin-left:12px;font-size:12px;color:var(--el-text-color-secondary)}.form-warning[data-v-89234e52]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-89234e52]{width:100%}.quota-status[data-v-89234e52] .el-progress{margin-bottom:8px}.quota-info[data-v-89234e52]{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-89234e52]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-89234e52]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-89234e52]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-89234e52]{animation:fa-spin-89234e52 1s linear infinite}@keyframes fa-spin-89234e52{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-89234e52]{padding:12px}.page-header[data-v-89234e52]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-89234e52]{grid-template-columns:1fr;padding:12px}.group-header[data-v-89234e52]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-89234e52] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-89234e52] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-26e68e9c]{position:fixed;right:var(--floating-btn-right,32px);bottom:var(--floating-btn-bottom,32px);display:flex;align-items:center;gap:8px;padding:14px 24px;background:var(--floating-btn-bg);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:15px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-26e68e9c]:hover{transform:translateY(-3px);box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-26e68e9c]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-26e68e9c]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-26e68e9c]:hover{transform:none}.floating-save-btn svg[data-v-26e68e9c]{font-size:16px}@media (max-width:768px){.floating-save-btn[data-v-26e68e9c]{right:20px;bottom:20px;padding:12px 20px;font-size:14px}.floating-save-btn svg[data-v-26e68e9c]{font-size:14px}}@media (max-width:480px){.floating-save-btn[data-v-26e68e9c]{right:16px;bottom:16px;padding:14px;border-radius:50%}.save-text[data-v-26e68e9c]{display:none}.floating-save-btn svg[data-v-26e68e9c]{font-size:18px}}.security-settings[data-v-63b9b06c]{padding:20px;min-height:500px}.first-settings[data-v-63b9b06c]{margin-bottom:40px}.first-title[data-v-63b9b06c]{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-63b9b06c]{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-63b9b06c] .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-63b9b06c] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-63b9b06c] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-63b9b06c] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-63b9b06c] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-63b9b06c] .el-input,.first-settings[data-v-63b9b06c] .el-select{width:100%}.first-settings[data-v-63b9b06c] .el-switch{--el-switch-on-color:var(--el-color-primary)}.token-title[data-v-63b9b06c]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-63b9b06c]{margin-left:5px}.token-table-container[data-v-63b9b06c]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-63b9b06c]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.token-table[data-v-63b9b06c] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-63b9b06c] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-63b9b06c] .el-table{border-radius:12px}.token-table[data-v-63b9b06c] .el-table__header{background-color:#f8f9fa}.token-table[data-v-63b9b06c] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-63b9b06c] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-63b9b06c] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-63b9b06c]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px}.action-buttons[data-v-63b9b06c]{gap:8px}.action-button[data-v-63b9b06c]{margin-left:0}.permission-tag[data-v-63b9b06c]{margin:2px!important}.token-display[data-v-63b9b06c]{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-63b9b06c]{padding:15px;padding-bottom:80px}.first-settings[data-v-63b9b06c] .el-form{padding:12px 15px}.first-settings[data-v-63b9b06c] .el-form-item__content{max-width:100%}.token-table-container[data-v-63b9b06c]{padding:0 10px}.table-cell-content[data-v-63b9b06c]{padding:6px 2px;min-height:36px}.token-display[data-v-63b9b06c]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-63b9b06c]{padding:0 5px}.table-cell-content[data-v-63b9b06c]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-63b9b06c]{padding:4px 8px;font-size:12px}.permission-tag[data-v-63b9b06c]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-63b9b06c]{padding:10px 0}.token-result .el-form-item[data-v-63b9b06c]{margin-bottom:20px}.dialog-footer[data-v-63b9b06c]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-63b9b06c],.fade-slide-leave-active[data-v-63b9b06c]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-63b9b06c],.fade-slide-leave-to[data-v-63b9b06c]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-63b9b06c],.fade-slide-leave-from[data-v-63b9b06c]{opacity:1;transform:translateY(0)}[data-v-63b9b06c] .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-7b8c65e5]{padding:20px;min-height:500px}.first-settings[data-v-7b8c65e5]{margin-bottom:40px}.first-title[data-v-7b8c65e5]{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-7b8c65e5]{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-7b8c65e5] .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-7b8c65e5] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-7b8c65e5] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-7b8c65e5] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-7b8c65e5] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-7b8c65e5] .el-input,.first-settings[data-v-7b8c65e5] .el-select{width:100%}.first-settings[data-v-7b8c65e5] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.page-settings[data-v-7b8c65e5]{padding:15px;padding-bottom:80px}.first-settings[data-v-7b8c65e5] .el-form{padding:12px 15px}.first-settings[data-v-7b8c65e5] .el-form-item__content{max-width:100%}}.others-settings[data-v-0c6af1f8]{padding:20px;min-height:500px}.first-settings[data-v-0c6af1f8]{margin-bottom:40px}.first-title[data-v-0c6af1f8]{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-0c6af1f8]{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-0c6af1f8] .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-0c6af1f8] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-0c6af1f8] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-0c6af1f8] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-0c6af1f8] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-0c6af1f8] .el-input{width:100%}.first-settings[data-v-0c6af1f8] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-0c6af1f8]{padding:15px;padding-bottom:80px}.first-settings[data-v-0c6af1f8] .el-form{padding:12px 15px}.first-settings[data-v-0c6af1f8] .el-form-item__content{max-width:100%}}.container[data-v-4cdf1dc2]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.header-content[data-v-4cdf1dc2]{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-4cdf1dc2]{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-4cdf1dc2]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-4cdf1dc2]{font-size:.95em}}.header-content[data-v-4cdf1dc2]: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-4cdf1dc2]: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-4cdf1dc2]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-4cdf1dc2]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-4cdf1dc2]{display:flex;gap:10px}.main-container[data-v-4cdf1dc2]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-4cdf1dc2]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-4cdf1dc2],.main-container[data-v-4cdf1dc2]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file diff --git a/css/157.6f29c6ed.css.gz b/css/157.6f29c6ed.css.gz deleted file mode 100644 index da6ae06befd8501db693d78638de1858396265b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8828 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.el-tooltip[data-v-b126e9b2],.action-buttons>.restore-section[data-v-b126e9b2],.restore-section[data-v-b126e9b2]{flex:1;width:100%}.action-btn[data-v-b126e9b2]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-b126e9b2]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-b126e9b2]{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}.card-bg-media[data-v-b126e9b2]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-b126e9b2],.card-bg-media[data-v-b126e9b2] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-b126e9b2] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-b126e9b2]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-b126e9b2]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-b126e9b2]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.6),transparent);z-index:2}.file-card-header .fa-icon[data-v-b126e9b2]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-b126e9b2]{color:#f59e0b}.info-card-footer[data-v-b126e9b2]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.7),transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-b126e9b2]{font-size:14px;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)}.info-card-footer .file-meta[data-v-b126e9b2]{font-size:12px;color:hsla(0,0%,100%,.8);text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-b126e9b2]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-b126e9b2]{height:450px}}.file-info-card[data-v-b126e9b2]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.file-info-card:hover .card-bg-media[data-v-b126e9b2]{transform:scale(1.05)}@media (max-width:768px){.status-panel[data-v-b126e9b2]{padding:15px}.charts-section[data-v-b126e9b2],.file-info-section[data-v-b126e9b2],.overview-cards[data-v-b126e9b2]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-b126e9b2]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-b126e9b2]{font-size:24px}.action-buttons[data-v-b126e9b2]{flex-direction:column;gap:12px}.action-btn[data-v-b126e9b2]{width:100%;min-width:unset}}.stats-fill[data-v-b126e9b2]{animation:fillAnimation-b126e9b2 1s ease-out}@keyframes fillAnimation-b126e9b2{0%{width:0}}.progress-container[data-v-b126e9b2]{width:100%;padding:20px;text-align:center}.progress-header[data-v-b126e9b2]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-b126e9b2]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-b126e9b2]{font-size:18px;font-weight:700;color:var(--admin-purple)}.progress-bar[data-v-b126e9b2]{margin-bottom:16px}.progress-bar[data-v-b126e9b2] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-b126e9b2] .el-progress-bar__inner{background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:6px;transition:width .3s ease}.progress-details[data-v-b126e9b2]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-b126e9b2],.progress-time[data-v-b126e9b2]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-b126e9b2],.progress-time .fa-icon[data-v-b126e9b2]{color:var(--admin-purple);font-size:12px}.progress-message[data-v-b126e9b2]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-b126e9b2]{margin-top:12px;border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#ef4444}.cancel-btn[data-v-b126e9b2]:hover{background:rgba(239,68,68,.2);border-color:rgba(239,68,68,.5);transform:translateY(-2px);box-shadow:0 4px 12px rgba(239,68,68,.25)}.cancel-btn .fa-icon[data-v-b126e9b2]{margin-right:8px}.error-container[data-v-b126e9b2]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-b126e9b2]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-b126e9b2]{text-align:center}.error-message[data-v-b126e9b2]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-b126e9b2]{font-size:13px;color:#666}.error-actions[data-v-b126e9b2]{display:flex;gap:12px}.error-actions .el-button[data-v-b126e9b2]{border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:100px}.error-actions .el-button--primary[data-v-b126e9b2]{background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff}.error-actions .el-button--primary[data-v-b126e9b2]:hover{background:linear-gradient(135deg,#5a6fd6,#6a4190);transform:translateY(-2px);box-shadow:0 6px 16px rgba(102,126,234,.4)}.error-actions .el-button--default[data-v-b126e9b2]{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);color:var(--el-text-color-regular)}.error-actions .el-button--default[data-v-b126e9b2]:hover{background:hsla(0,0%,100%,.15);border-color:hsla(0,0%,100%,.3);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.15)}.error-actions .fa-icon[data-v-b126e9b2]{margin-right:8px}html.dark .progress-count[data-v-b126e9b2],html.dark .progress-time[data-v-b126e9b2]{color:#aaa}html.dark .progress-message[data-v-b126e9b2]{color:#999}html.dark .error-container[data-v-b126e9b2]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-b126e9b2]{color:#aaa}@media (max-width:768px){.error-container[data-v-b126e9b2],.progress-container[data-v-b126e9b2]{padding:16px}.progress-header[data-v-b126e9b2]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-b126e9b2]{flex-direction:column;gap:8px}.error-actions[data-v-b126e9b2]{flex-direction:column;width:100%}.error-actions .el-button[data-v-b126e9b2]{width:100%;margin:0}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}: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-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-input-number{display:inline-flex}.el-input-number{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}.custom-select[data-v-6c59d112]{position:relative}.custom-select-trigger[data-v-6c59d112]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:var(--el-bg-color);border:1px solid var(--el-border-color);border-radius:8px;cursor:pointer;transition:all .2s ease;box-sizing:border-box}.custom-select-trigger[data-v-6c59d112]:hover{border-color:var(--el-color-primary-light-5)}.custom-select.is-open .custom-select-trigger[data-v-6c59d112]{border-color:var(--el-color-primary)}.custom-select-value[data-v-6c59d112]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-6c59d112],.custom-select-value.is-placeholder[data-v-6c59d112]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-6c59d112]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-6c59d112]{transform:rotate(180deg)}.custom-select-dropdown[data-v-6c59d112]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);border-radius:8px;box-shadow:var(--el-box-shadow-light);z-index:2000;overflow:hidden}.custom-select-option[data-v-6c59d112]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-6c59d112]:hover{background:var(--el-fill-color-light)}.custom-select-option.is-selected[data-v-6c59d112]{color:var(--el-color-primary);font-weight:500}.option-icon[data-v-6c59d112]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-6c59d112],.dropdown-fade-leave-active[data-v-6c59d112]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-6c59d112],.dropdown-fade-leave-to[data-v-6c59d112]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-89234e52]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-89234e52]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-89234e52]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-89234e52]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.add-btn[data-v-89234e52]{border-radius:8px}.header-actions[data-v-89234e52]{display:flex;gap:12px}.header-actions[data-v-89234e52] .el-button{border-radius:8px}.channel-group[data-v-89234e52]{margin-bottom:32px;background:var(--el-bg-color);border-radius:12px;border:1px solid var(--el-border-color-lighter);overflow:hidden}.group-header[data-v-89234e52]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--el-fill-color-lighter);border-bottom:1px solid var(--el-border-color-lighter)}.group-title[data-v-89234e52]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-89234e52]{font-size:18px;color:var(--el-color-primary)}.channel-count[data-v-89234e52]{font-size:12px}.load-balance-switch[data-v-89234e52]{display:flex;align-items:center;gap:8px}.switch-label[data-v-89234e52]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-89234e52]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-89234e52]{background:var(--el-bg-color);border-radius:10px;border:1px solid var(--el-border-color-extra-light);border-left:3px solid var(--el-border-color-light);transition:all .25s ease;overflow:hidden;position:relative;display:flex;flex-direction:column}.card-glow[data-v-89234e52]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-89234e52]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card[data-v-89234e52]:hover{border-color:var(--el-border-color-light);box-shadow:0 4px 12px rgba(0,0,0,.08)}.channel-card.disabled[data-v-89234e52]{opacity:.6;background:var(--el-fill-color-lighter)}.channel-card.telegram[data-v-89234e52]{border-left-color:#54a9eb}.channel-card.cfr2[data-v-89234e52]{border-left-color:#f6821f}.channel-card.s3[data-v-89234e52]{border-left-color:#569a31}.channel-card.discord[data-v-89234e52]{border-left-color:#5865f2}.channel-card.huggingface[data-v-89234e52]{border-left-color:#ffd21e}.channel-card.fixed[data-v-89234e52]{border-left-width:3px;border-left-style:dashed}.card-header[data-v-89234e52]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--el-fill-color-lighter);border-bottom:1px solid var(--el-border-color-lighter)}.card-title[data-v-89234e52]{display:flex;align-items:center;gap:8px}.channel-name[data-v-89234e52]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-89234e52]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-89234e52]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-89234e52]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-89234e52]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-89234e52]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-89234e52]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-89234e52] .el-progress{margin-bottom:4px}.quota-text[data-v-89234e52]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-89234e52]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--el-border-color-lighter);background:var(--el-fill-color-blank);margin-top:auto}.empty-tip[data-v-89234e52]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-89234e52]{font-size:32px}.channel-warning[data-v-89234e52]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.select-option-icon[data-v-89234e52]{width:18px;margin-right:8px;text-align:center}.form-tip[data-v-89234e52]{margin-left:12px;font-size:12px;color:var(--el-text-color-secondary)}.form-warning[data-v-89234e52]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-89234e52]{width:100%}.quota-status[data-v-89234e52] .el-progress{margin-bottom:8px}.quota-info[data-v-89234e52]{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-89234e52]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-89234e52]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-89234e52]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-89234e52]{animation:fa-spin-89234e52 1s linear infinite}@keyframes fa-spin-89234e52{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-89234e52]{padding:12px}.page-header[data-v-89234e52]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-89234e52]{grid-template-columns:1fr;padding:12px}.group-header[data-v-89234e52]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-89234e52] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-89234e52] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-26e68e9c]{position:fixed;right:var(--floating-btn-right,32px);bottom:var(--floating-btn-bottom,32px);display:flex;align-items:center;gap:8px;padding:14px 24px;background:var(--floating-btn-bg);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:15px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-26e68e9c]:hover{transform:translateY(-3px);box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-26e68e9c]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-26e68e9c]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-26e68e9c]:hover{transform:none}.floating-save-btn svg[data-v-26e68e9c]{font-size:16px}@media (max-width:768px){.floating-save-btn[data-v-26e68e9c]{right:20px;bottom:20px;padding:12px 20px;font-size:14px}.floating-save-btn svg[data-v-26e68e9c]{font-size:14px}}@media (max-width:480px){.floating-save-btn[data-v-26e68e9c]{right:16px;bottom:16px;padding:14px;border-radius:50%}.save-text[data-v-26e68e9c]{display:none}.floating-save-btn svg[data-v-26e68e9c]{font-size:18px}}.security-settings[data-v-63b9b06c]{padding:20px;min-height:500px}.first-settings[data-v-63b9b06c]{margin-bottom:40px}.first-title[data-v-63b9b06c]{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-63b9b06c]{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-63b9b06c] .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-63b9b06c] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-63b9b06c] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-63b9b06c] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-63b9b06c] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-63b9b06c] .el-input,.first-settings[data-v-63b9b06c] .el-select{width:100%}.first-settings[data-v-63b9b06c] .el-switch{--el-switch-on-color:var(--el-color-primary)}.token-title[data-v-63b9b06c]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-63b9b06c]{margin-left:5px}.token-table-container[data-v-63b9b06c]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-63b9b06c]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.token-table[data-v-63b9b06c] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-63b9b06c] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-63b9b06c] .el-table{border-radius:12px}.token-table[data-v-63b9b06c] .el-table__header{background-color:#f8f9fa}.token-table[data-v-63b9b06c] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-63b9b06c] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-63b9b06c] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-63b9b06c]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px}.action-buttons[data-v-63b9b06c]{gap:8px}.action-button[data-v-63b9b06c]{margin-left:0}.permission-tag[data-v-63b9b06c]{margin:2px!important}.token-display[data-v-63b9b06c]{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-63b9b06c]{padding:15px;padding-bottom:80px}.first-settings[data-v-63b9b06c] .el-form{padding:12px 15px}.first-settings[data-v-63b9b06c] .el-form-item__content{max-width:100%}.token-table-container[data-v-63b9b06c]{padding:0 10px}.table-cell-content[data-v-63b9b06c]{padding:6px 2px;min-height:36px}.token-display[data-v-63b9b06c]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-63b9b06c]{padding:0 5px}.table-cell-content[data-v-63b9b06c]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-63b9b06c]{padding:4px 8px;font-size:12px}.permission-tag[data-v-63b9b06c]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-63b9b06c]{padding:10px 0}.token-result .el-form-item[data-v-63b9b06c]{margin-bottom:20px}.dialog-footer[data-v-63b9b06c]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-63b9b06c],.fade-slide-leave-active[data-v-63b9b06c]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-63b9b06c],.fade-slide-leave-to[data-v-63b9b06c]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-63b9b06c],.fade-slide-leave-from[data-v-63b9b06c]{opacity:1;transform:translateY(0)}[data-v-63b9b06c] .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-7b8c65e5]{padding:20px;min-height:500px}.first-settings[data-v-7b8c65e5]{margin-bottom:40px}.first-title[data-v-7b8c65e5]{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-7b8c65e5]{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-7b8c65e5] .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-7b8c65e5] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-7b8c65e5] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-7b8c65e5] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-7b8c65e5] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-7b8c65e5] .el-input,.first-settings[data-v-7b8c65e5] .el-select{width:100%}.first-settings[data-v-7b8c65e5] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.page-settings[data-v-7b8c65e5]{padding:15px;padding-bottom:80px}.first-settings[data-v-7b8c65e5] .el-form{padding:12px 15px}.first-settings[data-v-7b8c65e5] .el-form-item__content{max-width:100%}}.others-settings[data-v-0c6af1f8]{padding:20px;min-height:500px}.first-settings[data-v-0c6af1f8]{margin-bottom:40px}.first-title[data-v-0c6af1f8]{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-0c6af1f8]{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-0c6af1f8] .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-0c6af1f8] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-0c6af1f8] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-0c6af1f8] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-0c6af1f8] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-0c6af1f8] .el-input{width:100%}.first-settings[data-v-0c6af1f8] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-0c6af1f8]{padding:15px;padding-bottom:80px}.first-settings[data-v-0c6af1f8] .el-form{padding:12px 15px}.first-settings[data-v-0c6af1f8] .el-form-item__content{max-width:100%}}.container[data-v-4cdf1dc2]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.header-content[data-v-4cdf1dc2]{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-4cdf1dc2]{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-4cdf1dc2]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-4cdf1dc2]{font-size:.95em}}.header-content[data-v-4cdf1dc2]: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-4cdf1dc2]: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-4cdf1dc2]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-4cdf1dc2]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-4cdf1dc2]{display:flex;gap:10px}.main-container[data-v-4cdf1dc2]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-4cdf1dc2]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-4cdf1dc2],.main-container[data-v-4cdf1dc2]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file diff --git a/css/925.b22712db.css.gz b/css/925.b22712db.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..6dc7b92eca8f6cf674433e2c9a9a967637b85006 GIT binary patch literal 9084 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 5b9a7d3..ccd1ff9 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/index.html.gz b/index.html.gz index b48cc38b68958e9e39282dbf2262f70e5ab01efa..84622d5a23051ae68f4826a318fd88870a55fe3c 100644 GIT binary patch delta 168 zcmV;Z09XJ11O5ZBUjctyE2GZUg?oXR&ND^XxHOL>4d6 z`$pFts`lLAYnW=e{Fcnz$Uu({I8o@EpLmuKGNm*_J2K?M#D2S>w_^*2Fo!dS9i=VA zL=lspVdvP=$nZr?>iaSX465~LO8DwgWjw~<7?=+Gabd(#R>vT&vidK?xCxv&9Qa^&f90e!-|e8(fN6|&BfIPn$2yga~8`cGtVBgMP%_3 zy>E2gp=!?!zJ{rm%WuidjSTeYfD?tj`H5!jSOGZq`ohMz@S=>ri8B^RmNisj)Cd09~VX}WpyCzDy#oOjGMrj!-4PB W8aFkvTGUpDkNg(}RU4bw0{{S^bW$$> diff --git a/js/157.4b1645b7.js.gz b/js/157.4b1645b7.js.gz deleted file mode 100644 index defe2c7567748dd31c4e8302fdc627f8bc0f8cef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92557 zcmV)2K+L}%iwFP!000023e>%8mm^1ZAog9qqAJD4WEKKh0IE=rtj>bEo87}Eo88Us z<`aXh31kL1>BkVzJnko*B={InB3tD0{knnLW+< zgiC(T`X_woo@YGXYHo)i_vTPE4Y?oDB!RXU3nyknI!mPEovd_|dZvr?M2_?9Vk>1A zTQ9Dr?0%kSx$FGFA6Q*&O=d!F=?ZjfTBM)TWX62QTdF+Q0rX5qP8f!)`y77&UFH#8S+B;1CO)1mmmaRQ2w|HY9C;)Sxx3%qYkMb%bz3x?M+p@o za3(CBH4-kQvm{yAbF%ba!lRc?pXAjtl3hw?c~Sr_QR5;B8I#DHt9IkiZ4%*++MeqS zvs5IRm5k7(Ej zEIf_;F-_xyJ!c7vq^k=Ra~nMH+?dP(sxX2mONqT!2<@es*b(VD_}$kNK)8r0O&yXG z9Ps&>=Sp94nJ|yEygq3)N#=PTX|<0$uTsxmB}ZnXQNkL7nUq=Tl*8{e`-_DOe?r&y zed)n`RAIADwc2WmD!Fln_5ybunnI^>HX9_Yk@L}5IzcrtVMDoL`hBlY+TId&#yFg( zbixAX`IWeboAw1A2!~AbY$}4ewL-xhXl|hB4>7yW5t7Q8aF(PTnJ#%Z%MwP@qUd&O zxg;@_wAi8Z0>Ogb9M`pIkKlZrXiRh27|`4yxGI73^?&~2>o5Mz*MIiQS3meeXGu)8 z*)+*$TvSW4S==yby5^U^`m-cU#pPGG0V$&Wuvl(KmO&HU;NZm=r5OK!sIxMMKE7M z3~w&ST=;LW374)jo5obKpoF_awlTj<@s=bSv*_i!*?=cdUlAu6Uhp)|E_|M*EdP+l za(p{HJUBY}hUTTWB-P!xaYPok zbLe)Zj<+NOHq3JNCKEExu3T@f+sN4@J7=%m%#uVQcU$fKmN^cPY)Aeb&mEIq&&gRD z!_p>w(sRzvM3hb0!`LAXpmF28(H_J{t-}s=`h9iK%)*$A;D|XoYIWJ5DGq7OczNKtt{0xJo=yX+ zVnQ_Sc|iw(Bd&yG6Gfk#aEaxgX8)oTc(! zHkoEAOQpAgRhm$qR`{fXN7^(g&pY96`{;Pj?DKoYwpB-7V@gw&I7{-N z$jHuFe$LrNBcgc>XYBKmHqbma+|9ey)RHpXsb(On?kvgE%^hsvN!2J0^cNdDd-J-^ z?r-kwQ8ii226*f_OY(4I`yX7_{*%q^KP!`gR}c-sH2EVRRM%2}gq!BFrwiq^~gi=0lUnEUB!-z=3Z*LMx_ zR++2P&Fnu~sg|%2OJS0q6&Wh2k`3; z0#eG?f+UkSf|AP{VJYNwz)aj)1;pd^ zIt9#Uas}wqJR9Xqhzd|g7En!o(fo8n=5$O2%yYOYPt6o~+{saKq?k zioaRI3R6Pz33PCEZ4(nFgc`)zY9kCJG8G7%m*Z5Knj*biO)o)vv6@wOcyD!3s(_e{ zMoj3Hez00yBLh%+UA;}J%c`!JP~zRPa?XUza%SPsoz>olJYfx<4l}FJQyKOgkw;FS zyjblHY3yLs7}6ve(C8&l{<1@C4T}^ga=*;QZZLP4WfF5At<;4(CmaDQ$rC0ioB`#) zp1j7uo?Sn%tqYo`AOu^I4{sdc-OU61eB%I1#`>|`%vs;eQ`lns)WcS(=+j@1~B`{6Y+!8JAfh4bpC zKm78GU%vXm7q5Qu3x_mX-dd}7O0iF-1WPb%A3^W{Akg(?_9%;J!j#;@^%e`K>40#E zuwF|8rPaK7L>ANIeEmoN<*Ofl@ztOHAFqC@2i4y&-KT3Hd$9>*QIf$9*wDb60I!x| z%UiDrv9JH;-+%RYKY8`9|K`aEtOCS@3aRc2 zv4`+lY2%UI#)x49cShNbZS-%D!Bw$X-549^EEl{gk}Iz&B_d~2mOf(%qk;)QWBdDB zB!0MYMY5PR202Zm@y2!e0N16h$IyP=bx}gEAN}d8zxrP`ugDYPoI7<3oAt~Mrtaw; z_r5KrzWO)+;p@Np=LRMI!&iU*vl469r}u0PN*}JJ+}#8>F{U}gEA$e_yRXN)Z;w~W zYVoS3rFpM@^>2UshyUuUKmC)he)UhyxK_vXIq5aSFw{DXm+VSZa4Z_rG-b(iNu^jU z=1b2{SUQs9?hVxS@un&8bdX)@;dk`#JJ${W)nES6tDpVbS3mj1s~`W|4BQKD=<@wF zIKDwD(g+}*L2jmV4;a`tsiY*EB2S^Ra`{AkS~p&(=nzMjbJhX)=~~xs{Uhn-fd~ZLya|u*KR6A5~UlsnI^n_Gfe>f z#kV2|pL`QRIMQQ3`kfI3Dc69=hgUF-O@sexMJ zum86%zWN{j`SsKwmEVROKfNqQhFewt?y6N0Cs zo3{UKeVik?zV_1!3{imcCKFN4ajR_v`_QWLE|p^+k;2WuCPokJsg`#5rPRd&Jh3$+ zWr^S$T0rZO>?LblfOgOcT5aNpadx4kXu9oLH_MzuGTNSSO`YzXZLEYH`5R#3x5Xr9_CQ=tAe=!t5jb-;6M}zHd+>w29 zun#8!wD#Vf=Q<7nlE!*%eWPicTb}Cc)qnr*e)IEReD&*}Y+1+2O6A-KS=0nc9-pvh z3^XU#q*_})<)L92JBkCcGF(GlH_I(>o%b0b%@v|7ih)c#56_q z{xqRH4IGDnHaT#_geHlt+ly!#vE<1VjO2J}hN6-i1DU>tQn93Ge8LPp)0f3|yRy7r z{l!mT{qj#={i`2;`Rl(bR=89i+A2k_vf0rT?Ir-8trN5JjZ4lhql8Xywhftcv^?2( z>3zB0;>9(qgrl>Uh^*(9GSr)fa2SN!&VKeTD&SAYDUfBUolqz2l*7N@^~Ieu;<>?+R6cOt*CQwD z`2bKne?`yHL+Ed2PDW-XB98)R7bddn)Hk>7^SJJGhj}&$X*}U@HRTfY9p}ItuPA3H zEans@j^hYePxB;udg5x!;B>TSgdV78n_{5`*z*FI`UgB_+3#rTxRB@2pkB(>KMVky zCq0=-7Q;Ou$+9W@r8Ai+3SdJ-b3gm94UzpOc`9$_dS2XoFD?*PtIoB718l4{_2I^r zXr5;mjoDN)ni`wi*DE>x>Ic91`+uo4HP;DR?yuhs9?8w>1#2xp4-az6t`DD&>11X1 zSC(y)_VJ;74Hf3b4x!X@Nhi}nBe~8ue|thyHBPyfq^QPhlA;C6N3TOt%AtG%NwEs9 z?JGTme=tcY+y2Lq6sh@}GR?*3k3%=MPEomT69XVF|LgRYNcSSW%}3O}KjN*q7o;Fice!o1Qd>@&Ne zkEHvSblZNXvm-syB<)Ve^4WZ6L($D8KVB~>ccEEtx7BQtCTUrP-&-%-YBp7~t!C5H z^ZKp~=gpu=T0x7ngErX<_Q-y)PdY(|90UjCFgPSf!4WwQj>(;%)g*U=R*T#NZNQsB zYmeLyTKnWd(CQEhxdX_JAUB3w2D!ta)mf6aWe8Fqr`c-n?RO3ikB;x$z4zw*2Tq@S zB7t1JEqkp_P4Boui(H1eWmXu5F64NGV-91k^mDIP!yhB_V_<$z zYn22m{ACFbrB+HBXW8EecU#$O_G>j4y5WmO2mW+fIM0K2r&DVk?tEAFWUtlllTjt5 z-S3k@C1tPQCp1tEn6&+VAIdC)L+~`N)sDBZ7Z*D)E#JPqzbM)q1*Wkgc^|vNpB*dt z0Q)<}{xIRt$~@8?dmdpL5mJT-?uDoFcDvK*0%!uqDS<^xV1*ohcR!JVWG7~~be-RK z>I(RE1^T)Id_6_D6XpfVty=e(v2gdFxMPvf?qYl~Sd7KF_dWM}V#n<@>OT8k+^>6X zH;CED>-N4UNWX4n+*(g@yTMwbd&}#3-S3H=?|E7Ga?y@>R zZPjXS8n$-f!y{}bObOo!Q-DJAB)z?NlGf{<=%xLgu+?ArnrSpb_^mgFN27_PwWqUE=otgm)+no+>)qIx`5lVlw z3yUQE!7d{-Ea0VjCs}B%DyHP2OY51p+eQGO!?u|N-44U7R&%3}HZn2}^HaamjdtC3 zgElfRh<33iNy3P!)<{Gsd>=G-lDgmVNUym_$at}6lH6K`Spks3v;Iz=(<`3~{0px5 z5)Es?6axNf_q{;6s*2}N=+u43_VORGs-r&ikTasv%3{+E#m4K!h8v0{>%}IlJWpJC zYww_0-veabJ7|`L29>qSn9nX*=ZX+``R-@ZtwX98 zykmYDhp9B2Fi2|mJwn4eNE7hn%i#Au{x*xrLuY(3z<>$8R=+!CZVDFKUf_(yd67IU zl1JtjndbqAwHO5)R$~zGUK>cMSeEm=WGcvniXwp+dIFVTeDJpp!3n| z^hY5!Dg8kRjh5|QA>05kCPc-F0U|a|c!>BR!uKRvuENH|pY6U^P+*@T<^Dd9RQHWJ zUy`ji=3;pZ{-o*;un<1=mfrURD7K-L_kB&C&saFW1m$P`(jlJ&PJ-^`A;R+#w%;w|&fK6NkJXI3fXW9&#se7<0&rz{wJaJP#bObGaKhId#arz=1*| zhrAg$(6VsIGccHP$a{e!XZdHdj0=a{51cV~$kV{dGlx709GW=fF&NJ{O_l`rp3wMi`!Xa-34xpEaF}8pO28@rO zZfDquBZmyQ_-qE>L$)97J7kd1=w;wE@mKl|i=RxgG{*cv6gvb5GlakA`~{PNb41$% z)^^C?=>=SuI&Ipf4jIhy4`^Oy+#756k!IPIb`y-f7l=F!|HAK|f z--CoJni}9-Le-;zLoQY7(EvY2FWya`#(^_9Iyz`V!iR8krN{6;WPkhsI)o8kjy|?? zUXJNY9yo(|aCiXqCUo>bQfRl?#Fk(1bB5JBor6IeM(`Yk_s(#56k&tUqx*5-93Sts zqsSqbAIGXT<_Um(;IQN4gF_16Z(&qsKw`d z46M}RmP0P}!X587oAI7Q;ycsnGlXDk|5$yCmsimA0D%_s3ATK24FBUdHeGyY@klL7 ziyb$i#*lwJ$U*w!4BGIYLx#!oCmLsmLpp3aWSD&{AXE zpNYZq3|12UcgSd*38`B-Qrltl0#P$Q1bCTcj4AE3n-0NIA2s2BhbYJ)Tt^>2cytjs zG#(CNNpLcz*f>ks)w>sZyI_LU&^b6B>^tOH%xMa%6vdsW6Jf$A3!Hse^0q_x`SUA< zZctkz$gs%{jv|L7^!&lQdEl@Eb}*#o`y(;N8qHw`k}gsl>tQrR40$}s(&+whm?GrikCQ9yzD4(X7_ZHIh}ZN35RbYQw4OlSG@ao`;99X8{ELq5-^1M)w_qcGfSU~QNsS=;}i%yZj|HJ@nO>;lV>vem`;!y z4*_NqF67lyq3JPeIb@PW5f#r=!l2`jl%CU1Gqagu1_4A;dX6~kkQXuNB?D&|4?6%J zAV3Pc0UGcX-yHa~j4ShfLpkXF3}WaYA%(?2swT zXRt;`oxPz$G#WUTkf-8mkY{jo0Z|3A`t<4v($&_%F)Ve*u4>)ssFvoH@?PxSRglA8i>pQIu0r4U>Tj95_J?^1HcdbIDI&~Qp~!5*g4 zJ!ieFPe3jydwD+d$4vTgH<%wG8Hxt z^am>PoxzGaB%RO@luTU|Z3Z7{DWwro7T2yif&l+G z7}ii33fTg)MUkDFY;`?MF*_}?;l@Trfgpn*B{ZN*>!$WDtA-(Ti(3*bgZsu@`Z?Z! zq(9Ps2g}u)Qa&17Q_}ms5v1Nh>7%?I`pxEEYp;3KZMFU5_Kpl%ezVh2qMT`V0Roua zw!iN+AelTZtL-=UJ6*Yp)qrReRVIymYTLv0bzVx2L3)odVwsfJhCL8^E_yhQ2>(eCZV{u4N<5Hb)?rd0_D?i zuU1n+U8zWhR3t+xk^zm7qA-^AX$X3O-X8c(1TG74*ejibDV8qDe2TK%V$2UMymxYx zWTUsw9qBf`E)sqX~>C*!KsMJiHU@X ztHZ-bN``F3uB_Eu9-`EJvAC!H;6ObUn(Hhd4InBc{ywJ(kHhV4z8o>Rg^C z!wywTBoS1mwNf~uwtlF$wMXPq=z1oE8TO82Ugo2LF}&Zs;AZvQ+jU#@Y$x};dJCkbY1nEcg!?&?;$(;Wc|F|`eqQ%Gg!`i+d4$O$ zl{_et2beri$uy)p+^2Q7)u7%EjKGXOWP zDu>C!x1{Uu?MQ^+@s0$LwOTtsolAjU4iavVZih@Ynoa3vv)39%T@NEgf3{6yu)Aq@ zIt}UPNIBK-5fV@Jd!U*^2_UoM`o3vHzD*3UKxTMTxrQkysGQ}vxSNZ%$|l)2mo1vj zGg&QoS-}upYH763=vL={Dz?t|{f^(V70(wJ7s^TUQ{iX%$kH@-%4+wrROWmzlUXjl zt;YEYERAL%p0N;ZFY!E-p^;@nlC0O4o@<@_AKKFcvk0K@i-n>Q@Vh(;?i%58<$$Wy zR?jO<-nW|tdDll{5q#N~nIcy@7IG0+xMvZ5UnD$YZj&5(wVH#C_w9_vfu&XWe03Vz zVFGH7*|TluPE;?bhC}(jIKQ zD+BAWeWOysfn|p<$+6vMmjzO<^QVQX)jAtZIS7Z%(pY@R<=Ay@IbIhpLJyLR0yP31 zM^Kl$jJ)-aY-NW9by*_RM-`r|8n3%(7D4Tm`iAK=xpFyS7PLOIv|V@v!6gwc7l?)) zAG);Av=iaM9Wf1Qqji#=!VR&}@R(XqP9)q8Q}2W&f^DgSaEGLLdE8uz4_!nlPu)H3 zd#eN%I5Rz8(^S?=`+Wlc+7=pmd9520DzW5ZvCS3>Gn?)5;%Bx}3-87}Y~rb`ufF`Y zIH}h;fFccLkM{}OtazWKK9~XtCefE;I}B+hVX;V+5fSF7Ajm~OX75_oB4*nwz!!@K z>co#3MlM&Nny+m4C}%)DVK=Vc{UtEl#T_1(H*De@Pg0y!>aiYN>iZ#duYMNi87nX7 zrJ0JgRU54^3?a%Y?(wrThd9M+>Xy;|*a=2EZwwo(BKFMuL20cy4V_S#kJE>l6&dkpTmqFCOcyZw0uc^EO;NrZ(F8N}b zK&WEh0qpMel`ty=Q=wJLjr%e8B*SFZTvHqc2Y+oQyy(%9XQTJ>Y8T%yoeA z9z#1y_!|lif&7a>Ro@KYHuqaz5`CGy5AhV0=&LUEoLdI`83)OQb=Yl}=LE@B=B6`* zB-|Wac+~jdM~Ji&epD%^1rX_>-2kA7%e@VRuUzo4H6v$|%>DcpLNxL+T~9RPN*?j_A&Gg|-ibJw@i6A~h?5Zy75Csjee(R_i-#ZFKYRH2!NbQ7 zUwllaJdF5m>!?YF_^VAO_;;TSR5QDK7B?>wqOkPumlz^E1q<_g> zVPP;>{WTXHjQUhISS|S?%cX0q*c#09r`go4h(#`J)F@uVuoy#2gi-QRC1bknu0I&E z1rKB_7LMUZ9sP}AK%Wfp)7o$MtRZaUcxtt6E*{gzZiPp)`BA(6gO#0LU1kHI2D=U8 z<#l#y-vyo*xKxPnjrbnTsH_7+poCubL?3t)H9(4#7{qa;dVK?Zez8hH{mTZNC?aJ3RYUq$B(+eO@9?_V5ekvD;Te@QZM%Z-Vj1Y|hTqwV zz`BXn!)GU}!disFUj{~Yk2vhV9RAWq3MO%nxSPSRG5ks!6hd3# zudIMg8ipZVEZ|SJScqDUs$cnOQmc(`N97Pc*hl~o$B1R$C++D!u`vl7XzaBQ4~_`@ zduSDWR?IJKvBp7(eWw&Sy&a@~rsX-^@~5BZry_(pOqdtA*FAXTm`WH_zWTpsCSX( zMcZ&uSS~&CJ_pB;`!pK6tXMG~I%io5ZsJaz;E5hw2`A9!!rg|bMb%eUa2zAi-*Rz#&@7R59>Z34k z-eO%B<>lbhl+8fhOF-=-%{O4L@Vr3U=m@NyA#fk7>w}OqSFBjq!H0~%zBASd=D8yk z8O|Z^S(MAJ$*f8|Km+&PHu-Lagq9nm=twnxQn6p>MQ_-eZYyBc-Q#V(=2@^JE+I5T z?3ex-@T)A=Md$oEXbXajoU0!>IYWjp4w7Xk$vBio90bxm{nOV$`nqc=KDf+%mrg~1 zUUN~H`Sg+tGN14?h{=Rr1~W3@>6;2WgApW|kLfbZAjI4Ig5`ICixMtMj7G?OS=`@U z?j|H6vF9fl;aw5jlyqu-sgQ(`EA@kuGt@Rc0}C?|2tb)MoL|CfD;E6{mRxb=SCGmv^$Josq%M&r zi&9c(HyEa*Pz=ye_|Pt1+9y0+Ea017s&9G;-&ZQ1oBS)4j~$s!Rn@$sdj{16KnfrL zO{LTTv7jVOl>56;@V;%*YVNqQ5w<*UM_-;(7jMQpG2aEsBUU{3RJBG6oZ&WBskev_ z;XL6fqq&kVfj;M9`reGj_`Rc2p3J04YDgGG+tVej99Qm!e#g7r>iV4>xg!I(61WXh zq0usR?#%`~(#@A06sc;GkX3J$y;#}RZgyk<{Xng@s#Of`y%`{w>8LUnmELg6&UR!u zLc7d*e`acBmpc|j-kb5%?$qv9=h&TAXK58#?{#ga)!9DhDTAslg)~tnT)8vkp6TA? z7no4yV&5ho=T>PD6Nyc z?RQ}AD;>0PnLGqUd$m22TOb5x>+|cG%(PFsPB3&=y@~YO5!&UJH+2BA-P_Tua#3^R3&XT&u_Kb;7jK3cZySf z1;|VQ=#X{f5bd-etIZv(3XnIb?Qz|9PQ>7VSELL*Ao70%HR4KlV+HAXJ3GMB-oKuaq#odHTntS${3g3&LaB0a>6KB-X#tc~s zZ`Hx|)1(Yj{DmD>XRE{tNtO%!hN=PMR9*c!6G4KpxhcBxz}ubYsl%*dK( zIUux+=BBWEt}mDuC4+gf4ExRIa!J$^o105OK12?-az#+g5|_xaY_Y*Hj|&d))Uz9? zcVr!6H@PHZ9<$ADf;Ii?wP+AXF?)zQaEveHa=EnCoso^33BAfNtQCVX0wo4I%6KnIs`NHm8l0G zg4eLtT*d-!E^aAxR=0d;`C%#(Un!^_U@Q`Bo5TX=f$qh`l3|X-sw=QSL4Xcqg4Uuq zoT&)av)?v(xvLFh9H)*?TTWOGCvKr6M&3x@E}W)Q2z~UctYA!KuC58jK0eX*BcX(w zi7`7kZLO%d3jcUeiGioBk3;i_mB8S4(N|j zAqgO%X}nm--JA7=CN4pXw8oX0(p?; zyBud}oxnq33%poiGu;Kx0=2RYa6nK$gYsvC6^L=Nsz&ABY1pdOT_@QUrnAZjx*`6bxR&CR*SDKL>2Y(>wALmS^~h zLKg@F9f1pTl<+B39p&JB27h@R*lhy+!UH*IkvOLpPf|2bypuBu*^u-Cnt~5#^AQ3r zIKmHAQ7cZFU$ljpcubd>NMg$=EQvbaD}#xt7ze#R{(YiKHpzt=-BLe#U6yYVP`yJS zs|x+xH*|ASDv z3fAWL)1n~0K2c04G6(3yY%@Rwg<}Htbe0G6C7IAq)eoBRQCi9?qdXJhj!IK!51f&Y zpbKE_<2;)pBIw_G+~~CeE>BzKKTZFz<2gl1Gv2m3|MP4nnZ`q3qf^0~6+hQX0)|x! z+I-wvah3TkDyT=Mt{F+mvzYBuWx%Q|*S7RgW~PmF)XU%wsMV_(bO?Y4t5maeh95&Y zYmQ$wcL(g8n#7w_j7?#H;oY^=*!*5@n7|6dr6#qhpjn{#Dp$F(xTe?2MAnABp-#bj zT#AkMepeflEn^f>I3H}UIfMX3F0HFptkL+YHCky4)f0WNZc-LY@MqH)HW{p)uP`j@ zmaq)W`t+dTI5A(20|C3V^UF(7b$&rbA)KWJZyB1~0;H~7VM4VjwF9Bw^7KRV7W!XT zBvP5be{gW1Q?w9YfG4I(VCOtyD3^W)LqT^j%`Qz7DuMC<|M%ufIamACumpoBmkqLW z{Ol>qs7ZDXyAXdPPpgfih$FLEG*)^P{eflssug(DGMo?TgeO;l^PRU?a?T`==+Z5<@pNr8eU4jyE0G31)pBJB7|$QPLfQsZsB~A#Y_=; z4Bv@)@DMAUG@3Pfn3`J(oU7ObypaLV)7}wN2Kt0LYAJglwD{m) z-{PD(b+%Cx&zW#jGVf*mKwXG}6wHAyaxS%2eo1<)AIxpte3QV`svbGu;>C zZHQOA6Tv+joD;Rf!IB6CBi%wM@zSc5s=$I;N_>eE0+lZCuNUfq_)@s@n@>}Gu6E^M zQ6xm2Ik+_f`*gF=9^T?Ezk*6vtAdo}lJv%cM1l-N-#T&bS$9k@xd-){G8NUo6%q2f zfb{|70YT~Nzwm@l;5c60mA;}SUGt;JQq9$!>E)JFH|<#lcft;6rtG~~FD({|E*7pz z38g<_RLpYrf?a~2vX4wJ(Z<0kxW$6)iz`A}xp+SpB|3@_-<;FxVs#?uKj@nZA0wI% z=m>aOi1xmguvql^CyGXIE3eC{dr6-ZZb|WCp`DfD#o{jNgtd!8tb8`cVUt8*Y&sanqRj0y%Nvn(FPsyTo(&rPi!*x-@^8q#hV#BR3@q56Vm z<;JRv8eP^%y&VCu@>0uwQgdhE#*Ft@lp;xdOHx@lyG}cH&{kHhF#~8Y`2vJxz)D~e z8gD#0;6JcBUMcZVfA?-?^B?+Gj9ldb3O@_#i z#vCni@(9z1DuqZtN;1JzLnq1uA%eHLi+7%aC``NQZaWwf=>u>0B6E4YP@_(~ors81 z={oUth8~&J!vP0pcb@(~QvTXu=fFR~)?u*|j6=WEI@lSKBpf!zCQKx@QlD^dCn51_ zl8bX~jDrM(e&r~1`PpicU0y@C5fjnK$(T$U5hs(zkQZ6?84(b45>v^fOpl4EV-+%~ zTjd)wBI;Pa4(00+|AwhM0iX@o#i)TkfA86g)>(UJNX#lGfUL0Rc>~~@koHbQ+B=DE zYB{Ng6K=y&I)M!(Gv#3DRRHSk3@ZSG?^)%$tXJZZf|X~lJc6i_g21s;6j*Km1qxko z=+<;F@&Dz?6hkjI&f4_!WbEMsWAe)`W5^!Zzv4b}1eutp{ zDpa}zxi1^a2FI`4%t!529Y3#5!P|PO@~&<}pCFm7TW$jPg|V+Ljzaq&(xgT8L9jKV zyJ!@Ns?`SOsy)o7uEjb$(sK3UD73s3DqKZXI8{L3za-qh!UNQq@HkEw9OJ1KhMD=7 zb?#q6z>A`qAk4qA7Exd$$XjZOA~dochTGdB>MqQ9@y_Z1Ocju`>RV&?lweP5CF!8|dV$bzZi8JP21 zJWeGG0~l8lAWrRvP|9#_9x$VtBeGJ77NuZ}7C>y|`NBfL!hB#|QC5ycim%YhF~#mu z!2noANs|y(^KBoHRqRPo&-#+dah}aaWAMDjSPockZmb}yw><$Qjy0%HBRQi9TFvrw zbT_+v1n8ZItiB=d8EgTPgnU!QI|7siWE}EMRpH@a$d1C5;db4mJ_f_&@rj`Z3ZNEn z*Y;KaT?U=Gyv`aFWk;vK%x%%2bay}HRrvF9XCmR--sI+GrsDxsOS-}w7 zwJi#C*IGmZ7hThLR`Jx%L#l^ckW9xxk9tw+hs?zmue7W8;Z!T(32qRK01o#<6I$S; zUQfJnn8Cf5`bGv{t06$j1djl^S9(Q^wb!eXi(9EOcDVD}3s=o7mIbkMjDVqVuT*@B``@;nys#DWs7FWm3Nb+;RQ&;MRr z_qv`tyAuhNVGY! zTGLA>C>2nUa?1(iZU|A}6_;e(QFe;RD`-|;my1QS9Ohdq!<;XP2tNms0X|4wJH!I> z0(fRXiDpHYho^5~n2SD);Jp(89)Z-wg{ZzOV!Z~d4LjB0L zsKJq;G91kAlsOS-7qns=649i{xpZt>rO(#d=s6lSP?e*Q2o+Iuc3m@c1*r~^g4YdWXZvA)Y}iGx@5i8{Y_YgdGDsCnE_}ntd5Mk;aI&u5 z<7lE$L<;4k)%1*6l&X(s9aDe369FFFj#C!~3*U#J6u3fJ!hCpp)BVoF6r-i+W*mAy87xnKr-vI|bC5|j#CouZ3H%hTIVMab}Yqs7HE|w{i2(t+*s2xy0 z#)ZR z3x*=WP&;bU`mK!OgKdr&1ZA=?gT0i8+byrG&1<#05Yt2z=;f9B0HeglyZLvz) zI8>F5P&FFBqD&9$MjW#1GT)xAPm=`Jv1<@QEj{+DoMy-aa8CtVMVOSxeFl~ z;i2<#H4t`g9_A2}BUjX&++|oY*Zcz(NK65!Uo08K#KsKOicH-cWCgVv1<61L=G^6^ z@>NP`rj?e{qSgRKK)S!QGDGoXS3a-kkKlPr?RSJthF z0=egZn(@?i8mEp|hkxt9b^A1qP4J{7glPE?Ii*;b+*i8}7>pD~pTInmaF)8MIl4$n zAl)O0^&Z`~pQ*ioX1*Ikf$2bnwVJRZ;<27izGW=9`#KyUSZRA!3?3rFV(1{QkP!Pe zJe3%q{saO`Sy!wCu2{URJwvBrobQQ=A_W`*C0VVOL2$Yp%wdY?gry@=x^g7s99&VP2Rd|+H3;{!F-FIBpU{e z!c%x3R098qk3wkvL1VozSU-YIn-NavVgdC|s=;HETFrGgGRkzZpz0M*w`hfu1iChL zA?DU6!mVsXf_yn#l7P-nQ}ZmJ{T^RsB~^?Y?(wj)!W-`T({uwbS1{MEcY>kC(3=NH z?tEF^G;KIh|8ID?oZ`S)m+tJ`O@~}w~h$3}6!EmDEFt2kGg$yjIGI&a5o(CzKh%z_jF1}_t zF1hQ>JOr4U7>DYVM#Tu=Ba$XQXR>W)qqkHridda5{9f1ZMHZI9RZW1`j!#BB035FSale-zvMwt3I%y-?qoR+jpt40b6Gm^pqsfyNTt3_3cE^1-$y$ze+4irNQv#9VKiZ)Ao`Up(%Zi`0iq+XA_ zBpjPE5xCGp^t4*dJ>xFxMSapFXQ|iay{I4ZUQ}=O!)D+@P}Zowiv_4oS6_J<3^J_* znWLobk^FXejD~i5yQK?%?h$N0-N|;a4c!mb-xXT^0EF#)mCB@H4tJ3#%)!PsLvt{QN7v(hZ+DO6z3)fU7CeXf z{eGA>XptZwA!^Va*ft1VsF?J4zmXOd+oocj7740iU01YL{<*sUSODMv02T79j8AR$ zwbJxA!6>=1)i+@W7-?o0h&cnQuAow&M~3KuFtcLtjC-u#NZ>q4K{gE%H`#T^Fu??Y z11_r+vhwb@d&S+fmo-{_Z#xXtM;~^RPOanjZaYw)@Tb2-RL2mJxcamr{dzaOF1X+7 z>*|)7W4acQ8%3C4=AdLVH^tq~LP{v&42Mlrt6?=>ho^TvxDA-F+<+u0YRkiSQ~iq+ z%E?@bUNQNqC~#G%EtSyQQ+mD>b?>HBdvi1GqM7!3Gq#~+dW{Js@`y#;Cr~FUwX1bR zz2sBR1AmV+lUd4CVEzb#$UH3G+TdCGZWc4|xjN=Cvby%T6kXXX!x;AQJsX5I4dEHy z0@n0)c2ciXFArsp_DK?60IQG_*(+9+)>|ZNxT1@X_}t3SctAxE@JOz}p7@3o`*S<%Iq?i<$L)SYcfHd`#o);#rpIXb+Z&sxsj9;Z@EG>vBJ>L|#0(&iP4p zT~TUBBxpwn#?g~SWIcEr042ymy$N6q7B;^Zh)@!tIe|y1@;=HgQkK7|XYFeX(+@bi zP=>~n=}fX1RoH+)RR^+%X+`+?2!)?Y-hrYC6?v-&srNw|qVfvjOjNX14pEWXtoRX6 z){fNq5@N4+orY8AfsXKPqSmLk_c8i^A!Gj_1*3k^qy5kh#M@(as88#>?=2Qhb6pf# z_a&6>OK9DfFuE^+x-VgLUj~HF(lQ#AD~I7)s_PNv6z5p z{Iy!)M-9&Jfh2R~o%<1p=keFa0bPcoJT)LlARoHVQVe)6eTf$i&&$FT>?72MH|GO` z)iGu#_Y&}qM=K5QBnt)DXt7j&)R2mvv>`NGQSLLAAqD0d%L3@t}V$0u$*@O zxH0o~r#sx3mkXN>`8-_-1q~=sI9M?2Eg5c^Jk@GQ+n_8hc?fzPjzDnW)TJ7{*#__? zI-^*L6CjzG+eq|Z0~Ek~HI+tUei+~o5#CSTtT16A6kQovDnHacr9}a)axF@zZ$~?f zK>t=v?A0!3uvslCGmFZJ={gXL#RxyOx;KSyBO!i_MATX)jQF+NvP47gZ@3a6p(Ipe z>4fGZ4xU*VOe!sBEmvlZBgu47CJ`iQ+&2rp9NSS8#|^5=!e!4&7v1r$2%-ipcFZ_@oR*yAm}Dfe zZJ?q`b_B$+1e50xxX(slApqsZyX``+8i%Fo+iVpOt(k2d*J`3xGgw-yMW^L&Hww*% zH9i$#BHF>17uR8Ly*9LV%(2CyMN(+VfNMtpu3!ST1d+;3o?Xr}-aS^?QgsaP{Q$`= zBm&Bg0*o#ei*5Z?Oshyxt$<>`QX>35yqT$&b9(uGQYo);@h4<@#J$#23WSi0g&~g+ z78t&;Dj4#4Xh(NV-B1uyF-(cB6~ZAH$xFZD2_?`w2LHu4pvHzMwS)YsFr(Y86PaHX z!lXGoNjL@F|GD+_oCJqh@N+x?ZnIX?!FNGMbRQflAL-D?t|QS!7`=FzM~Y~`V1ap4 zNpBgUQ490trLVjlF8Hk#K0@(t2(iQ0!+%Z@vm!z z58Ld@Eetx=>XPbot{(*oO~CZhwgjK;1i_@ysTF1`2!d_GeW@wTwLr#kMWY*a8Whg1w{U_BR->|dwxMFN# zrp7c{sz_!dr5cIrVM1o`k8*lW(A(KaHMcW2cUdpKmGpa}@1gumKLiyw8f4aJEaO|y zz^%||;kIVC<66yyCcVuA&`{8JkrpfjwO{ixarr?l^UbiyirGWxLbcX8F#t;}fQ=2n z^xz_FBvyl)>A{VbVX-n~Y98nsk_j1*O9)Yah4C#klX8Z}a*3Og0U3I=8f=OjzC3b{ zS#W{LT}r@JHgPEyBQG)QapD_OSJanip2`|1z~Hso zw(#_$BDWdpo>HZI^3w9T5y+`#q_;vw^s79nr_0e(e5{1t(&{UZmM@b~s4%ahzGeSH zH>t4no}dPWK|;+)qMr3o(t1{Jon*H|jsp8qywl5WrTr7G@r?UIX47tB&<@{epbBhy zNbHsxl$$kL-mO%VKzJTJglG*|Kf@q8Uf|{-T!NH>&ShX;3;svTD(2+1+U72DyLoDv z%g|LBm0oSYm(?c;>~K&(aExZT*DvfEwzs8!1|1o&XR7;UNU6(-dZ`gB!@eqv5)v3j zuUbWomoCA)wy>N?!u)pD&Fg89ldc2;Slcu)h|&Y<@UG%p^h zzI>X{RUQ^hCNR{dwsox4cz0ZuvY(J0Z$u&WR*4AFisYn#IT;(Aj6zD{5Mv`E$jB^=Oa5x4Ug{uexta5BqZQ!h!_Xq$T-L)xZy?^2 zw-UW~WFw?SGAoiE+6(5sjp2P%%veqI95QVN zj7(brCDSIn*rNdN&S38)WZEjzX15YjU7aP|?qgW&$g9;xZcJv47Mc2p=@D#LN}^CM z256gNL z99~3sj!r)_AVf@SK|JjpWD?cg&LiMEG^1z=k6IMZ_zsywtxWNjHZhvg)u-^zVCX6e zZ_EYQQpT&`7vYG4rJIUP2Z2Yu;sG-lFWQ!Il#_Rxfl`|^6!k7rxfY|V$>w;H>X~=vNpZg>&B9DpiRJe2OI*>%W6b4|hjlUpH^mECk;AEmjcJLXL@A@^EKAI># zNOhL8Va~*Ob)w+>P@PbdR3WkH%_~)6HjTkA$0OH*PB&VsnG$*oI3itLh5$A{%`RNe zD1VzLHs}kWxcb>CylnZpan%2D$tI%uig;nbqH~RLOqiDM34+U%dWSoMXVe>w%%dR~ zUl8h_sp#!pm-=TilQcQy#X^B7xA+K60gq4&L<$-Qa18U%yrUncy|PPqt{k6N^-h#a z76dmcK&Wv>5DvPAsR@V=2H3g<5V!bi$XBfwnXvhaKqJDS!xyU;lV5tPcq>U$S+TAn zM9W)(c_qB3R`F@Hm*~VqmL64JfKx9z&UI7Z1!FK7To+(fAl`BL)Zg3;9g@xTgI<5R zBq)Y)mFYTPsw(EhP$RL%Xl*gpH!s~T(W($bGr;?|<|egXSs|0TUomevuDly@T?O-` z-V*oSb&xU;V)$CGwd?eLwRQt3DFe7_U?(|?XAv{6^%goDFo`)cg)vn6%8v7vx-0V# zY-N#G52ejR)`hlRgkQ0@S#|d<;o9^~vqw&3vDjue>|AaptvyrAVDxIs{@=vCYj@j5 z(k}W}Brb0T5StX`IWv22P;D;Ti6@?k6HlB>lHuY~AfiQf3<3-QTBJ$*_p_?1uK+07 z$vfwKvBgHC(bwv_K2_3@Ekgjp1&!T8q~QHaF9BEM9S+zl&fGeuq$V3dYl&5tO>_W3 zK(1rF3hrXn&D)rJNfX#E<_DE1p$Q-JZ1h*~&a4@NH#F^0u*;6e+ZY3=M;J}p??b>5 z78)Hzzn{^=X*OER9cIpTQ;$SK=ecNdR0GiMg%`4}Cv*w!<0gV{q<{gp%9X@%|k`IiG14oF^orJ}SFyewzci2j}* zk7YTcG!v>49TUg+XIB;ADlzK`;M(akV9pTzL{jY`){pGLQ8Y0J7}oQOqzCmHI(u-T zeu8F?OFgtAUxP7Bwa-giX)Q~kBc5xTlAy88sI=DCq0uM0Pc@BGd-?n-^z%Td?#*oH z=AbMXIx`00$=-Ynvxz&QvN>JO6d5`L7C$pvA#-MQz_W*DFSnZrL}R^)+zE8{QON}O ze(E!QaHm3FP;?C~fdS@5~Hvff@$%UI5Nt`H2pL5#zRxE@cNbu-XTiA(vvo`N4zzh6AN znm!#C5jbnQ2g{o5ub5;0FG9PNrcHflgAAM`!?3=OWfOhZ?r_6Knk_$@hmCksC=UYi z;W|`Gfl-Ju608uvMG}(WTDI9)rD?AaC0O3XZ#}b0_RA`mNkOJh%4-Xm4rr>BgBd_} zi00kICs50Y-t)>i;RIFev;I2hRD0X0AL?5D=;l|~BXFZ1?j3ma&>fBX*u=&%I+2Ip z#%oL(RJ0;z27(5xAPrA^N78#!BvwK_EBX5v**PzLrqN{T<3_RnCYNvN<%yT0C*>+G zMAGknaFlzaCpNhe+>O;rWC6)7x(b&yNivvzx&0MiC)-#ehRg+AXU>N(iro1PaYx{H zPf%980i}=JS;})0!!G6b93&8N2774EM;!YuxPwW-OJ1CrZw(W8nE1Od}%{;r)OV4VHO02e4 z?w+U<%iu3zi4NilWuOaJ>b4U9Rw}VfDP2%?SJDsX%dcYN;7)M}K5BhHDG)d4JEqqtV~By(JMxGa6gGzu&2FU55cNp zRb2YTxkph@=VSvLH7rnQ!R9s4JX>)Cx|d!P@ZN%e_X?o5hgmj{7Hk$noXTQul=@DP z|Jw)7?+C;BMdIjy>{0Fatq%@Wbb?75769~Ylu12$auDi&N$&v90it95s}nmC+a%wZ zyc_X`q?@X}bW^oMkZ3DayMtd;PDP~RH^2Sr@6UgD{qL`CUVr=Q^|!Bo_=SLxrczgU z``x?OUIpi%eHFI?7M+AW5S*-Ux0#${%(BE{2fx*^aav9;LrxAx@CN)3Ww!h`WkI16 zTRLgs-TNe?lQ~y@00KfO&f$;iu?bVADz0VQL5%fwG3lqJLPJX6(>jH^91*TVi5g4w zH!?+f@5g%Y=L91HM(UEKJf?K>uuJie1^*!i%mxTKPkfi5t+_>)d^}lRgUgBIO)X~2 zIXleKc_i6vH3z?&iX{a7qq8~#lkY+25bYQX*r z;Q`TH^Xy7LQ#Z+mZ$~#DWVww~bc2JBHcIf*8~l>9asJ)%44{NEjVy-kkZK4E$C*Pa zIVxB3u5!KlzKcB@A0lw+RHf%v+VE=f#=3S`p;k&T%FCl-n0k~Bwx{ZPsCwTw?Rs6` z)2(9wQKCOx#P|A7m5xax&OFos@9RIcCJ`uo0r@)$+U9ue(MAL!Mt|Y-!4WA{M$wAG z$3@bXrJU@=YAb2&ri}`jmGj0=h!Rs5n8EzPQVZY)1^z~Hsb}lqOwRj#r>)l0T8C1+ zh%vGpGgzQ=B4SBWRAa?H#wI*{T1736uL{|>u?@xo2X--9$s`dOFsV0+`uF<~fL})M zz_JR6n{=I0Mk=L!{PC0|?hE3JYRA#f+{qYa^l(IYfLZx&<7De{2of>*OJZe=r3Lm2 zZ&t;F>!kzr5<1O`qM%YL#y*dh!a} z_~ML`iJj3(CZn^rXt6#chvu_5OU??h1p8Id`5shQ$M3}%Kxm)I>P(hrSzeuKULU|u z;61Gk2$j@~G*)N5qEkd5T0kQk^X(>Q<5lg>v%f|p2DeX=R%}6rJ=!$^#7h`P#sXW2 zsHfcRAw&@jU6>B;^_PG|D)kSBw;{y-hiEb1yLI+nojue6=i0)pQ+RcX9_AnxHvJqr zBTMy0NdQ+Yhkyhz`rs7DECcO^7?Hb)872ODl^3rQ1l$|#Pd<(@5zxuUIXsppAE)s6 z!^y`h%>QPl+%q)L)`k;l(k0I9GS6#6B0Ju)jbau18h+2|K-Kj&F)p)ej)vs#s+FMe zcUTGSkvHK#AS%#=O!d$sT~gyEW-J6sKcudt_`k`|=o{r+zvWz4%ikpJkCku_I@wQJpCXFwLLwr+_1q|dDpVWYdXQ` z)r7$0NTaS4DjBXKN~17m1{;d$3DZ#+88Q0~3>1bORQ&&hq*3nDqPb$8|Ex=NbuXQd|o}!Loxb2GyLWd^IcP z3}SpKD06`hMhOQCff?qaj{AMRYgb|2(XA5*URpJP61!d_OhOUUWu3u3!mQuG&aHR` zndR7`4egb%EnDJn5%{v`I;&R~x%ApC4acv-sSYVJdkHMhy9^zncU(LcpL$}uVL zUjHn3Z{I>wOWPxI6I)V@R%v3i622Npw&h}$%vlP`7H3461RYAq5_eEoSU{l}R|-tW zTilLqryVQJnd3RvOp&6o54{9b1Kz-Fui0-|RvWnrc$#nQ5m`*}!D;{1=60$Oz<`fJ4aBF^o5Ily@ z)08UF-hGJmGHWPx91UWSA)TOP_oA8XJ|<w zPFE5k+i6x8wvhUh9IyeF0Nk9w>M&Vd=YxVGiuKf&v(+6o=Y*dzGS^>MZrZd4K7N zP1^rMDpt{{)Tn_gAhC;@Veh<Y?lKB2~{gWL3QG?4d~$eUehBTX+H+Me8nc+KnRf z`#5Nc6Ug9#ue@TpTc?&~qawanNxcEdT3xM>yiJ=SctrxXI`q!heNF0jsskOdhK_m! zKB)!Svhg`>R^hh3%|oO87|#XE&<@Te%jyT0w8_<|%FSBcqVz~6pj&ugJGgifpVEG# zaa3KLdIx|#jV;I7Vfq+=5~#s#X;BcIF%fDG0B-=5Jmwm`MHgyF!SMBKQ~w z8}b$1n054>rap;FcGm4z<1aLPauD^eY5~3Fahz(;0fW)fd+SEo@lm~Y88@5V^tE&K z0K=4*pRg`~Ne*y*zH%dODK{#NbJj>TBqrSe16=^do%NKmc?h7~=8OT+y1fXLg8*&~ z*Px`lPb6@nXJ#P(T z0v(&2?zQy#eb7<#=cVdfYkhDLY8`ZgbkgaP*5o@Kl}z6P3}VqrQGMo1W4w3ZYw8p` z@1NFIYqBvhe3sL^nqIGC@ch5`0UAU@QQTml&}t#OKV%&jX6Q^e2cTO|tslbASw08M zExqE7%HQU+v0&T6qIDRlKZE@et09pJXN<@$&q@`zAhS{wl^I6KvSA6SKCPu8Cf7i zU75BTPtAF*n{)S|YQ@H?XodB`F0<<4sNAG-L7kgO-x`K_#YmQNtJS!1^sVHz@9!&> zUM6&~b7we^Ij?ZiAanyi;$Aakp8*|(@)dXNn3PB_tZ(uR4&&P`#ylIu)nbY0%f@%r zb|;wi8vCoqTDQL|z6>koeh7kk4}Nq0O7z%6!qD)FUD?*&k<->A?Tx)x?DRu`>mxmZ z04w7L-<*}<(}`@h(3%=1?YDo-%FYfqUmCOKr#y)NCyt+br6y|h1Nh2XW*2}|P>E$;?B9w4kR0PBWkI=( z3tJLKLCmv@lI8p=WQWCSo4t?X%aUPS3SxR8a?@x7y#`rp7+*ehw&~At7peo*W--N8 z;Y9;>!fA%)L3Dfr$@JP{0l=eydSn*3YYY>mxTmzR@lgA~7gGVj2O8=jDu$3}RX@ay z5JQe_ebQI(Zag%b0|WampI)RI4j8scG0d?{YdC3s7G{1Lv#Dll<)V^yuA{o)z-Wai zySC(NPKm4>76PHKjlm$($!b!bvlTBUrn7nY%yyj8wgD~`IMHa;D_@~DbX$U#?%_5r zP`enV>^3gG%93d1L-R3AUW@8{7eeQsZIr4P7_;%a3ruCcX$A))a}zjs;#C;~hVfd< z8wSoo88}m|IrnXBU?Y?RYh~M##V`SX$YhqOP8HU`nZx5%$WppL{|U~^35(gvV&OSX z-~WnT-IC*l3NT4DpUuLrvc$nt={nT9Bu<~Av@Ls0>hEjNHuo($Yvt-KoJ`xD5lj+DD*TMTgEsQ>)@SEPfmz#}9+z?I| z?hRGILFHHGv4wSexFW_3osTtI(AdEFj45mg5{WAON*@nSk1545t@L|~n&Xm89GKy( z-H7?U0D zVen(jv`V$?F$lcyAGI{V1c=>HtzAbsaA*0M0H3i0eYqdA(ZiJ-AS87SPBLIGpxoy+KSo(V)l9;D^YPL2urR9<#mrcHPIU zy2_-R*S;J3X;1wzqZMII$P}b0W{353P zfa5BmjU{haK?|R*0!Mtq17QQu4t1zM$nN;TvM

mIB%BQn2KokBvJIEj`c0=Z}VD4psb5k1t2GvEOP(np57mK0de2u?7aHXlUv zLOlUX(w*@FT_^*=X%+vLRkQ6}X`!v%yEHjN*8I-KhGShFvi_eq0D$Wahzn(of3HR; zr6{dhLpeX&&e@jT!IeUG30#D(u-v-af#HaELIlAQ+FP6nJ+sORz&mKH1kB0znJ6Y0;9pG;}Sq7%| zQdF;GQBowt>jYvUbYw}l`!$6`cwRGRH<+N5u29d)>@bN7+7;?)`)59VsF|gDr@Pup za5ZU4&?`VUg3)fuxNL2sLiP zY-$voS5a0ww~fC-8lvVg|1iZ2`ltxroob*Fl%86)wQ7xFQO19M>ir%=yz$(MdVMb+VZSaESMr$QKgBO)|5@JAmvL- zU3F3UDx$hRd1+Q%zWbVq5Y|^;$NiSI#p%ZDF#~;oT9Aiq#B~+;JLVLinB_Fd5mt?eZ+<^tAr-`j)T-n0o0572syE=Ix}mYjDfQWYz0I0;aNanDV0OzT60YF6Yz<{P`*` zh!tIg!;aE5I6mA3Ym7T<%~S5gYVBo^gcn%p8<`2j<8~@uKAo%w05~w@CixxmR0(l* zYho-HOmSd~K>}*#liXtiNUKy-$Rk-`?gYg6Z$aA}L+E1(^Y_9f9#@xRlM31QdTQKx zlowYsEaubMw2NE-EX~N06cC^9QlW55T;erV>hqGxi!_YBc7L%2|AafGEe`2Bru{_U zISFsx-1?e$B7y~b{ALWn9m^lMx}mJ;vBkIHe6Vb)(GO5Ah8 z{ny@)!m6;PiY#N+V_>53t`NU9!^F~AsO%N(i%^~A<52>lkoLXBALKx*osYxXs=czD z^<)D1ZsVfoD6^p4QHQnFUmA3Tr~Q>=9)YoGZzPopjgXDr9+^f zJ!TQhq8aF?0MVxht6?w_+)?=hc5ikz>7DtNdb5<@YDF9*+luon@R}d!VL~^J6}q z#KyKZi3fuayyuMJ=Mf<^9>{Q1pj>TSa37BE@_W~=^-#|ofEqc7A%ncrQ}EZHJyj95 zpVVVxdCnful=^+{sP?Bi4e%*Nzdxu(#UJZ@OLzF7=hQ?)#p^yx*KtaxzGh8;=!9yuN8$%OKQu3%ihOs7JU!gVq;!1NJ3N<57n8CM zt^K3)DZC!6$_MF;k?Fq&2p)prkxF39LRPvd%yKUqIEQ?~S1jgZmh&<4&)11jUlf>4 zsu&2SvNA7n@LJH$7bUpsKn%5cmcq_5&r)>xM`k(X&tA)*LQur>F<8tUA}21uDqdb- z9>DJU!z-I9#Cze6FCkAf7^l{J8Qe*>VB3)0@=dUiRKCN%2kOzJj9K%5eWItpCjc?@=KH{{^aK}%- z#M5Ddwca1+(QNXi9_!IQX|ibX2^MYF;InGBZLSsi);7$8IYrR1Igg=!Sb<;6bld7Q| z@))^nVA5V5^rS}>^X4%U!|EgxLy<`b6NCyTAHg1RAh+?cFDwxV!hst&i>D;WRH2i> zaRGh?xgCVnX-Ue_#iY(IKa7ENjy=Ksw`Lgcw#v5^pe3Lt&Du|8w)_d3aZ#Gs!JnEH zGqbjE7^T*xW13tinp|%Uxn3G_y{UN)J~}IipuOXIKroDit>HHf3<|dFwnMFV$JT1d zJN|WJq(ovNHSONMxw|N!_6-kq!+m&ZMxZvc+JQ6?Kjdg-o_M5fd9m~9+U8;h(4Cka zgtmy*!>RY%By%^sx#*a9wFlhkZ&6{Z>1;GQytznC{+?C{z}O^$!e~lwQ9H=51>5h~ z*QV#qlc%K~;Csw1ss0kUMZnPah?4nuRC=A#!Qp`LZ54W}^f}XU@ty` zCrQNaVb6K&1f2txjGi8_2$+Gg6-V^syK0cDQq0}MUJhspV7Ki9tSotJKAx-*!Dk)b4)iAQW*AsnRaZdW zfyCNPk+1a*2)MH~&YE}a2v^H^QdIAX0pq#fZYx>eyA_TNVdlOxR80qKl=}BJdHX6P|ZmpLASEOvyfJl z%&cJ^vMXs!7A?SmndjlNCBx$p5;Ivef^uNpw=)}vP}V0-)k6|J5CQX=HWXzM(6dSI{Gm*bP7A z0-4b&bYmkr`6(UXfVn+etW+6>hnUp#E-wT~dYsxKYGfEA1*}3J*DiBTghti;F8EcQ z-uPw6dU$p~xGj`h?DJGEGt6D>Fj9q^OcpJsBMe!8;gwpCL{WQujx)0kKZ=;jdgr5- zUp7wALz=gVud-7_1o~D{-@elYW~Ym~`v&gp9dOIorN@|IK=tq9tE4*}O`gm0_<9T) zfTa_Eb3VGq7lDgYGQ$HbOv?+Uo9Q?$2ZYDtl_OghTDDH|?Q)fED_6QM{*ZJX7Yj$W zjt(B%U~MCGTY`e-vjuVQ%ILA4zE65;&(nR;V?F0C>9L-@gL=#e^R%~GQoUl=L9A!Q zXh*%jj{jHBa?Rt$&GnbR0bV&?RK2S)R8?(6V`eOu0CiipX1H7was&Bmd+cySKR}X? z0Ha%X1mYza8F)IM0emr870aJwwF-JR$25QzHy%1CoN6>XC$N2^F&9g}NcZGc{5FLW!;=1E>TfOi@Wm5u=Q4OW)BkR!Oea zPxLJv(f5rjpgxc4E-~3XMe_tqO_g=Lfpla=Xnf{U-V$HOA;N$74tNx#UD%W`Vpm0i z0rWGCYt>30ewSy}OEo^ax1;l}%e@F0Xo4`0_{z;Au1i%G@l`vEIMjfQ;pUl5AD(LW z1oMoNhXXk7dtv%)lZSij;w_lB6c}`PJnC1eG&JcP>X34`=Gn_sS|B~C2vn6Xmqh2B z2@qOj(zSG!;o4D+rGLx{c@ibP(?I#S`NI&!NHRhj1^>+(UFaHhP6A{A`(fg27U+#t z)chZSy<0-qTN5KbZ^6SC>^~B*AXN4nL+b%>R6*%G&|IUN6WBxeh$aOfO3yRrCzB)G z1*L(BNcrO!Q?SP-!bCeMp_8c+1vbN+KKAzlM?Gj++41yI zcAQ>0Y4Fn27npEELBK-lf8%ppi%$6uIal@S^Q>5(ZmIfjD;`G0=c^u0y5FdMw$Dbl z7>fa@`Zm7tvm7mMbhIDLMbLf4HN7t^(C&lB`cJ^%+6Zi%Se-By9rO)9wR=f1XA7Q=_UdnigGf%cAeaZ^ za5(zw#X?eYH&B|JENXxG+xSvt0orDIW^B?4B64ZKr<`@S;iw3s@np$! z^tvfLivonx0fSul7MOlNkUZy!6D9|Wc+kCjYV)zDQonOm@zSc|bHg`38m-smEL2ZA zor1P(P1^L%B|Ck&YNg%7G)3#B+a%>vD2W&hh)Q@X+X(M}B#uIx@gMeA8pY7`@hCxC zZZGwW1ui_M z3DO=Toq8$KMU|hTYEpWn%-(Zxryj}I_**?vc3O{=xAaJ^#wPbPHdez_I{Kd6)Ax8o zd`JzIX(dip*ILW|KdQ=MnzbzSCIszioPMJm(DBT`k1{$WvfQNc9+kzuW4dx^M^$VZ z7r4)HjNhm=bzk*1p=D4PmO(A@gFT-Mb3UcVhcEn-sno;c&rl7UPj5Zm_;dJKC&=Pq zWP0Jk2!T0Gx&HPBqU}9w@TiPzuS6uL)0nB&XrB-OQGP_P&E`k` zs4hx0bWs*}=O)bwE9d5Jo2K97nEIQjhm#w~+?}HH9yEHY7+CRcjTB^*{d8yPQ;b&Z z@@+={l5;W1kAZs%a-e2(Jo+q{%e*@nKc#-_~SP6oI1X{H&$s2J_Q z345Apb}%YNd$s^3CT06*MHC<^==NlwW{K#+PmP*o6`HA+Cs>f2EszDV=X$HpbrC0i zh|u=WO4yA{&ylw^aCdZo7NP@?_((wl`L3he2d~73sis5KmVcPE{Qnra@afSCpBSG& zix@$^5y!pnQ*`l}(#6M07mv{~2F%o|N+;*(=!3HbDbH)Mhtr^^L+Smr ze$eaC|5p}^)nm5;8YUJe0N7Wdj<#(8u$OEB0S(HWv22?&HpZNB*DzF2 zsoT#pXP}U|d)#`l=VG!~ZgG3}_T10g+}9qg#kW%t9cs1#!-SkI=isHf0<%MB_|JCE z_F%%v|zLSjz*=?s`La;qs!4}(bS)at{UocE6`1y7VV}&?Dkjc^B z^%)W!frXWeRv`XZU?Jv_tZEBxZ24ko%_{PQS%vbwv(oYQ3F>zp< z99<8J{Qe9u;J+%0ya;+ftYmq%7S$?Gbe3+p-p~L<5}jd=*|TaDS7-4V=%Mf$gPndB zC-DX{fXni1Q{*3HB9c)rtckh1%YjR&#3_`>UQ{Wc-+4)ZpkggR25Pg~E zLreQ0w}W93b))5IB_C~OB?oRZx#PDCxe6QkUK|X6gplSvz08Ogvfl`RtAd*naWG+( z^xpuJB<}*J2{m&=2y@jx2Bnoh@~9f6Ia|pn8?7XG9@!^j07F2$zbLk-{Z26G&TKbk zauO+3;5*!6zCDMa<3Lb?Xf$)%P!3pwAf;2mYJfV_%2l*?WzAzq!wcO?pH!MfHFhWVmE#D8z(H^WK?!{96UR30PzRB-{j6Dqp=2y&~hHf%} zo6glxH-Cmck+MVu#_J5U?~sOF1In2VZ3ZAQJ>Vh8j>j)SUU2P(;}COF%1rIH(GGGd zveJUs9hCg9{KT{{7UjlO&L+3rDHvjwW6D?u#P~zr1dN7M2l{D@uf;}cvD(hu+Ifna z_T$?k-;}}ZgmNG8*bk(DNo)QCgbp8e5e#e}iP63eC$D9Y;*|9JS!0ZqKSmAR6&ppe z9U`QKvEzI1tQZW0lvgJ6Ou_d#xQ7!E{3$uWPRJ^Nh~c5d$*bE|iHdo&`P(&Z$N$8y?OlgRAB41GII`!7$NHkK}Q<*UeuG>FZ3s6cjM<*t?dsqgQZ|p0ZnDU5B~n^G(5-iX|lq?UUd;RPD3JVDOUnkAb&dkAMw~Miw zy2zjfNCwL1Q!zGh5dfN+#LEDp+8*3^m3|$6i5g}y#T}vRecI&gPtT6p8J|8w$YrUC zc{UFH(Yn27vTdIe6rMgQ-1IRZ1XkD5#!y#b(VQ2ssd!T()TC7QOcu&2_2=hAHRw%5 z%|IX#<^NpsW@eqqSD!k)>GjJm>1EjX-s@q__MiOnzV&ilE1LQ)=QEYc0h2T^mCk|b z>{#R53w_M^ArhSks}(ARFmALtUeGzWsy8wJDfVMZz)2O+_fOl0%l?**t7U zYh@gul2~xqDC16KJ*y9>MWj4Ai}w_L6czlct~rG1s{TR^rBU$l51RoJ7_YdEVpiCER~c#cbrCj_GD zLhXobOoIZA69N3k4`eDBvrQT=L=uhlV8(=-2l+H&@>?1VSgb}k;91=s$5*)@#*O1* zhYv6E-J5tvHvN*V=;zm_<3eXfQj1FnG{#dqzRo9u0bKjMf&{BH6=2hR2OZ373=-V2 zl*?H`sD*QI+k%Xw&JM@4MOqWpUO&$nF6og7MTdFd{0L3(A zlnLe>JvdCEqBS9K7tgT-grQXZZABnE$r7`xJkOFJ@=av&k3pg%_~!F0c|qw^GW{qG z^#0aKov zPM5xGX@r0dWJsmrnoB%1>v;DzP7(l&0dnvWTy((I1r9S9c4pap$QA7U#Ab+>>fjuY z1oJvpCd8|HBCxU(){4IY@WY;>Se=C^rsDx_Gx!!&z7#}37<_)9K3|hbfjZmo|2q$I z<`xCUJFsw7ErPs3@n{ZT!%G#@SE@MyX~!FMB+V;y{o13j;svS#?!nCy|5{lezI$Fk z054DdVIRtP4R|DZwE_&>I--JwDsc0PeV_ZTUd}q%v^#-=7H;QzCg(%kwqvV%pUL@v zm#nO-(SE>XpbmO9+TkxnAY`DY1pd@xwVnDYZvyjnb<1&5EBOJ_ER8XXl1{^9vM`Mu zS8A7c2WNA4KoA)ZxJMwu7{ysoO=tc>&ZC*XOzr`Fk+&H##Vy2?SP2B^jthmY5FgUJ zR1if2FA?qMrRe6BBj`ng*Dq~_n{Xnilh{=PZ_^0Yxf zS%BdwVW}bVnBNSzkHXvRQ1 zt_f8o9Z~;TjuDPbHO_OUpTMz1%zK>l+UADEKCdoTEO+{htI_Cke7egq%kTm+eg0ZA z(#o$NAFD3MbWeGGwmpu$9)qeE$6eQAwBzvVp694l_%Y{)I7wdQJAEVG<~xD8*y%4m zn*-~td&-5gr_Zl|saAYAw|^dwbh3pO7lc`JAlNr)ycb2u&0oi((Prv9eRlX5jTwO{ zhXrHiiKm7tKhozE}M5&VmOLi63Y>{Voa=9&x z-?cLX(){U;UYbAcu%(uOm`Ovf&YugXVa%fc1nshk>xuXIw$jJb3*8VPS|Rf~4qegT2B@bAAV*&dYZOQ51zp zwhN&%&a)q5%Q8j>2ljHGN?G0c43u}`gIth#6rCfjS@=r1 zgvj-F{SMt28iI`QI9qdtfD9?^CCCo<>Kv$9c3vvUQgxT+c@c=qGK^$c*Rp(GRcLW_ zMmVlbfaslE!h>2_@qe=}njQ1z=37N=rF!E33VKhIp2AvdeaMnI;|;~nuWIFP@^#L8 zPjKCTD|_tc9P)y07b|jq?5*={DU$p?>oF{bwNRz-rz(Z03@Y4idZgn7r+4t?rDFWs zJc0JSrd4^XaaF$Ev|CR_Y%1s5%9JBUiz%(y?+6pBa|?hUDg19a@_**dYpg`5jFNQ2 z&#S7Cx7$ht8ihYZ7$*M_0rit(=91|4Z(OI)C?HSj5?fxU_$bx~NU7k$*Jy%+L9Z z^0v=`Y@nyj0ZdPOP|3Z>2(4Pj_JH${B<)QkSQdj5TvV}LWTvE?lDi1o+p=t$VVRpZ zSoNZ%;e> ztqS<)fAT=WN{HlJFp^>BYgp!Ud_WUy9!&sU5;+Lz^xO!+Rf0qF;k3fG= zo42TTFcJUA(PkIcj^XZKc~CM4f`si%adpK*?2UKzKF;Cj&*12&f0#WxP}evlWJ5C9 z<}|IoklrJ&S-7n=VZ1V^kXWoype8eYZRx9W-eFBIIUYMZS|t zSD}A!NGG20LyY`xR23`{_?Lhz@sup8s3AA=4DQBNF)3$a&Q%m)c#5}oxv|sVEy-<- zoFN;+z3x$JdX$(-D>g;X{52>Z)F1)jj!i^{UlTVb}KRdr_J!*L$H=aMS(Hy2uUFCUN$&HRaw5cS) z1!Heg_&UyR6wyAnRLfMYS8+*!6=v05s@VQr*zfDV_ZV$J&9%X{on8`+IUdht=s*dW zQ+0Sq#}DMB--mxy#6%EI@z+h2BRT_}dp8TovUPg2;8)4TdjK=pz?NZ7Mt2F4><{qt z8_275JR*k!ej@Amx4cjYddYNMfFck5xJ;t(f?RM@9?$aO6&Q-it1^G4uiLX*;GS3D zZE%@|Y-Q9|cLh4zlHXkpUOMP!!=#y;{Mi)=*BJC31nIB{FM}Ln49J%n7`7cXzhFdm z$5AmX0eimUVi4HJ;qBWGaHy^*CG%20D`v9hP{oxR7cst&R&ElqczRK1m0I5VRpH zcdRME%yl>9413?$><$7TtRp5mdTRM8ns>znUjY!hNkF13vBRr52rKp#ifv7VB`^pvkkjv&%1qi|MTs?qOEU_&S@!173zwuaL6~;?NQ= z#~L|3;qH5Dn@EAi|{)5CK1j+*m=% z!PuZwqOjps!z(@s%E+~tV&B_?5 zGX4T=Ng&{aQ~F=uTjm^P7jguVYGiI1luFEWd>sqVKk*;H(GcEWBp5}y;jf-M+_yyo zA&Fjtp&CDb{WcVOFaJ>Zxzc`-mgR+wq>kn}p1pHhfR2@z>g}cgZ6qrlx4)w4&jVJ9 z3|*}dHyVu;xw2XmO8o{g&u;FYm5%#c)I7!g0qN|PY-17z-0^&vu{AG-2rg7Lyccmj zxBOo+C|L}Q2xO&lGDW)*oeU{{3B|@GUjS>@itjDM!QD_$-20OEC=V~W(FZGKs2;4) zP<{Cnszx6Q@|zDQ3G|YT<|;qdr}SidvM0m!K=owX>Is^rRwhjfRCRi?q#4P{4rj=z zoDT0~bSHICRVAxb{2Xl={_#t+1gJqW9VQl5XQS;VUs=UMLr$qQo}>noOdu{Pp&yvN zN@;1m=tdW2a#8I_&%takxyA@o&Ey;J4doc(7NG-)TR@H^ZVAckZi&)_yG1waxBvhw z<1nOcZ)Axx7C5S{=gezjtqrbTsiGu5G=`#zU$jT0o_y0Bm@5Ci^#yc@_T~g2J#=;& zzl$*m*$sXIL~*B7 zgaqLaTJ11QEC{7GV{d7X+R^FAAuq^mGW0sbR==~RRp7$SZYfncY=Siz9}Bly^yZlQz<Oa5X@}Q&U|sECwjs+I8nW=s0A! z5SpYJQ{?2Es6pc~s}J5BEt(CF)HTw+0glHpejFLvM(!D;C$)pp)`7080;-(1tk)Ic zNvRZh9xFAiMmvSxSB>`cR|w`+3qobSi=;j9zG)p<8lX`2F3{g~uLlq0)ot5N_2WBZ z9X^#}s`q|W;D?8w8~F|0$7}|V<`zfK5$g^v_F>7EMZ6GE#&9Xj+0lSGpsp)pK$L)+ zjzEw6el)m-s>v{j1`{HiK3I=1B{Fm`>qqb3&%4BFDDMDecP+9K;Yif?%C5rrt`bFO zb?2t<+>M4?8%W}I<;Xcq#I+41dSpo*n$W!!^uD9Me`%iTo+JWXVKB{0^AUExU94E6 zzZ2j*%YZ(g+J+j_gTDS^E7L?BY!e&V(%sbwM;o(7nyE6VFxazylQueX4t^TCLJFyaFH=D!8+MV%x78zx8Ra zof%a+cY_{k60H(vI_WwGn#xji4!2@W80kkC)x#a3h)I4f!#0y#HTh%F$r?+aGZ#bs zUJQAOe#lidZwTI_+M9tE-F2QCvfD{lPEc&GmT93ueh%G}X=Ol<3On+nCpy~tFx`&0 z=+kT~q58t9^G4Vf=-NVImvq-DBaZ7X!rDF4-P3imh|~1zJbzyr@qsS#EU)C<{w+a3 z2Nmm(9~z$l1CPIsF2yw0wflqZgWVrY~b-jrXCe+oDqx1e+GyK z7#Lt*vspGm{7)uXMK@7Mv+=3pI$gQ3TTa~#CuXX4P0(A8zUpvASEiM*=$m1aVZ#Ecmw!g66mfe+w^THoRicFRyBT zS*Y@%SDu)1KW4LJ=93vqL#=M{mny9vMrM`Xvb4YdV$k(UrFzEE3PW?NMMVpvtOjrM*CI1X_TmF__{sbriBcT z%K=$sfaXwfR55_mD6o&bp-m___@cKr4NE!N%g@n)f`FckR@cB~H*IB2ot9fw0J zXsjGTW7t`}by@(s7p}YoAF~8<$V}5|u;Ar|y=>%#uxqj4^1|FY2`?{%X0#PNJD{*k z6TR{gprldRLN8uqb8UnFhAF>%%FKJ0PdhkoL#%_vFdxL>h20pJ&L$b=kQ=&#C%5k> z!_@=tuQ0bX9y5(+O9Q@qiu{=VF>!}%xHUahX5^T9NH+l)@57b^AqR1nyig9}x^AAg zgSU^hcDXZbC~m7on?qvyB#pMQdg{UkKG@+I@BE zN9N}AkC{5`a1aUYhEBFm%||w!=VCze@KL=n>VOJ zgl_6}h?#y!{&7{Xbn+~{f_|IiM1kb@1=tkA4)syhp`NCmNhXbe(EhkDE7%CDj)puv z^P&PPP0Qd3K~0LILVwWNT=Tm+4)Q(5OogF#9AXQm94XixTeDlXV|zYkHyT@;k0

F)T}afxATe#^(;_nCyp;|ur?`#^s|_rOxR;ECR5tLw#NFj$2t~or9W~#J|3%Q7NUF#O4z8$L(u0To`SRtq5Boe5S|*vl&_xz0>iI{m4yImDmn+% zh0DsB@D9a(`+Cgj8#iq%6Kott)E(6gcP{i71I-rNkA|0B-|XoB^lAt&(SEK0kG8j$ zNtMD2%3VIJ{ojg&tkD1t#!S($ZC{W3eQ`aWiU`5)#k27g#5zZ_*SW45v%h-A0W$wu zG%&LzBC;8it8q{OqpkH;cw4mn5Ez)aEp>Fg8??p7y#Kri{G5PJE1;PQYsclgQ`4ig zJmQoPrYy{Wfo!BPxD?7pIml&Do}G~SKrN!J7)lO+BcDS+si%Ay#9+h2;)W_Bw&2TM zO6=l7KFcr4X?`iA;G^B`zx0Wo8GeqKcn8}tp# zr@74j?%EGqdkEc28aaSH3Fkmc1Loizl79@yLM6h&E64t{OLw3p6?OY)-m!O34O!#C9eZwIc`(fT3>vf? zqthm`((gEdy*^;97+_9I&ZZt@2YuZcDX-hHHA6#iLVfWa(SJ*W2{ewI9 zMq}{U_KXv$(;$fnued^+dxLGzSB7`&1NQFT8ob=@?Z_V$SOv!!lG>(e8kmt@J{^qy z8k%=MiXcAWiW#FTrr>ZjPfRz7%#d$tr*ozV!`jZVfyUF*`+ktrrsMmEJC5V5j3?)R zyVoCZ@$UJDVdAcXMo^-!y~V(aE^ZcLaelD;&=s>$6pPEZAvyf)_;|9rUQBia{zHQV zIj3z00!8MXME ze!V~{^QCTK-72QGCVT!;nVNUtU~B*az+ipD@%Zl%O>6pr-}6`e4Zn%r^OyV`f6i~% zR-v+1yQ}B}tM*sXdsgk9M)$1RKaF0p-Bt98?XRMDZ1*&J!}d?3=L&}+R;f@|iXK9j zqJ{H=`WGe4j5Jy@GtOwk{NY4*tZRJHx^7&;p3mZPOXWWU z;ICR$+#v0_OWKv%tYC{GFU#lnBQ-j-6(i*(IFe^X^CcM)*p?@Q6#!^jvaYh95lYz0}kkSc9J-DIsM5gdSs(rLc>Dn^q8E=rfwo zRJ&~EUs{UlmyTDHaPpp0>;e|D8(xieb(?DcPc_(0w_&^;RD0`Ezw!k2D;4zvA~*TK zKb7_kw)JDv`WVqJ!yDcv*~8E8_01>u+U;}q^xLVgRk!>7z$z4r>2uN*8$BWbRXpbw zK6IjqekVtZ6n)Ld?AE$(uCH$=gTXpH?07y~&)J^u=rm3A$g_v|taTVp?z^?n>u{jV z(TbG6d{`T?25#b|t6q2qK|1?zy0@V@nk>D$e2V%jx`q;D+C;B-}8W@B95=%h#Oq+u_x;%dJO;yXioOmIXPhrSlRY8+L912VB!T3$A!Rgl};wB-6dMPZ!>`a~Oo zp`Kw}ohpUMx>NMMY7JGWp&lGgNNWD4v~ZDiV=Cek8jGA)gA8NOUG;=kCF?=kklb<_ zxaPq@#th|<)08)87X_@PW)dN~w77g4Mo^{_NI(%Bde7>ZH=5NGd9vN1ZI_UkS5}Y= zLni>)9RgnE*`NQ^&>I1^n*aHEaos(`$UZpOvz4+PV0C-^IHnUq-lfYpfg8ogZ}Acr zH|!~T-?cWv@#s$Jf!xq-d;|)XI>tehA;*K8UENg6UAr0)P62(hc- z7r;veI&%}?S&OpD3$3*MMhmm9ioVm71p>_Dj$`d0W=Cv-0BoBMPyk*n>f3?ZQ4X$W zd~6w3@etcq+L(;WisYJD)1-qo@WJsIWni__sz5&k!9BWo$JKb)u}$^aZOsy9jX~%=)WHdKPmN1(03G7*uZ-wwz`2 z3E@nCm%Y@nI{khg93ZLG?uzXp?B}Xx^!q9OehN@yOxXB(^G2m!smwc-dZ~i94w~Vx ziWfRfm7|z(6dP4T`O?;NRGsP>z`(`Bj^*~CqpMoQ;J`Z$Yf7^$$y2S=o@xMZ{jgd% zwg{lpOsj?QXvRJz&3XAyQ{ymnlvxFDDOX$zZg)ID3Oc9CI;^ue9L9j!;FOaSR2~lU z%co#U!0M~h;^^VHhUgaFY01=S5#CN0dZ(wLJrsJE zufPT?><$-phvSldlAkkWV)iMaPX}E>)4n7pWxxMbi4lJW%S^Rn{zKk&DdOo@$V zBjaqy?%Buy+CnOK*%%}yX@M;uFBx*BD)(FF2-M)6oD9}sgfCb5W}^M%5SAd-ummd$OR%u81WC=mREpUGl6HnLw?Jf} zc{au=R#Zr;ZQ0q3Bd7dO1UW&|dGd;u0e!J0Wvh8j>t+qr&K0fwshX?^Go|XTv;~@o z*%GxQY=JoxVXd+YJnGpFu#Uv~eFRIS1l>M)StH^wCY; z(jKPi8|VD1!Y04QvMFRbkeKNp0(6+qof0(xbp2@lP1eMA0 zSV4+gnB{W>*;d&iVkedJDUI19ep9FKE+-`S7sx@6q@;#0&M)PXqH}zO@re$MLx&z{ z7@CJeK;4+n@Uqf?B;PbpNF0Do0v%C-sf&CgbgY|B+^(bCByyKZQM)Jvgsg$b3b^%w zQgXj>U1(H2yT@huR{#Co9R|+?=KF3Qc>6aj(GsvXJ!CJ{Frggk_Tbt<@3qNyfCh-( zY6?D7wP4csoT)1ghl3bbGSL!0j(^Y_^#+;3=B-vmet!l~x?h1X81!g9lU$T%Szev3 z;t%3XCec}MV3B6CGnt(Mdk(xLuh?ru!!_Z?dSd(id;23G7#Q;#P=sPQWUgD1={Eo@ zZnLiGamFTTY^5`{iG;3+e&1lQ$~okh#p3&NR?hqVKt02s@VwD!^>|l8dNns6TMOdr zA0p`3E^H>J_jq0c8G`eh`XN97)M#q+aB`1lj36D%1Hw}4_x}xke2r47RxS#;sq&)4 z>80PdLe(}8-5hWVX38}|2#aYeT^wC>*Q|ox2(k7-f{_| z*nO+uxq1sg9!yObEhGpKLCi9ivLbYGslIbCym~U}NzA!mq30x`(&NtjzKM&fgOwF* zM2Wc2-xR@*G3%+Uuw{>#;A@pN)>H!=J6+b(UepxwsH@P#v7Rc{wa8ebD}7ZkLhCZm zZ{X-A-{T%G06BNo?5f+2-@7@01_z_j$nX;a)~csZM2}S(!ndQAJvmq}PLh}QqYt;r zntjCAzf#@$ly~(I@I@Uw`U&r;*~Qo1;go#JTQqs0c3z`SH%ZD3l9|@fSkM0GVH0Yc z552F4XLb#}NdtZ8MKwOXjp#KT=tFO*&7pwc^qN1soZj+xEU1EhKE0+L4cJwsw@)u@ z$IE7E>D`m7+wrPiU#g+#?`$+035x_STnctPnmJTQZ?7+J5l$eX`p91AB0L^T9WbMM z30S8xnW}#6!~(ORi!k~fi0o&4tJMPL>Cpw=MG_+p-_IhDGZm2B8syXoMkq8OnC{+HlUS=g?2S^4 z=(>ltNIQ#$^d<}PMemD2HTa@;CW!@!&-AVk$=MeJIl%kGaJQJZz~vX{$^Zq&R5IXV&XJ53=yrx~`b z(G<>0we=GB6QRzkTPmcE#$#jBQ60z_&AoB##MpQN8kW63H0On0snTzr9?CW|gJG>H z1%~dXIjtq+Qt*;NXN^3Inc6fk24Kf>K7;VUOv@vLGYf{}BcdLV2X=e#l5#+;%W^k_F0HT=;R?pNCT zry)|)48E%%k<<#%WhmmN?%aCK91esrLIS+B$>^jt;;3tg(g%DjETr=}|< zHdG&F7PDEBi#O7t>7kA)O59;y!Sy%o3fr!%eb8+TLh`-vn+a8go%RBxwUmEb1aPAO z0=-IWl7b3@+z;rZQDL;5Pax)B?P~iJdlW(1h?=D=53Q#_Y=`m08HOH3YY2Lk-hue| zPm+!Fph!=FPate4c5|QzBg*yrDqzSKVQxV@t>2U81JsEboAr8gK=_5@3xq2=zaqq5 z{Uc6O=mI7svg7!zfnyC~pAu{^Zs<_M5fi2mN<#I-+>^ASK=lOaf1MxF{n6X??03Ib z-&J9A`YyS_`ZwezA-RZpH)u$t5>!nnSHEd*--|FSyMvVdv%eoJs;C>ajoCMTFBH*L zp^(QTdAGqIsC=$03cgJ)=ZcittHZM_SJU23J6P$~9Axr+Pn(cUo4-KUf%nATV7JVd zn^~-c8>=7V|?*ZVU1oIwR_dt8%MRP`5U@ZHhbTg=CEwkh%tG7)EAK`ymSxA#C_4``g;(bs5Y#At7SlE;pY zKGNBb;Ioil1hNi<$0PmTtKXVdI{o}d<5cZRn@R4Vz^D&(jrcC~6Hi*ke?t@!(B%o> zyE-&Lk7NP@$+*L6b$h!q%(Ju7}EUw=Y-OXc2ZHZoULZXoULZ*9CNEz%}vr$T!GaVzHL$f z=G>!dzfqVbD`1f`qL`2;*y)AJTcY#EiL$bx`_BebC{|Xt7iRl0p znd+2%tfW8R2`9&Bmb!PCOtlEAFLFebMX!ofrOcBdD^tj?2cYdts?Wr!%}-&|)=6YY zZAQ&fWx@=~Q0L>#(udLSt>Yxgr>%>-0BMujprNOW8)(8#Lc&Cq$Zg;lr)GAfAUt2|U_Hd7s z{_x@c3?Jx(Rw?QpG(Prg<2il2$*gH zQ(n=O`_c5X3Wg?VXs%$UiVo@>7~sB~*NQ-V8?QxT?C_*3;~*Y}hNU??DOYhJ5)cO2 zK@*lJhRn5Z3vnlR0$?6^q3p~)?P0K+ln)Q)OIf9m_ALw#*+?}EnFJ&+WFW(-48lnI zTC0Zq3i(9xa8mFp3u4SIQd@~9C5b1SrE^})QUd~z)vZcr}V0Z38B3H5ogP*WfWvJOr0XhWIT890;br1ONK7%}n zqNw(;olr}xRceJqAfC|4hP6r^YITt1JFA9}OqQ>W9-^$d$b3JytSQlA4qRTse>o50 z;}OmiWNkx<6=;VH^6+>}Q;=$o$GG2r;RrbAM7Zj&caFQ=(TlbBL3aPqL8--j2N?O zJ_T*m5DtC>r9<>#aB>xSjWPdteoPwXr+dMteq*c5sM0So|IWJvt)ug>Wm0A(k4zE`fY zh(>Sd<@D*Z{7!8{6>}mD6Py_KyR5CFaxY@tEl}Bvp^9I|xFbu14WOf!!3{4ER}(;U zm5}AvRVWrLCXKT!Zn93WS_r%KP;4q*Y%mm;ywlDrz-y6$T6wehnC&YtT}+IAOsQ0V zmIpUJ(EBVPjmqa()R>&E5rNFyGNfwpH|pL3G_=S942_19L36gvRLt)lvmzPc7F2q1 zR`Phc1B0AR#m6UTf`0NS>h$FG%ai{egdq732mgKYuz}g#1Mo;#^iej;bp zFDBDe=_JmfaLG3nUxLC=Pm*Y#Y+~GV_V<8Y&y<2wUa4RNK%A!@4~M0UjOJw;%NxfF z95c|gc({uuS1U4iMdNW?t$9*oaAUNo0U@&r3Z8-6ZmIofQu!o3wRFg>AB?3aMAIrX zHa~8J(hYy*qh9KG5BhEuYqWRU8D+<46AV@wSfJW~P!C)Q0Zd9&$AH%F2kzQ(n&rQbeCg-lRV*^TJgJKlxp7aVO9$-m|E^Ee z-Z@c2asn3vq!4%FBhODjlP67WPMk&C;qCX%OGM2Qc^!-VnUe}UJX)X%?FCj*cW3Ck zm_C(2>rCc+ILzmHRL#YC6-oTFV}g_?kH$(`?s&8V*GLQKYz(Wr1Vu)!)O2HP%aPOP zMh!b0ZnD5W(tR>OHfam}NRHEmi@n2K!j6jpSpm|68Wcdk z!ZtSx?{H985;T{j|E&Ko);$m9#}8RQ(Ch_9Z|Yw`?Tx0 zuenn=xejnJ2J!_KD=;QPcqbnz69qzrju0&YfcdPx6tgg_i7|tN%Yox=1J^bOc36zK zMxk%9a`m{95v7Uj!Ce*%(1U0ICVNZ11+mPHydV9Tmwd%bo+q{f!$g>`j%q3aZ}k_0 zVq7u>M%T~H9avu!9qt&s#+CdN_Z++0V*qbgF%B1Q$+lIzCZ@Kd!y!nU=(yIyb^@;# zy_04F%p1_?Cx?Ve$a3BeFk_8CuZ4zO(N`?Lx8|Z&X`Qaax}aPiZkYIMILx)@Q)~QxqG?%fK1EEwua&rUny_U^woVNuR z{4)g?#_74|T6roQNuaT7-FVE2wuw!7a*xdTbCH9$uze--f8*Y6%{yaL>6qkFH0M2j zpOAEFK=%*Dl7sWUvGqmMxVFi(4Vlq)|$PBcrqe; z*#0)4gB!8j8sNFT668b$wIZCT)c0!blL4vUU;qm+Gdi7+sAwI7YCVE(1>p#)ppbV6 z>M{3CYoQxbpi9pn9#V%Fo*TXHNgP%-)HF^&wV z{iI#WaCmxpT*?J(giY5*@teGR<#todn6);$W`#Tnm)--Ku>hx#A9Dd$%a>N{BqN+! zQTzUZ*J-gtOfg_~E1DFWypHn5S3(VLd`Bh;q%_K-e1>v;bh&Acwb^1^9Wj{1*@3`o zzKP+iPhjTjOpma;oL$*Ta&!~dlZDhvz|Bh?NIV?SL1-A*srI&{1A>%X1QTnRp0nvJ zzvQzVEYerOX(k|sb&wN7BDEOAD$Of%(W|xJCe*DH13mop^>m?TAgr%17HSs4`udAS zW7mPAAJRbg6J%ZH9nk#|dj4Z!1eQiX)Da-iHr&6tWukry^Ix(F*o?{omuxa?3#s)+ zM+r3UbI`ij`zr1Zea%B_IdfC8UKUPlTus}MVL>YrgULWN=iujb_^6KfrFwZ}p^<27?U)3j8hw|0*AJWhI! zpMXZ7J3Wo7;OXGg@ePJDA$Fss}3 z?D{NGaR|{Rn`pxIY0?Kx9w&UhE0v@W^1=(a^$FigsCK+$01;gf_c@dzPtF6;2x z&31p-PduoTj$fEBbV0u>X&0vg(pF5yOI4k!F7sI!R@MxPUssD+ zJsh5zD>S&Q$cv$|lo8F-_$wXv>YkpTqNATTTAy*G>CB%qzZUrZiLN^I(Ly85_!XPX zMk7rPoo-4ypHGuKJ#Ajm_D!_jQlW@it%;hvp|ofkt=Kx&?C@t2I5|YXmIe}POCeu4 zlupqG35CT0>hAZEJKY38w!AAuUcb%}+{+rTyfg@BmThQXoLne?>Y2QSyei5!#gexI zIiBR~RWSytkA57=>PQ=RIJPnQTr0h>GRm~dU5-8sLwxAL~%KO-(AxzF&_Z%_aGXiV#xIx7T%*5x=`5V}wgg#v}LRtZWn&_Bom3@lXMobJ_06$#DFYYq+^ z+gy$nT@5ScXh=wtilx#CyKHZ3Oirhyfsy!hM&-NS)sVCfX-!jLsp1y4!{lzzW zD{7QF27BtN9z4>B{pc@{(uLC7@*mR&w;f)I?3cR|Z*@5d~u{=`p6p*0IKU;_TC( z)zk$b75@3l*AMZX#s%^$Or(KaUBKY|_``QHOXGgQ-bj3Yta$0mfsR>rK<*z*nl2Ny zY?~%cyVjNn#z?jFV$kD91w*4-cD3iAlEm^_kfpQ*$Vyy`1*;l`Hz3t#I?((t2+1se z|5GEr`J%*{pvvC+R4Gvd0fCVI8BPDk?vKjZ4BAAW3~q1y8XTm&cCP=xaH#B%G8_h6 zZNFm$jRh;)Q0-#Yu|JE$lKPE(h8wgchW2>^7mET@V%4mLtcfC6`5G z(#&FJu^wG}xymcl-Msp4H-YfY!tG8&0kiL!s>`(!BJ(03Q5=xQ-`z$$>?~DpY@7{$ zWPG_JJ@(BJP2GJf;D6J~aSO+$Ehg_faXAJ-z?KFYtdbVAM5?X<)-R|T73fEINa6qn^J3=6UcbL+y&Ut_f-TW!aF!%nk!&|O#I zz-utpZfVpnNmXc9f^k)!p_;HGxv8>TzbiQU;{1yjWMcd zdb--$A>LtuzC4y*9!0xpF@Qct2v;~^-pDnFEUk36FPNCuQI1W_Vqfjm+0HSo@NxZ~k=0wR-5S7!6p{q%2Us6F!G81P1wl?f9 zU_)2rxH{-{O{KNJHl-|wLzUr0CX)M32F=@~NGS@qZYhl4R630LM5Ca`mA91_mR*Ta@(Wma6u+G2o;3HV; zRW&RoWG(A{BMHa<>e2U8+M`tcS$+rJdUPA*bQi@G&{fMH;-%PBQ9&`Dkb1IcN?F4= zRlyH*bSC-q_d?`2+z>c1gIEA)a3Jy^Jum2YBB(|}0@BnTq<=k*%OpUiV3eL;&?;O) zY_-u6LUol_6MNh_6_&O_TfPiaEXlDJ_#Y^cXVc_VaY2hSw^sv15QkY#h^-Us{}O=} z;-Axr8*`C=v3(PAS9$|>T!}46*r@+0wy5;3JUwAhTl~CwQ2pRepJZVkdTRWFaYXVESCdk zF}-+dF|EPS`%PQ|WL8eMQA~GH;VrGwTUxN7kS$DEeqPS{)&{bRv>K&UgejrfRSq$i z^7G7jpTRrKb2=d;vM+Kf!j+)aXeH!FxnqN$=zQ5L*G=&oAOzO~?D~5IgroA|>wGy- zVf%DCK0x}ysqKB%Bkj#BaEb!OmjeMubO5%durTd9jcIkpaVL20i-8z9S!zPgAS#^d z_)l=voKPnNa7V_}+I&w`0_`=AgzB%eFTT!~gxW8Sei8v#9O-8|foqxmc<1fc`4Znb zH0({sQE|VGL|C6WG1BQSs&tBsj_y?O%v6BEkksPaMg`qrz&NuAGj9>5-f~NTel4vr z6dyZFGps@}N@1gHSaLO)Cy)?AcotZocT9&xTC;qFcG^y0Q_MfAB9KHauO{;){uV5# zL!8r`f!(;6ug}DJAi|17>)9O()}x%9Uno!2mF?GfGMUo#*>WV#6G6_G^a1j&pr%`v zg%9B!-LiZHF=E{r-Pt+3ap&!$ouvDQz0U$pH*`t2qgz5B*>bd_FW7Q)LtnAmaCiPl z-?Q!L=KKYH!#3eZ`iyPDd-{&uh9A%0&<|`ox<7x`rR1?C)xoRqJvqOSd0;ET4qnn% zDB5xoIDJp(jYs6O;01jTJ6@A^6~c(#(D!s3t_0D*J&^Yq-O9Y!k|Km+yrlwy9^JQU zenvm^)qIcj(hngH|GU?^g^C66shco>FW->P7i}oMr23Er^YNDE@SVF>3y<_wUkf{|m%bv6JQdC1fO)+$687UOa<&W$ zDwx@im{QvF2O$jfSebI~Wx3pzd*3Pt0E+%WWw-e|XPfIyzS?Bj3sEKjsTR9iy`YIG zlg)#&BL`DI759koG0&Hn3q2~x-k~2EU`P50$FZ~(!JumanThIc{5B}Tbt7X%7?l6D z6oZmSC9UROL|Eq8LeN2}d0&Cfgd9|VLX%pQ6kG5tumSm<*BMe`IjIA|W z^8%JFWt6hI9i?nT*Ym&$=Eg40Qk4sO$r6A^L>3EFAx^$dF3DC&Q`*&&^SC-bk2)5V zJCm!{Osm5U?mEH`sfa1igfQ$ zG5w8gM&G*xq%C5XG@V|!GvTZwe>M2?-ddFS1xw~@WU6(Xi2N?}5*^wKEY=2`{}Nh` z3PSJLYZ2sloDPS@DPtvFv&|I)Dso3x><1CVGz*tB4VOmLvmOptXoi6C%}{J*!|y^I z!JW2F*7qheYPmORty_6>WUlBR7_9|*cS?;GFwk;b;IQ%R$WslVL==gVHTFe zTsGiiLUZz`p?oVeu?3jd7s6mE5?>&RIAgfAK}sv(3cSQq1u?S6NY%fjD0Z5=}5d zxen~$4F09I{d1<^a^f7Z7#PtBI_guA&?6r({`FYLkmG@wfP$P=)C@j6S=`m>$hI^tECj{-d71Y+8ZRS0Wl6?103kQK40=eObc7hYU*16Svt?d~~NDsr(%C91;@=g+Q`4gv*;k`^5lcI}A2FEG$ zvx;=-(wo+>x}UBiVA>~#QU1<|VLBHdC+3s~i8`)ozFza?{B;FEPB_0G-3H=F&xI1#o>@&mBV3trNyax=}}NAFN2I`MX`?f82(U^ z@jOZ|v*GYGnO9*t%A$0XIVa02J%xyxnaCxWV~f7g=(dgtz@c!hW(TUxs=r> z>~$8zl5t(q4ZQ>V@Q*xNgRWXf*jzPEK#L`t%$Ao7Y-yKd!}9B(41?7?9WA3JA^%k@ z=w@8qi}m3UAa||qYn$lub~Yh#Y1Y&Z;@+M|iAyRRIf zr>D*=|Ij1D;$t~bdSuis24u!CB&9nfasV=S08%{wFiZ)R1GT0r`oJdi)(Ba)An*!` zFi7X+sE%qv{wt_Xple4E`atizrxl35@R|U@+gN_R4JKq^WuwdS zmM+IT0y8+7C6^2|#0iT3W$uJ5=n^M_fc{tH8ylem3JbOz?`Xv)2R;MGsLebOmv{3! zCL(bK9bGd)K!kI9_5k9bFuWyEunU}CVql65t6&7^9m4`ECYqglH~u;6MPo+46-&0j z;>teh9a*tcuJn-%ozN&7)s(Cm@HjFr_CGAK$EFh}NnXYe%!l3APi{a$M}p^?9TD}6+0~C3>oeDuE6(Bs{>fQ4KW4an%zZ>Ipt-Z4 zBWIZ@tiFGL&JA4}H|27J8~dofi|Y-VHMhXciel}j0K5BLCl$AqpMu9h3-(Oyix$L~ zCO;OcOcs`YMozM4d zw@qd+6*K5++gWtFu~am3U&cL1UFt2Ur$t%SZ8J{Od2O|b9WV-X*OLj%!jMib8qn!~ zUQI4~j1!ILy1o{p=>o1;i$<8~{{+Amh9UB5k6ErhdcRiSx)C>y$Ux1jMxg<>yo2@C z?|MN?_B;b56O?4rRPrteBoMo}0b!VVI@l=129k!w*V%#s?~*PkFn$TzDu8j)hU`_e zp(WBVWM-76;ZCyN@og0Z)o2NRLFd5+P-*cuu$yHd`8Bf_$ZQQ*Q8*H+; z8=4o_lSNcCungbJnQ6uWJ($Xx~-lJP2-x$Okp{Wk#cCX;y^zitWx7=Tg1+X-=BXxq9$Yz$zn&G3E zT;}6a>QeJ@Dr(6ASoY-Knmqxo*X2+C-N&Ekn|?I7-PH9T;6{|(-s3;Mph>)b&VLh1 z+yue0Xg|@9be9Gc#3B%2OA~hdEq4I?REJ44Y5KqE^O+Q%3v(U@-KzgE`!XC3;DZb+ zgDl1`e?SQ!ow1G!)9=Ol2}ygg{tOwrY{D0=--~ri+U_tZe?<6g7Q3>AYMzjZd+UA; zUNobeUXai{^HEGM$fbF%>`n+PwLRzsbm$k;BWrb%X|q&l68wqte?FOOhq*o>Yd-!x z)^=BCZKO#)*<%EqHVK<)*HZZ%hr?vX9dinb@CIn}_Jht~@rdxHvl*eZ`l5@ofQNz@ zLVAREGxHBtk+KVyn>zD<;L6GwcjMnK1*nH`lE2#6ObgnE^bY!9LFg%8A zY%Bllq?4eWt$tJ%H=>>%!mxHIr4zKygWKOm0*qtmZCrthK>Du7+IPM1$+J-kK<)t@ zVD14O$lL>fW|xs2Xhu_-(53BCT9o3qBCq3Y9xPdLenCqsj}xHabmVnHhUltBOPa7M zT#_hQvKY&V5kzVfpcb*^K?_b3TOOVX-2g{wSjo>@iB55&5y53!vpRX1_qFHN7Y5=vzQ{tcx{`@&5^kX-b)jT?JfZ z{5t{O{Z_t_ou{$>fu%C}4!)Mg^3Q~N7Eb?Y8P;*MMSt$zrK{FVce4x@2v*l?WJY85 ztBSc`CItmgWoIBV5Yqhy(hoBh#riv#sc*C3G&>wh7!UZPK1jWmCSi54{sAYlomr2W z&LFePVe)I2X-)$+lUu0Oj4h>Ga9{1NbL}c zj`DFm%E!051~V~cUrp?EjI3~d4A#XE!NyEZy8x!POO(W$AFqr}cT3%>cH9Z-Db{K2 zR<_o-;SK)Y!<&L-IcVwNt|fm8TCjXLjA0!Qho{AGh}6^as3rIo9S%PLsZa|_tq=lc zTwztdd2CJtFeszFPgE(tB1?k|I)|VOICbJ&A|u1foXW| zzqWit^d-fr6=R>E7IvU}^aU-88u@mg1^?wg&4MdlS)`vUj_YG-?IG(&Gl(nSFhpWt zdnF|Vwr@SM0y)LA2hhcQk_q+|>t5N28wvK_9RWexBUUL;TDq5{E0;zJz&8I)UBGF< z{*?u>S}0`xTNQyLw!YHF<3|K9e1srcDgI26QR~RUQ!rmfK0%vn>-3zCIE@MM88vN( zXAReTMeHdC^z_SC)`rj3Rk!X9iU#~W^WDe#czK%#onekK^E#V!ar+EzUUGpIwd+Vb z^*q4@+RQDkKc5FYtjPHVR-VsAg!akj7mej+Z6stFL3wW1=lMnCEKMk7cArQUQMipu zmn1-Xha@P*BT~WFy*qnHq2Mpv0pL>(T>7B=Q~TTePf-F%lT+i~obh^pTWr6PJh@<; z-WFT=0Tlyy0Lx}?D*n#&79(CeOg6^EsmJzn)LqHpqhaapZSB-)mO{h|_2Asg1Zf(Y zo6f4h>Gg1^e&N;Z_c|6TY8ZbuHN1(JOGhG=@jIR`zY+CwFObU((tW;sUGoRW@pD;h z?$UfygJ{N7Ar%=qK$S;wtqjY6Bh&~{jqsIUQQ4`w=LqPY6E_cN)6|lrXast%Y_~d4QNZ{6Uf#yo#QVOwJqo30~)S0}9mV8*s`@0I)KH->}-WF9!5?)AwTNv|uC?Q=%eR-nOI z)Y$r;WGBzB4p>EZ9-SH#Ub_CYUQvLFVQge7zwiL=b~!H*78Bme;1hCjE2l`58f({J z0Aujb-Hp#MceaO&dyJWE&fQVG!I|tt zz;uyP5GHlJ6cxDtYA;GybDgPG^WsR7bO>k&FHr?zyee`GAtoh1Hk@hku-?@CgQznu zXESgKXWfv{%TM+BW+mz$ipL7VNuc#;IGvCvNZYF` zv)Nx18Dy_ac6WOl>JM&jx-li6(~ra>5!TsJmXHnFBHyUBYI@o-ZGgGTsjeGLQ8jxg z$3EJxCEi(7G@2t+p zTxJSLV#!8Rx?!W#^R9JPp^K4vXQ2<)On`T2n2#TL3;@g@092>OmWT?37NF(-;gDTt z21IWWuEUG7;wpwKV-m8II&Xu!tI2#4P04~y=muUc!;sMO`fkCbglmElt_>}V$7rb} zcxw|1s-b>UY#kO2p-E#F#Cz94>kPOAr;bg?9^}x6Z245HNfR&sy{T$Fj0*12k4ohc zw^=)Ecpq`{=f=I1#b~Z0XnT6AhL$y40gPk+-ypcHIR+gnLX73JPsOwi)r1!8A0P=a zg~Q4@GDodFe4Q^k7EYYxU?e{-i$?@>!C$|>S|WupA=9UC2xX+~hDq`1tD^j_E`xZy zg@6$%gdw3t$kgw!l74P|-==GHPViBC3tZ<5eV}*05Xp=9>pr)W)Z5wDT9I#J21=OD z@4%9!Y1CtvSFi&WacY-GB#@1$v=Bn>i(KyuP~Oo3B9J7gsVQMQ)Z?tYp154byWINTuwv3y>W!(nYb5GvmTL0P(+ z{?RFtj>-|2Ue|mc39@4y zM*-a|y#`tn`!{k6=df1-#y$0ExboVL{CFC)>qrkY78oz-=m6T-{GzLp<7;Ys-n@IXt zSwq#z5vMEaMeeQ>_BTYXqFdH; z;L+U^hwyB}w)6cq`iF3j(J*z7EP>Idcafp>X}Cig6-^q@<+#OmPEC+?r>oL>B`{>u zz#FO#`gdg?hyn}zq?ZDQ8N$Y?O?tytp^Dkt%YPL#K@dG}e-ub%q!QcR&Q7|4IjB4i zxo|mTy7EX}VSgVE?h}ih=^*qYy9<}$8Y$^L13!jGwi)kcCG1dK?14*~xAO$p!Ta!I zm|oe@9}WX77P1?VTC-ki4Ho&Odc##};tBK!+3+ez64OTk#u!|71+gO)24JXks}k zx^#p;$5>+LVgN9wK8s59H6L2YXaeh@9wR406L-xmTT#{8EMP10rfCv<5j07dkXg#I z&}l+9?Jv5KmWt>x9v!D~8eL)oJuhfN6L4R3HY;;(v zNdq27Xo<>m5O{D&@HaFCF?DZu`$cGSk#SgLwOV8X7Flfk8tw&WT#qDOM%S`J|o)hiIGHy&tQ3scguls`?!Yk$=bIj}V`iRvxTe zSBD^|@Cq6{I^hZOmazkLH@aPr zTN)xYz!?KY0GQuYl%_2kKg>Rte^mD(BVpoa!WKC7)g8z!HJ~>d+%!(93R2THIg?q@1uaek zl-NlHlnr;R;te!p<_FWI7{JnrpbPeGR7Mvkt(bCDw`7r*RYF7EaEQk`*xR&Kqltz( zQTcoaL{$NAsd4~T+82$fIt)f7*@OB32r^j8$ZEzeN#YW>lQdLoileAB$}sONh=AcOqaf9n4t=Jde@Pt%%XSAp!JW9nA?p=KWL6yEOfBR#kN#{H z!(mXudmp3F$9I;)+~~lz4Ml$JlWW*)VHKi!)!NP$C2J6Ea5bU3MeE%k1D^_QdvVHuKm$9^k zk(x`-ed}~8wYYFp>xh~F`bTvzSQW0W9i7e|fe<`IohiUMLHKtFmi7~fWk5o&Ibbnv z!>NEkCtfar@gg)2!6=Z1VcbA0GSFkihXeePy3uwJnSx!9$Kz_z<`%$DU6!z>LLdRk z&ttG8;V}quBq={W915(Ffte%R({{9EZ#NIOyd1y#{{8C@uYdab=JnfGuiw7@@J}2i z8U4FY&QN)!-#E>0~A@L33V0sBH!d7XpIYqIu5%$6$I1 zaLMCcV}=8$0c|;E+(OG>+HnOh(v=RH$k+Nwd7p zI<=Np=6-Lzj6s)sqQS$8)yaFzK#ZZz_p4y=|KwG~Wpg~+i;3e6n2}u<@eGMc9li!rLKhb=nAvL>YsPaM2TIu zq$?6VZ>@u#N^p&;yUWLtMO4*<@}g4NN95adBNM#T-2#b`#hw?-oz7d!yiO7Ym&8@b zmS?GZ>kgKqDLGSL{9fU4sYeOM^juz@>8;(BMpA^QUNtw8l9IY|EfRTBu2snH&gw9@ z9o><$%;%k%>O-@U-PI#6`|_b!hnus+E4z_pWj0k>4*AvqnCu+sHrYQ|Y0?7~ zzU6_sXN6mX(t9GbrK~hC7`iX(hD1Ot>1>6fE;Q~(s1_QEyY*gf41p@*lSChlOQ zJ*Sk<6foclN?U)X?w@)DCSabj{E`J_m=PEl?0KX*8ReJYzco*l`Aw8xv0@aTUkryq z%2Xyow<(wuQ5hmUu&oj5$O>*c&e~$UQwjoZe&NIlYmF>9Q!(C}ocfnDKvb5FTz9#T zsS((rvz#2Q%39spdEj#~VpZe}3Yy@K7`pQ~qK11{+_48zuU1{|RI8Nfd|ri2MAe8n z`g1JS;6}k4at@5hbpJB!i2Phy2<&FFpWDF4-A>04u0sI{{DUDjsX2}}%&@Sg!@>cUb*Y_Kp&Af2#z31X4;`fpw0Y#R7e+@ITo81{TjKHF&prukhLUJL22?@VGSQp?Arm0)Jtclp3M^^zo; z;U(?5Nn1a|@Ap(ee&?5N(m#E_7(<1sZo1uJJul66H9-qSE@}~H8sx$o{Lh*H){Hhi z;ep$cN!#_|X=fpMW$h=&D%l?N<{cic0L-Pws9<+sIJ1@k$L&+@J%Mj( z0o{FW_NFHte3b_8(tukAOm`S^n#S>iZP_E=Yx@S5ZR*AfQal?#CgH6ee&9z!5P68w z0iRuy*&XynUGvx2wOn@y&k5TjLNTwD0myurpF?JlVgXZ^J#yTtDlPeJROt3+nnHbQ zunZ~l$4Z`0pS?O{_U`gnwbH%y(JJ)6S|B$`$>W;i@;(;bQ_};>M&q2*9R7=;VeA1d zX$B7a%fn&JCE|~VnG~R8RJ}*u}nLZfxQXMiRWSl!hInf%fNo&y>u>v zLfW~k!UFmw7Qq6)@*tz!iAD++8E0}KD5&hI9CdpDs6huwdEUukj{+xK+{tDR1)EEU zyLC^R>c}CJ_n$9u=g7`z=6Fx`LmGXOw!7;<2he3Q_@EZk+Vf_UUJGLlr#LE!k>AG$ zp|!)u8;zsUqF%|fBqA&H)MdO6EwhfxLdUAF|AA*)jgjhjr$qT zTwO!^*p;zfqzFTR(doq)81FKVGxxW%ptRb?4x<)dNKZ2r)U}cJqA%dnjsPUWf=8*B z2@ippX55K$HHAP|Q$pRe3rM^0)4qVTFC>COt4;@4Nr})ZEke^FQ5{KKSM(;Vc&)VJ zwagW-rJi^#QQ|d_V=d_}+MxLEQ8{y{b+FbEt5)=Z-qJ1I(VMPZDxU{Cwh7ng7t{#V zs(G+t5EyPXis_c^!kFH$-6$pzq=$F#Cd4-*d=th5Ebd7ZJTRw{W$0*9QWD0F&CAH>|vL z)r#}LeHuZKnh2a#`FIy@a5?ll`EcXpt~g7YkuW>I zpeefxON`#)T1@BThfP+CZ~5-Ik!*R;G`$(#X`kRu43W46acC=w`+*E)EjlWob*}o2 z2eD^qHFs^|ea9g`BZ*=k>2dmrKDr)Su_KH-5^gT;$m;-1QqO2-@Y@qoDIcsQof4Xj zE?`&wYQI4{O8H+{bX=o4v5Y@4Wxt`EU&8p@(Z?vGDd_L?8ADtIBJDHviTU$;pc??R z$h&X~O^hy}k2R6MdE$en7M`dPiYznBKKhpYEusM^NY+^sF3R5C{cn3-+mlU$l$=;Pbb&cq3MYOdiMOFh3U|OY1^}1% zna0n4;+UapYY!m6{MC?eLGL8(4mXlgFAd3FhIvC*?9MrLRD2o3EYOeiUK*IWPFF{d zBi_=@y9eJ&o^~GWsg`D=65r?h!PRfWis4W(45y5(<_^;m&$IK3FpaVh{-00~&VIB< z_3rZHEDU#K51oHt)%9*cZ~LczxA3}k3!Ql|vI;Odcu>-aVmRCyMD4(O8=C`+)0*x8 zz?`_A|K5ZG;^7UO(0its(LC1%(iCG8*$U?jBGh#ow1;gRub zb|WU;sjbYS!{R8ri7t=haX97g$+EtAxdtEm#2wkkE181Lxk305+| zw!L{oCMaKWt3W~M*eijj`lAfZbNx1>Sl*WlR0N}Ky{$~ z+_%~he%H)|4I(1QCB(6xPaQxRL7gbr|OuO>hw-Z+vrp!OOkKQ?X7~W zaARxK4h;e)IB$&Gr z{IA|7+>jrrBEjwVwX|36#N&~h6Yfm_q}R&Zl|$>z47z9V#tHVmmxnU_<_&Sg^}gE9 zGhxsa0N@%PPe9f9by*f=FnAH?c~PINM7}(UPgEl(F_^F~`4-Gvj4eZ}2gWj6ntStw z=~Dv=o6~POnhhA(H%+)+q<~(!M8M1$06-&jmuDc*D;GB?hT<+SO8x`NGSM%sGGVpU z&OV(G;``DfX!Gd=&40KSx^^qFjuOY4n$CKoROGBZ(dNtVdL}&AzNr0!69XkKAv_L@ zV@z{$I20~$wl`ie4Jy5t4u{G}hV8)mBPlVZC8BiG8adFr5L!09y?!E;j&&^dU5I6$ zrE27~vUXoeUj+_Hz7oxP68MHUi{Vg8&9(gfbBuLbhC0e~LAhcW0EoC%q5k4$HBS1g zq6BzTm^Cy9Lj{|0_O;-Pu>-ysH=Q~4l%J?y5L&xX8Sm5F;Dv3{>%9N8hmE5b>M3$S zfq=i`?cq@2j~#Ike?O#v050p{5SM0?k{NiX<)Tvq#4aM39D-yyErmDS*9v**>au?wQ>DeC(a~ zmhxI#&jwfP6jyOx)MB-Jmu&!GG|=V?GAA@Op!@N73{#mWJX5iL8snDF$C7mb?-V#R zTGdI*2Ddf@1#Ua$qA929o?}?5+;wMmKziJDsh|K2{6d?k164rdPgs>e6dTu{SCJ9$ z($!={I>TDGK;?8d=okSG%DdY*m{9yT{wov8CD~-%O+AG)J!EKQ(2g*@VONuUN zNAey0nOfPtvSX%37Gk4gT5;0_)k30Z-#DTtRo1!b>eAkwG`gUz%Xjo=YA?>64{+|^ zx(V$L{Ab^W{DNAg)>pn#>(7oDOgRKuza)u!W@KYW-go7N`ty8=+v$XQ&LtkOwmX%i zjr?uyEzy3tDdn#(Clku!3aT3LxZ>Y$>VIqiHN3Iet7xC2ry)ehK>KO=IG`#np8!)B zgOc8gkwXWPZt5TZ94s2D6|Z~UHr(^#azIVTE+$|nYVA#)rDnZL)bVI3!mMvV5d{3pMLnTsh_WL=ip|g3i&T8_szg0gC8%< zIsA^Z?~zi!Pl`1TJw{oKW$4sJqt3^#B}6$M{_Lv9>535$ee_JMpzGVUP4N#Gia^OX&j} zPRO|cb5_jx+QVN*Abt1&z6^M2QsO9rfq`r%e@Z*oLG4ai1=eimicN;Y`qIFA@auX3 z#`|bV`@OZK{rZR{ZLOhG(6t)P!hOS6RD)nZ0BdFocsNJ3fTIMkEvi@=KZ}uX*`^imf{SPCSU(*pBWW zME+7*N=G%o{OSj8BR%|B!NqrzFQI?nqVymDANCjmY1`Tezsq2DM1;tB&8n zE!F`{*5Lpi*o5-KA*ecIV0*4U??L4H&ioK>StVi5KR_dG8`uYt>o}|r@wRQ>Dnmj` zJ4OX_(;okvO{5PU$8aIKEAu?c#}zIC01TXx?pk$13~8`tfl$qK+Oy(yZz0q8t7sw@ zqlzawi!T|U#bHR4b=qFKILD2(pKWxnUlpZvb++z6Kcy~njTl@Cc13MM2Z)9A!Ht_3 zyNdmPC$_N6PkRzkQh-0Z9noi@1?&OCJvCKoi-3Whrc!U?w~>i2qN;p}v7ECYQ24#h zAd>U;BzT?qfXFK?DuGMW&@%9mtPN5TOf%5Qb{FJV0iBa7T5JUqUlk>0a>m}Ju&w@v zx?=TBPU*AWF9BVL%;C#kq!ilmK>MNPpLM;U6`S(W^h?lI!nTWY3?v%G6n1ZcySJq4 zk|zQ~ie@yyASWrj!L1b~NDsuFsH<)|lKHeQ^)QY{er zGY>LY@gJFqr8%8|GXIrR;j6Qc34spDrx)~|74(snB-%kQZs$dG zPaoNKUPh1f1xrU$$on|DC+9Cn6ueNsU(pxrMg%XY)6ff|JK!Zo_A6c(slt0psvJZK4hD`ns2JsB9dp1BQ` z4T-j@dWc8rzI$vuSK^-~*SL2=HVN49KWI~;s<8~{8xf!|GZ1p>E0G7ep7;U+IFiEw zBtZdgaSPOcC`j`N}}Q)m4cYaku^pgRtlBH?JraCmAMyRatm zya{V1+6B6cjmayF<&dTET=J7LL0tocII_S0S-h;yHWCU{@8mnS;m+ z9&#q;c~nbZBC}<7xOO=F&B?631kK^)WL^Xl64j_jg#Y4TLK=jcgqzJ?I*(3}c1|Os zzZp-yI?Ktd2=Wj#7KcL|R3lCr!~0d1_sgYUPI8ZI>~X+OIOHWz(q5luSRxX545FCA z@!CJB<^gvIw{Gve@=g)mqw|V{Q_8QV{0oR2QRG#T@$q9^=E47|k~rhl_)jXD(6W)e z8JlKL{?Jlvol?REm)b)bvma87Pi$Zw%+1MMm)?s&+S=0r zQlo)X)FBH#58`%sBuN6z4ag8dy>@jFDmS0V+xg-x2>ji9gE!yK2D4QNQx+Bd{r3$2 zDh4-e|CU~{K#Vv!w+O}Ne56xyelg=CR#6eMs_D>k-X`UuOU1>AKXr4u(=jAkkaAf8 z+nRQ%jB;=%jS_(TW)G|9>HZTpZ+Yc*@7m5S+K|7u(7`!I_R(bUEuww#NJXbRc6#(} za&I16Yn*!_7hN?x6~Hd^e7>_0z>6rTEiWM)UP2gN!fXR+#sFOdA*Al}#1DLr)R>h0yYu~TE_#ky>o?6XDS@xUF8%g2yYx^QpoOv;=bHy! zili~oBj2WQk~;_4R^Y|^M>G(oObZrYPUi0C8wMyQB+@$g z(i@=|?2+=T*ejQlXrklYt6K{nW#p_N=Y@`YF9#IU&&%`agq)RU(}}Vxc5|eogq-_L zg1N2vG`E#3Ov2?^D>F8$M|^WBS|Y0reTe^El+mBkU_&UFUx}4S;(Qq`8$y>?Y&w}Q z+46Gw)qMI@bTNsR5MJwwT}&WgHip`|fU&z`lle3%pl_eoC1WftKPBGMjpKaocJa=3 z@vhs&N)h&7|9`oK9J_Dmh5kHs(H-HvhIa%8;ku@Lfyx9hDbVIvCvQQOJRFLv2`C9b z{45*$jh6*GoizW!Q_2azUX#cMRkeqflY_fCjFi}3b&Rct>Zlf@{)X>#%i4J2rrO-y z@v7#_HzFSnPv0tI=$lQ&%Qqr7rX$eXnlbicYM$wY%-zS)ltlh(@`;o76BoEYAZFL> zGqhh>)=J;rIlB_9o{I>PGR>uJCZxt95SMH+5AtA2XdFx@a9PNMA3=G5g7p}FS9D6i zHU{zzhq+9`*A=G3vcMk^#M>KzTteJ6o zxrLF@7)%DyA7>(uGTaX$pB>?-U0Qn74EI=j=}-@Jj{XHhL9j@08DWmh5tk(5!bV>a41Do#;U%b7M4ZRb#3=GI zHkoCY@hl5N>&9Amrq#G#Obt3YBV?9eXA2f<6J|yAQ)WvTmvacz3kF#tzXMyS5K4l@ zf8xd)T(W@GQT}K%^g*gxoTN^sf^_S2}e^m*bTF&xBt5WkP0umr+1UkWJ61l^#|GhV4ieb2&D=IMNe!9A@;t^c33597? zCj=Nh%!86)H&q&FaO!bp1#I;=1K*5MNg!k$&zDzxEOEfmq;(13B@30zk#fMdmSKr_ zBf7B~!ajq?-6+?M6%Z)PZ4B+WM;Reet{S^VaFifdjor#Zw{By%;Hwj6?iJ@>X*Y0( zv#jWzZ|gFSa>vjH7e*8tldysU6$8&D0g-;YOO?|q%)##$asc|}@atq@m{?qN3C#=)Pfq9{-qeN0Yt40#3|1#W4(q_A zASQ55j1tblz7>hX&P*h)GX1M!(3GQ9R9{a2I%y#j+bXKWKW?pKnV8oj#$8-rG#nl= zj&6ario8|D$^SqP#Nlx9mx-z8{2~g()x}>RVCv=nOo*z=t0?woU9P?gS6{AHU#wT3 zL=e$Th_rkJJa{z!MLoQ|O#UhX;@!v_*%2njb)7EFX;h6ed0r^^HbI$l^0Bk^$zdFmW*kqQEMlM6xK7+3Fg^Dw%7AFBKeUWdt(W_OTaq#Da z%;F>vG`1q8!V4P=MjN{*b0}L1ll#1aYmtAf=L^8;3JcF~l@?URO^H>Q6sIQY`qxI< zzqWBlvP^md#KWjTFcFfEW5_bz%0nHzWYsTDCv+)Pm_l{E?Vb>5k(g`GQE-A25aP|+ zMonk&Wre0uz2#xxl!VwR?|eX(^n#0+5RZu{lT8+vdYDQlVonA_eOe5Mr`6$bS{@Fk z8SL80;Sj{y)60)h2$2Y_w`>M)9sG%WyfnxYaT|F;zEl{ov9~X95&%OA#HF5JXKdjd zV%M3=Mnp?`A)%$&qtO0N3JKb-CRhYU7X7OcQx|t}DeCk=B(ALb*WV+ncIr@KILBVU zu|@z%;_6kN6u+sp=R=0}q&eJ;FNAY;kwtcGbDh%d?WK6&dDV-?sSm$ztKi$zQ=Jev zD7X_F)W{idos1Oxw^pbrH&LBO0ng~G;>`Qzwz3*;R}gcrRw3NI(P-y}dzHYU)q}P>3ExA zxH*xDdI!;gn$=O`idpT-K-})=(5HWs!$+h4Ih+|CITxn(WM5D>7%uh!B~Q-P*AZDP#d*+~N#hX=))p;4YPhvwEr1)O<_2!p zXFPl(;GPL>y%f?;=v7%f$nSE+a%}_hxA9vaku?;>5qHvpQ)w@t(Mp8EMmRHqhKigiZL#KZrJe#W1d{yzzm;Oyrt84@@|H;Wf3rlU&l#mPD7>9+p#&%?LmP2&)Q^5J+kv6f7Q1X9e6J3wwVA81)`_jV?WdQ0VFwk~_B$ zh!!=AheHXeXm1yB3;8Z@q1{yulwA+fUDb_D@mT}QTclbm`%r6^v3?pxy;G;;FH zf&Qq=IIl8|&vNwB5aSVp{MHU0mW^0?1pTUS*HpC7yM{65=*sc*J2g}0e^S}MFx};d zK?O@Gj6h&8_PJyYdw5-F4;orx=wh6c=StWF4)K1RIk=d+A?y@n8_^&-u25?1$-E2` z@-6iDh&T(yMG$vv#HAQ(1X3&+qaE<=?psW05GveR(H8H8>>Zo2BvF@f5R1jxcOAtt-ce;Somh8jm(OX8ZsRN3m7t$af%^B2wDiIr(EY#;qFfUL@U1sa=>t0O zE_5nKqTb1E?WcBIG)~(C@8EVlrC}BZ)*f(~fK^78iHavh4)aqyJQO($iX09!qpl!? zc|(uo;a{j+f1Wg89lfb}C)1z#mrka%*p!_tU;LSWrSe>S+0bRY>ty-spT9JDzL+%h zk@I_-X{wr&u2d6nUL?s=D~|#b5cK_2*qQ^jC1`=Vhn5zx?&DUz&_xHgw11 zp1x1N`jY>pY3L@=3g&yhtAb_X7*F0MK2tt&>?7BS>m$sM_y~i4Z@h*xV~-|ZB`BQ` z1Re3_4?voMV9nZHb~H_3IpkXkdG-MRW3DZhs|&wjai z|Lhg`J$(53Z(sj_{Qg+Z{BUT+M$%3_$j_AV2DxMg3<%q3>_a}9E}Uq;o($USy|#6q z#aHgf2r`Q;2PqiV4;@=35UE;s&aRa4Qmj@%j&U%qK#gG{&pEvkbFYbL;`H$rRcN|z z+#lI+N`*82I>@-}&nCI%3*9GYK)6%;)`+1|Yk>dzH}ZW}Kp;#2HDEsr^je`Y6W7(^ z3LSBpr1)}_9V7huCEBN;$2FnF@@PLn?11+$-G7UpIJ^6QEA(W`)Y=hwXLnh2qiXzpLD zbj+1maTz0KX~`g}3eB&}1uLj;*jg%y`svjAjZY-Jl9=z5)dUqJ(l)Lilg~$Qz*tQT zA=EJDk315=mL|(EdD-tKS%{%EfaD$@Bs#C$xf&G zBCKhf8)ORxkL?>bcy=uw09ru)fOj^&iJW*ucX}wsHxj>TtdcRR3Zgz@#Q>DY19Jg* zg)B%#H8WBLgmgNlDYT-Ir6SZqS~|GoT8!;OLp}J2?hx>?edzH+bPN!Y4zCmA`>#VQ z?TSrp-2eT=&z#YxMEpIDVD5NRJu72a4~GLTh_)jlb&Obp zMTC}cO!{Rip@owz-a@wAfo`BOl{E2iSR4+4QjFYaF}-fvbp*H8sWR-3N>pxt#imU7 z;ZO!$y$8nKc?(xQqtvL#yoy3@Xwu8LhN*u9VGejpyoD%eCU;KeIppT~vYj`aT9aL8 z6!MVjckhY2B zT3=hYuLbcvFFxB1@qw#l2a%pC=1h)I(=tE$S&^Q0sniKPP!luXRSN?gEz4a?=fk0b z4>AMp89l?x%K6Nh2SNyT$gwqDF4$WE^G9P}UM>l&-dBMbgZ0e&d$FFck^ub_f!0#r zwAt7~n+bmrOVBAWL5Lo-j7wV*JyDM#ftIcddD>Yh)B!Nh17oKTU7g=1fqf#8dlmo@ zlo!ZKN<$1BVd2qu2VD_66tP)iU= z<7H&m3+34iTn3xaoK0p=x;n~*-mza+!jkLB0?2|y>QfL)(-Dt?<0YmGf~qkpo~YK_ zP`O{fhypSCjG`9{0{S%~kTZg=~5U$WdIH#)^ zc#LRz4sF!(Vuft ztWE}D5e`lUVN8tE6b6sR*i7Czrgn$p z(%jVORSOBPbTE)7p>A=5C~1=t8o@%1_4Vx+K?+p#wBWrCIsV#J)blAS@AC$IzRrrZ3taaP;vsRe4S5U7lky6@ON=g??B ze1q{pmg;!ze=POy2F?1Yw>rvxvoW80=v*q|lBFoy@Ocm@5 zJiiuz|Kmt*4Tb34@Dsx%UDt~ao8%&ydvlN*p9se^tTmw4cI`YKKe|W(=kYitqp1l| zdo`IC(X{C~GH_o?^9knyifGr`T*C;3G;Qu^-`>P^l8XH9Cuw&Jh}m!&fy}OThqmlG z@d%1-l>xKf!q0LA4dm}SLw|}@7fl40Tbu6bl6Z3#yvHH4P0PZ+o6tNn_ zarh8`jIjh6W7e?eBB&8me1P~k!G2v-U}G;HI11LU%Y{zOWhzJ|z;_BzcvKsZZX1zL zJ*~hC-3(S$fdbBL22*oPHO&~S`+Q^o4AXfW2E`~QX8{M>H?R&c+M$nHHHhswYNL<7 zN>G9ANS2RkQ5fJ$V>h%!>vT$i1i@b^(>k5H;;hptRctj_jvESP5SkS+i}p=plzzxl zM$+NKYWtw3mL>4iu>^j!LduWHCxn!UG;D2nA4LAHsC>aAW|3~Pj!;ow@7j9{v5fT2 z1B^*19T;m~)u04v1Tn>TMRC7b%Un9lukOZuq8y&3TWzO1&U^6Nb;~;9LUR!%O;3xC z0j`#xNHl)q`)FgC(u_)7O3Wtc`KWe%d|99pC1W6L2eCFE4zo*O+?BjJBW{@J%L@b3 zhzp40I-WFCJ_>xCHVdb%s@+z~s_QtME@%lqM$-k&;K#zlqew%DpGi&`u#757w`?Pm z8|pkL0RPqkB_F?7`oOWu|6Y!A-)+a-6%@!*g?7urSb_=-7!1~~HJAvQj9|hHmm4>; zf|;g5MKo7dx`2XqY{|*f(iNDQ4PDE)4JzBSvW$0LE>Pv@03^$A`A%hgFD-O*PAOa+G*m`if#4$j85NCf==+52 z<5I-9*u1aU9)@1!PY}&lX7U&kx4_xUG3Mp;Rfs{c;T9n=q7) z#9-&wVqwWRKqx>?@Wir&H7E1Hx{><5&e1Q7L=e~n!a3PqzHWW}-s-({XF&O-+x|L1 zPrFQEt$!yUbxvqSC=~vm5*AEABm0H~dk6+mMQ;*X@p`kCErR-sZ`VZy#IeeX8e`>H zk3l(q-~K=X8Bm~5DX;&oQf5MjrzwnSPssvh`ga;DfwgPoC$|E}Pjj3gD?TWM0YR5EPeKp6d)?aH~7D$+Cv}MS)E}k`)5_qyVV1=O&Wg*b*|**bP;UtDgvf zS>x|ikRVgPAD@%p8hT`%uH_R9#e$-r6uW{+zs_mAV4Pl;G+QuzrA_)q0H!g~6DYyE zPN!Z()|$ObV7YVnTay2;y*KY};>a4t|NngoQA2#xp)5=CE|214j7dBpz+gx+ zk{O7-pLB*OAzZ2A$)dQ9hn>ITN(P}RWePmNU3!1O>+Ch3Pncv@w;)=Ea72;l!CpZR zgd{8IL9v?EeRRM%^(-xKg`c>rJ(v|{$;B(MMx)A4s*Nc@1ld~Q zbn8$qdmtA_no*veE0%49O#>)RUvGc6g7x@7Dw%|T`v<%G;NQXC{(ks3)!Q>jfAcntkPWyOt{D|;T6>a$)eq$ z1UgV6tUM0wg1ejK49&?4YLc7*b)G;%<8~jOG7KunSyjIN-MMU~Cz+zm4^X$)a&feF z@7CJ#soJf-uYG^}=f@Y;mhZ2hy;#5U-RkF$YEM2z7>yh`{L<0ABjfwV_8`0?h0)sb z{o1+v^()`4-~8|OFTSe%_=Bf~f_swPo+0XAytDrK<&_5)*M9hC{oIwc<@@!&zrFU= zxApfwT7C2d!f5Y-L%YZK>>1nd46u6h-rBue^|$ZTub*GNcXRdfnc9b+v3}?PNhsXI z`#;7ytbh7l{o=j))i3Lxo`X!pcJ&xWoRsjwHAxH7+wAd4J|NC4cr5Er1kc3+t*8y><;29A4=fuc~9aaIB-5KrPGRN-)}OD*YL z1+}Qok}le$E3aGj@Xm@}J%%d`V3`KMtTOi0P8i39z>1JGpe}GO@rGp-IuTm z6G9Bol_~=xBcOrJQLmrOH0WrMXpoo zx=EWDwu;nY9lCE6+}sK{QS2Wr7PTvVau^?UGZ-sVz$bw90 zn}wNld6!FhL)GZ8uj%$29GAs7ghPNiKMJs{k@q?V2Vn|AF;(|UW>8;w@ZQSfFKg${ z)V{b1ck`}PwQFZZd|l=DvnO{$2$t(bFbjn3YVF>I`nk*NXD`+sJ@o9YGa>K%stT5w z7}hayTm-O_(jgKIkPIeIY@)eyIkx)!SGC8VvRSYhfkblp?@)q83>;f|@Ynj4vn!8& zIOa@}cqb|0VTIpQ5G6)m?$z_ea=+j=gKU`au^4t3!|a);xa1Cv?LIQTZ%^ZkE`(Eo z92lL_bqaz9YjuJaWM|H{e5-lLq)ssobO`}%^;yWuvpenwZ zRu!Nw?pebS`CBO2RB_B%M%{O4bVufGIDGB?Kls?eQDgPL-8_cT=u1cTzkKw_!F>lt z_V{%=QCfuhmG5egPu9M9pB+%71hLC22S^~!sd)&Fw#n!m$sM=K1?nl_@X?l!aYsSM zokr$$Q6xvWQXux6p=Hp)0~3c4o+GM8-8m2qjmK`Wv0_V%zyFn_ zRI#F!Dn7nptCU|uo^CDa&eCMe9qm1pj#~qy3 zo8h#+QJmHTIBog6WQQsgr!8kJ#xpRs#@WBUKJy^mP<+d~DQ<{qRLHKPz$61KsKR(GGmS%S1uJ;u>8jP5!+ z=tC56;h{noI2?}^;j%TU+diRx1634cCuc5}Y$IWnr|mqr@`8aOjwW6j=}hc*D?(anMNn@kl78 ztp#1MoT^1)VBHYpYTFDPLwu-i|4>_P=nw-XeFH^UJjli@9%7Up|8iCyUt3%LV&%cb z+TG7;*Y8l9$Hc_=f&EAKA2@t;?|~!xU4Y4qg3Ql5-KUb_-Gh?!>Dl`A8&daUuOA#g zG}e0OV6qX;FFr^))*Gger(jxIqPC%?1{^r3f=R4M{T?)pf^HG;?~qLP;KQYasJcL3 zk_^#2NzvcU^)pN_^+qncQ|P5$iquQBs5L4vou1)Q@{6G%S54UoFqA&slyXMW@<>dg z(|b@UBdRckFz1v=hN@Kl{4SLv&#pXr;;NdQp-GndQBtumBgGX%@Fhf0?6ec+7-RP; zGkTsdt-cV<@C>~vE08@ZltJ<&VgPT zLX;A@yq-HASA3tD1d`@CpTSy8GH)E0)?)d{twTt-F~B7(O|1#hO{FG`2)~}oz9fk7 zn{68hlFyoLAVlZS^0L_h^Yu^9tzLUq?m%dzD~#SkrW2Rq>e&h;F6Ay)f+Ue51tH^Ceb02@Or_FC zMe(PZRd*RfyrdDH%O-Iyo1}rhjSL(NM0#=dD4kyL3Oe;w?bbyOiV$lD*Q}b-r4*`r zx3Eve=cw##n4y#EcgWrfRlJ-o*aa(a@?$O-i`ixxd&FU4DMR^P*`mnvr%|$xbMR<} zQbzWmZ5SVmf^lqTB@Y@mwdzr^X-tGp6>!{MDPCVZE{mFLlo zwR=CUKJo5yKCsIX7M5a@UDmf@mq}KS+-1_zF1ui{l%cucMr-YFbP&?Vq97gHS($^q zHhg=%Yc6cJ2a>zyx{T-3$>vs_5JL)L!!t?W-Cr|oq*OBLvy%v@FcnMQ`7Jn}%p7J= zVjtxAFXy#}*{$o?GBPXy4EEFt3n+ zfkRdXOC}CxKD1r)VU{Sm*Q#M*YnNom(Enq|XvdJ@*bkyK^lj-UIihZt?w$MSQhDg# zN%6>!4pkrf6vyHiZK3wj|4P!P>%X!#T@TWe4Fje6AN}4I==Xvg_`i{YjLKFo=dy3+ zhUCzKJ$bxm4r_BPR`3tGYz177GiYMb8Z~Ao=#fSkZf&CoQDT|O9`4%8FX2n_-U8_jre#sH0vS3?ASQB<`ul_FUn77ZUa@*4ZAigR;n zu?Q*e^YG0i`pv-Z-qF2%2&3POjrI%-4#Ho_zTJI$df=~Aa`)gs3jW&LJ2;lyO~2dQ z)6+xW_I3C5?WJ!AdPYZ6eQ1gnvT{3jn|JRXNV8$WI%+%#r*qxnE`J;lCFj>c#wQ{9 zkx&Iz{1Q&mWulPGCMBy=9Y0!#KVbn)E54h|&vmw=K+VKWr>9$$M@?>=i(hmSqM6E=foi)j0ndb|tUbI!cIAWDZ&OQVz5l#JG zwvDo#L4Cc?Av_0RJ3OWQ0M65_rI40_WoC!m?M@JLp3Fi{IX7Q@s)~8eu1uiR3o>V? z)p!!e_-|)diZ7ienN}TAM^G=ZKREU>Cs*L=d!Il44M%P+Z}R&=9Xm;rmdK#{?%ytkO%=M=q6g`xO}Lnkzb^CL=OE zH0-%6l}yqaHowg#{iEnvyNiJRx0BYrw4_gJ7ynuN?hKcMos^z#+Hk8YMY>t>jNkT& zR>xK!ejNi}sMzW^9~~R=6s)GLid}t4+DHvFQme7rxijk@-8kmtWRsFNsn8HKc+d3- zmpk6hsK#pFU8-OGA-1z(I(<}`MQRVPDgcS3Tw+iWW~wk>WrVr^uGeiBVaNMaykHI` z2)oXqUY}5e9kwIHT!pY?tO>KxAna3%g=rk+k6fFB{2kMwFt&**J2I61@fixYH_?Xk zdQKFkJ?Y0V0PED!QrP1vlq)C~nabU@WQ_|V9#^WENtRZo0wr01uu>x9FUsY)87J-M zLas}8uS``jBo+}jVQ6RW9VL2_ZY`%9$v`Ddm@R|vQg%mjs6~qvjX_aqSY1{x&KQzR z{o>eRBnO@N^Ik&8hbIU`8LC8Bs=Rk(miU}cr&HAZj9!!UvqK-R- zh}onGg0hN5HJ@Mf0Vh=zP~;3Zg=5@RW6CsE@s0^rG@!_Un_wiMs!e`4pZ;m>=7p69 zcM-3;%e5uqaAkLhgu7Dr&O;yT$s*CB2&zPMaRg<}w!`-_wDqyG)TsAHxLutU0Cg0V zb}+<&ec^^V1Q9Y8I%>iR?-=qzo~uCOp)Ta7YN!8RyY=qsPE$&5ue zXS`S{+rsxj99f2V(7^=l(GyCOuvK%G*xaWmNt2<`$~1(A;X^tv3(O;NM0o+EFonN_ ztUGD060;EJ3R`Y1{O-)!*JoD$bY=B}??6j=?Olc)wbSn~_P6%Y1=;pSBOPwBw%{Ci zX?gwRnSY&pd-dkM+P!OQU!Pii^v&v{yS2+#e|`*JeOv`fM?_FZj?Q6s*|v=$_?%`C zYbn0Sfv!6*zZb?#=Ip}h6!Jz*adQPFca9-PS1O2ghge=09}6T;&0&6YsJF;r%@UCy z#B1<`@tC{__h7dr}8 zEI)G`<$1!b0bVbY81x!*HpY9+dUb{Lig-E4<3uJ{HN7O>8XnCX(9vibPNhUEl24N@ z)NmEt{|9>lf_K7WftIL$?V}5x_rm1tyMZ>sxiO=b@33*2!$^vI*sy%%=$ z9Nl~6=-w+wZ+PW|O(2GL+0AYuJ?tjZqi!O-G2iDL&X(9dKR&i}8L{;7@QBlx9k$Tm zu+${TaRL!;d{TP#fSL`xHP<=1AK?nE6Nq?;O2n%WqI9RG&qAIC$dv2;q6HD%pS*~o z^8j*RK@N9^EO>HDk&X^p6M0xliE4KdsvM-1HyJ{X%o>3ex@(hb24zX7jV)Puq<8g^ z9w$M%cm@?4ojmE{A+6EqhAsf(2CAvrt^cZ>zj!QDWDkl}rgEasEcVQ*GSw4(hHB@o z)y`c*Rm^C?ctM?Y2!bm%Gn*1=I2R8m z;K+j_1nRQ5v8v*!WH{DgGDulkYW&%}t`P$%kX6nok>VkeC#pq21HPaaHDe(GPvdCL zwo6u~t7}%b=gQMiFR$wr)tn&nq-f7|jpmKAwl}Yuq;tG5yPIfTChrGfbaXne7LUV? zsaq66l$-MHGD{R^hb(kBxF*pi>H6CF8tzx2rkb75HSi^%Y3i-=w8eu06M5BQm5>k2 z#8Cn%yHW~0BMZbFRcXN3zM$?57!f1g^!#~zMywGz7 z&6WxpclZZ#yUo*o<_H`u_-6(=iI1d2kU9m-tFR3l2aMRoUj{IRQV&~y0byj!&a%ZK zj0(m)!e}NB|6eG;{|m?I|9jy7-Ln9%0)uCvG#d#HK)Jn?q25mx4y)7jGz}+ot)s(( zlwH6#ccERd92w67cXuUBkD0X-RC^r7|A;#xD+jhC+{6?BB9>zmz;37n&8;J-pnvYhpxJyZTlxWJ*ieVjUuN(D7~ORcZ4YLtWKzl~;I?gmJ^_;A zP%DRR@Uz(Ge_TI%i3y3^pT||^Z;z^li|bB`N}>7it1iVl14?M_5acsBfPo|~OlMU5 zmvzzLXf4X~g)44+!};}dtq#gW%aGyxym?@GJ{hjn0hx@#2COnuTmZDuvb(ES=I5YQ zMe|Nb1O_F5Bni)Jv8gKjCg9pMvEY`JYhm5X>S@T*3LXXp-Le>NH&`mf+cA#i_cXI` z4lHed$l=LJWRjvrOoaE_Q+N^`J!<8Q5*dfo^uW|~&UdC#-RYS=bpTCGF^{qrbJ^eL z@b4f8{op{~po0IH%f|J1PpTI(xpw#V(SHZief@v{8ocZ6OVKp1>147`Q83YH{`%B_ zf_3`7yStlZiA{Gy8C3eLuRldo#`Yys15jF=Jse05@Q!FY+1_4wr_y%=$$mO=x^DnR zHrT`d0s62v)tz*zrkGlG5*fu&&?KTMH*;rR^1q>ll=UL|N*|ZWzGe*(wR2PV4 z6iBC@1C^ni4!Zoh66cA1N5_;n()4*y-$CG0CZ5E_#AuHapG3K`WgCS~rUFH{f^@4B zI4+bi61sJuM2b}?`)Dub32S!PRN@s{U@4=sLQ5bGvc$yuj{64kcHe26`s^(1Fkf&6 zDqAlt(E`_5$n$6`*%!=&ZOqQ*$sW@v!6nzx;eW!u^p0wk)MC^1b;pryqY6( z;PPjp%nm(KFf@{6#VX&7nHISBd9w1t6b6xj8a#8pTeS z9>SrES54DcKviW*YHw%>vKw=!NR2PAb4Jw&qS>W+wFCJ4cppnX&DK0^DDjp+E;^NA zo?mU+j&UR4AO6+}^MKrRs(c?;7mnz)85O08g z$H`)b@RaOL_KNk$H;X+Z8p_BU1^M?`XMm()fi~a}YruTG;`}2AV-CHj#O=gRn%W*C zXCU@RhE!>G>PeD-y&VoL=e2pd@vxL6rrXcH6x+_aVMnsc05yOo5&cc8GC?Q5?^fan z+;VxR5)up0GW6rMsuY}3rr`4_oJwL-gBs1L^njvF;oekQ!IP7QmQY{B;?zz-25@{d z(_K}jaGyf`bLTYSe>+McJ;4t>%lTb#;mQkBO!5L2tU$$-TT=u1i+Hf=9G*fK((#I@ z%;9KvQ57?S68>GPFIhT)z~>7JduJvQ%YdJ8=Zi1`SCUzRrhGob3>dUdljJliALxiu z&2F6sZbjfeU+$o8@tI*>c7e-U?!rCpGfsf4s%c}OOW6lL(nVs%5w#<6ag(u#6q65> zZA*tV|Cp6UKT@Q<$$han+jhHiTy}hPm0#NoXxSao4`C$Z2TF+9J7G)WVH@K3ps+9a z_BfBl5GlbE%QKX^&(kt>s$R6>!m0z6(Y<{rE>Dru9G+rMlX;4~7Qs{W<$4FTR4VQ8 z6q=UJX}r6#mK9``NuHgK&{D;-?#q%oOFCIl4XWaj`(j2nExVJtZlWrlabK{HJDEcf z^j2`+fh%aq?QYutMs#;V%W^8jU(*>*t9jt*J6Y@ns^UfeXWZ?oGpCvw41JXGAg>r@ zi=q=~df2Z#QRm@M&AU^8M(*5>`(B8tElAJ#Xh3;T6_5H_fDs%^rXZThkOC3!lrr@P5Y|&E-|O-vi4ni{((ddr#AwZxk`p2;pG<_RujEiG|y5KqIuBd_8USzAk-7{iNMT}!<7GM>*8Es=i{ zkHYgK6L@d-kGaJ0KjMk(?{bM(_TpFI-@_AlBzrV5BD3q1p^Ijm%36TMp7lJM>qfYw z;Yl*tJIL6(-oYuhYVw*AM?BqN{lS;(r#@z(OfiHzQ;Nim&QbF|gac*}`=oyUWc~Vi zPt$AfuAjch{0LUx{;_uUQSIW*)$?Z|?(F*eYs+8P-#J}BcV+eQm9?KfM2rh4&>l@F z!rF|jm3itn%S?aKnbXZ&o;Ymv9LbkBcg1*|l*?4R;F%HNfj)Cs=5Cx=kiB{yYHlN= zcqDLxd1Mni`+~1g7Ocda2QtB_!zLz=DDbd8X!Y)&fXiXP`}?EXpWjEE+YyY7%OZL> z8s0mS6fnm1-?=^G9{Rnt1B?P5DSQOZM@783$1 zsGyp&da;x3X9o3A=1jq4vX29-FX_R&`u#_>_c;1+oO8DgR@btaAplLZQMMNrwwucv zwnyG@?jw4aqM+zn2p+X*8J7f9X#GV#kMSHZMO@0jp36Ey3~0jj+b-Ad?tU4v-@gU< zs0(U7FC1!^GqV3`2S%~U7Q^mHQm(ri;3S>ZIN?4iwrlAsP9@Vl@WV{Zsn$N40f(|2 zPMhHdTXKRDsXmUaeJPGAK_MP72F4-&XzlwOYfqlkzBs#f^QND4&3XOPwc?L|cryNorhQkrZS8sAU z?d%KACs{ji`1pOuXP9oN<=TeB>fhSY;MVTd@FcQHp3ItRfmxF%o`j!RdLY?`1#xjA z>}o=$F>Tn$D|s-6DRA$+qG7b#u)&u~x(o`cbsW4m<9cG+un!x@Nm1cffDVk1J+3t( zFC(F|${7V(3$(R~9n>)5G$(p;Y$|+eK@`J%Jz%5F&6w$?U}iHv96Iy74oNgxnRQUC zVu70($dxjk*Kg%q`tp%?8&ARpg8kc;6x5El;tuCHp1 z@J7=uNM+du$h(6eKd{*odZ^tK>YKo8p%a)>tvOqrZEXs>TRe-D7uH-#pyH^brzZ$ul8 z$UvRJ70DBwGNr$Vo+Lk19c-1L6OvxDG$Zf|L6P0#q?5|uDAOn1@@~iA=f~7aAyV2- z4SPi+%Lc539s-9=^y@y?GS*$0EBvPvH zai#iRjs(53RL?X$UU8lR(y?Xx)D|0A;+Uq}n_8d--pkEb*vD7cC$EsHur|6v4fsK` z(E>FBj!2xUO6$Xpsx{ZC=382IKVNmfyz1JyFV{c6)nL^aiTP1(cMA8U z@lnYf3HTpn7W)u==xFQKZ{LrR*!_|Q)r7`92=QnG=_huELTpr5bih9ya z@W8PVP3Z2LOn_fK{l2S*g?v!}d#B+$no|mHa%e_55@d`-ku2~@VMMX0vt(F0^$N%! zkQAv<51Lch353luByTXll6wgLY<@ydV4h$Fc{Racde0yLS_}HvX&>6U)28_kA`zGG zWj99!Uo${lkH*@Ky7Ekw6BMDlP9~oNHvm_BW`7n*p66~T&XVXQwXAxgKn8NtP~!{i zPQk0~w1|oJcMF-G^^cdJjrknVZ_{(rX=F(qIv@b zgzr@Paj$my;_5fw3Ebmm*=7(~jK)3aArklaG42WC9<7ibf_rN}eOxTGj%Hs2Bl-?{t3C zu+31&#@ux^g=+{@M(0#JHoix|gehP)2NBjsBs>In7K8_DxH)Ku^=t$dE06vHDIss% zs9nCeIS`agIpraSKlJj>6XA5dZ_m7k8K4S<+S1+19G87uAe&x42B#g(Kd)kU%y@d z^Y!}m^RdxA`*~P4^#O>v^LEhe=f~FspmJKVB}4;Zgzrn=K(sxOdWkUK5suqz7XLc= zHv6M?`GeYbXI376Ry%!e{p7W^r)TK|*Ongv-%6vVA^X9l%j@5Mws!C7`qg{uCvVgq zeqH)-Na6HRziL4|>1 z<-vRFpI?r}U)-&<0F(JKp6ZK&3GV?;Q$a6g5-Duiq?Cbl)Fh|V zWZbC@-8-kQuYPi8{j+nmlaFKZ=eA_E_MAy9ILp!NBA7aJ5kVW_e%{oI@ z-rFLl-P{`4HWQwHwnW?%XZKPA&#aIObMeZ#%(%H}QI~ZS4H`~KQ-h)ME^EDMkyotl z8JBv~oXt%qe+9WWZ0*#v99wyOt@hz(o4a|qX*_!AoX1Uv@VLBf<14wJ!>&Ks;+0Gn zRlE2pla$!)8cX-SvKy+?U;esw?(>xg4`Zq1E4#yPXxF;=dZ>+uoXF)>mf;)XK-J=G zp0wao+|R+#pYr$=?_sns28qEwxLv#Sm-VkcT>aoIn>1|w0|+!J zM%2!RrW)EksIAmvix0Ez%FYte5aV1)dO$Lo$}MFZFSSo_FNjVs>lh+?1PAi4@Xtj` zlmXap>g8jpw%Vq(m-D9S{-}vJH~0z#bHCT%d-|X2SMP4f;42(B_L@e4&85iU%%bPo8Q4MrDoy!IcW3)^Xo+y-P?bhhi~N{0U4R$b~NUGMz%(BS^J zWwe@}O1W2M_T^uwkZvaP#v;!JgVP!1RT~unl`ulZEl=aMKAm zGlTTpgosM^kS!VAF=Qya&~s6v(@Ta=A!H;;Q}8B@`0nTSqJEE)eXRE6j$pT68?%!_{?qeEbVU-}|qQhgvgoUl9fA|zr$5YNmK(r4ldkBN69 zUIN`UiKoGc^@V~FF~P)rEWrz}w8no4K`LV=bc@bo>_mu9Q`8sJ8af#ep)C5*W+YBB?EkO2cI{MQ&rd1kQk^o!cv&sLt^tAFz2)&(X= zJJ&EW0lxEwCcu*o#wKiuf4DUB#t!0XZtqMBd#Ar8Ah#0|<$cY=qryY=Jz+`>ya}ih ziAUJHG&&s29R1TeBcKqEY8!LGAO zRM{%mcX{efeBZmd1*SV40vXr+{nv%dCLIFg88`I^=oZ0D-5~&pbP3oZ5BT^k&Yu){kkbQ<-{DPBh?&H_Z+3fCt z$Q5t5li$Ym;^}RVv+=SkO#*GYIbYX37|QIpu{PVt+ifbW#&gp)jjQS5yj@QiZ}+Q) z*7Wm@=pX#w8d~GwCY#6B^l)ypCzKoY1lMe*T(ZT{HS+wLgxB2%|3wsG;> z5@#b%vXwxa9?oj^gt3~wNSj}m0pHG08+kdc#@h6VsP8ZiGbGsN*M;6DLv1|VbJJLx z9?q`zgt4n~u+6s8mS37l@8P_5PhXo%dJpG8d;0&wq=!S6v#dP>|67>!9?sA74E}0N z`X&wf-Orf%t(Wtzy~$@?{kDZcIX*>Nlc=0t&J*^g!u4=&SkC_*Ra`G;6MNIYpek+~ zf^y_(H;c;YZF%*dcA$22c&t}$u>lZgjnPu_4nlD2sRSDhVIl9 ztC9A5C^2IcN=6YfRc9)4rL>HuReklvJT*bUPR<`#naK*vIp!Mcgk$bu@t}&uH`K5o z-n$jnV~5hxM^?A<$wasGTyP`eC6A4hzL3d``06G0Y%e^kPGMh`wf3gJtuqr75UJTS z6{!Y8rox$aDDfr%f2xWBrfwV0E33QR&iG2&Z6+~K8gy76{+SS78RMJGAQ!$rx{TVuR6s*8Qn`rE3kVV zuvJQ`Z4H7aC|4+GxB$J*0r#v{L_Ntw4jdcDo**SQ$b86SlF1KU3zuKk0uD$c5 zcHwmG^0zAw?ykN6_xhEy|2lc9{^@tMyI22p^3=+M_iN`qT7CGm_R)pWX- zl)L@SmLkRF2Yca&)3guA4jGN<3p9H{O6qh z=bZlMoIa!H^iAQ{YXQe1`)5-Y!1>ct1K3ltPbvaj5&R~|WF=xko$w-*ZL%G0>#Q2F?A5~uN(c!F-8>x3^{hd2bxGz*Uhx)dH9ZVF|QXJ}P^M=He z;h5KlW`(HjN&a$bX-QOdsVd4;75fY4IU-C<9*fB_!`|Up(~w%oo<>T>)2b>}84jz- zMT>L_s9RZEXg&_p8o#)hwZLP0w^1&_=8ficQnU||oE=xN3SZL)uXh#`c`{>T!+G?F z&SJtgO4!Vb8eFvcmR>!E^K8~TO)_Imno~phj*k3fa;l>v4*w)*Dw2dzQggb!m_;ds zrN=Nz_83(0DxEkczp#xGJU8IE;uJIX)e^%*tW}<5=c(ow;`aRefY&n1|l|HNpb{W(TA?g=s=7<_eq8x*s%)SK^f2kOh6iM6-BXF zsYV#4GPWyFdj#jHgkH?$%Nl|8RaUlm~%4uo9-)7U#lVSAy^UptzGIqks z>p2onVxsI~&vuDtokYn1&4b7q_p)yo4f zvaQIiiVF!jY(j#An{Gpta}P-df_bTXFX+Od76~(@isb?oVmMc0kli|s!M~G|fP=+N z<`NIZ$SkN^__rdOMtmtFS*0q8Gw~g^!bs_m1bD&#sRsZr?sfS#A_^{MCmjvyQBs^o7#&LU zKPI~QA6!q$e@XgK`ebTIpNSV;ny)K-Ua@&Y*VqlYle5tY9x?|7n{G3qW#z%c)qg%( zeRN~x=@+Y?e$E~;*F%<-wRZZ4l}A^&grjh}sAi>W97?A%evk&}WV5;gb5dKJ2jg@> zV7>nj5QMJZsa?L{)Guu?l{~RyMz*4B8EG=?PTQ4Y8{yjp7JI~Z3JQE4RH1r_%l%0B z&#KGrNL7bC0XAg#!1Nm=XD3w4(r1ft16Q1r;vda1we$1if6t>moHONrFJ4p~PvDTz zom1#`@i50g!0k$e`Om!nTfbkKOArD8avZEU zoe;v3KO1Yc>h;su=q_>s6S9%qW1#6?I+V%(0e@Z%+JQ+&M_{&;s0H_-WN z3j`W+x*Ni<;9{@|J@i1lb`)J5z}Apx`xhqB#VqlWXvz&|Um!cOS*xSNN3Dz7Os%W# zY$l_2WGd?%U?KGX+>?NioNec)M?Lv)E!UaBX(j$iK8yHq<0n6qB={utVL@SwqmxcTmoew z!WE{v%AkV>CJrM!M^ufNR;GeRjiOD8b|+9EltF3=`L0j?c zlNaN7a=bX=m7nkbgN2eKirOmVq=?BmE(B$j)tuQK$syZZbbzidsJb1#SlZ0LLddks z8pZ4cEF?}TgfltC9g(V8T|z^DE-h86LnLpJ)+Z1$pfg%WM?5&5`vXQ(s#S)5T)$)F zNrITBVaCy3RnHSGW*Y)(G1@d{QT;H&wo;wZi)uc<7zRfW4;ah=6P$z*fYEIMc+=}^ zzC4&`It&Rd8{VC|g8(W%trjQt3)1(>>ts9Flaz-)YFG za6|hN+AJ-llGw_UF8%pbGAV|AMYZP=1-%#t|6KaR1if!Om3-cUNht0Ncp{UK(Ss9| z$9DwBrKQ1MXSpwA^xzMnI`-o3V^!==ZL)QX^}{i0F&l;DvH!XD<4!YgQ3n0b z^^f^?^}BzmJ$Qh`(T#`^APTUYc1H(cNm!lJ>^~KRp9*_v$#=Q0e|@F?x0@_wgd9Y% ze*NUy*QZt=-B`PKbM=GoAS*eIiDTaYkM#8O+NI^Scb>2>S00>PdH5$NdUEyqf1P~0 z{@HTv^4F{1zF)iePu2-z6>8_csD1N(?ZOq-4|^5CIY^De_=nXy7i*V4sGono_TC-w z72_pXPF8+FQ2^3gic>FGze#dxK3C4GHsM#0_xkr*V-M`eX^NwBkFW-lWocuhINH`4h)?Abh zT_27&zb0|S-nXkz>F&d%W$*)WchRL{gJDJZiOPVR5amw23siaTTx6_6`}o?d0IXWwi8x2Ov~!_PD=Wn z_59k(3Ay|<9Ru5flZF}bKfTlPKgQttFaL|Rf5>3s!2TG|{In{bm zgD~zKoS)xocybb%q^Lou`9Ek=coH2wYUPX)83!XFs5v|5I|l~S-94l?ji#oQA#ig3 zotAx3!++GWdVHWasSN4yf&T73hb)$}A}$<+x=u(4hpIy}pfPnflYCZ z=2>w0Y+8w<8KY=-stW{^5UeP&u<}M%h7V?do5>q0K(~|50&@A`3ev4k4i%Kq1%Rqk z3U-r>@n|L}djeZZ^VV^@Jbcm7;rYqFQL1>-=`K9Ka$aNu=g9&~da(##hd(kDy)%v4 zr9?Y*p1{X}!uEFAO;_hmMI;t`a2I8ekPIOuBTh4ib-kQr-f3trhu4HUPuSJZ;vl%o zG5EkRo5gO!$P=~bc2}4P)Z0h!6r^SyVs$$c9 zJ)@hJEx*fqni@r|lST)`sJfK>jlgf)`HHb_$M2Rm8%Kvc!^(XWpCAz~7%oQDN1l(Q9I5us_rwv7VHpj2<^1j0EZZ&;@jU!H@+w})7Rz`v`$sLIjpM!WuhEMq zvVY7aj{gzAl0BLjk%{ZHp~U0SWY#ESf4)((4Eb5pJa8x7C#MOS>z0y)(7hC!jMnbm zT3bG~dhh1y2B;PxCfA!mC)}KEGY|c%FsFv+Hap8iN!gP`y z!jFThWl?8cmJv}rVp$P+?nIvD6s6KhC@|GD6l%^5r+e_;%HuC<%V$=`H8K;{`wCY3XEQ%#Q?9A~i*F-9&uY4d3hD!6dt zkV;fe{%cEr3*vSQYCex7(OE>ZOWC9&!scrty?!ZQwop}q zMlcP0&Y5)>7Yk@xz!eZ40f|aFot1@y;#g~8?oxtlClrIn^&n>R?NsynETq~7O9+)j zg5BD|4E~xV%G(LkSZGl7&6x*FR^UWgvtOH=N7=*dGd06(U~Y6^Hn|4VD-pAxTNagq z#U$%rytDrK<;~8r1haJZ8nDZo=7OF!`lvK6<}A$ygYqs6Rc4st#r7gQM;5n(PFtOA zyU5-_r#ZKwIh&iVVlbP6wlI|*P#Oa@M-P`aV!H@MnPP2ZH6pOQ4`gswH4H>b#HZ&5(*eAKwkK-jedv=g!97q4K09sPYy z28=M0JWX#RIdy$Y+5sjod$a@I8}087n@n?FyG?Z za-t$f#M(qD-6m_xiKr(fP;Z)Lk7#rHi_W@35FBA1bsF|ghMwCCJ26f}{xh=jja;B2 zY!I5?stGJ2MHNpSR$zczOJf zl0nGwo^Bx&VU{B$9YQQ3VaMtHU=!F$T?NjE$brp(l7K{V35^CdY*;jtM6$3uaFN}C zQt62nHRKRJ@6(XW)fZY*im_~dYfsPCAKhxC5u>gojz{ccFi2Zij?0O-VPON_V`Rac?Tz~W#XeMZQJR9TZ z#}{h1uB|-yD{s4e9~{JJGK}?;S8JE<*Up_;zxGMs9>>U37aTiSdvfd6UF_|uNjy86 zQ1f|XfoLp#$BI@Xb5U=m?St6QpGQz zCyQPsKRBtzYBsl~AJ++7`7Y+D{t%{zA!8<(1^YGl)vy+yqyjqX6TMyiUy5H&sh-9f zz-DFoy1(S&`~c$ps~;E+g`+xPvgQQnNv%T24*$NTGw| zb<1uxgj77qGsM-}S>M5HE<$c7&nr7#%?S0FP#iWR)0~E-27R?k!-+IgC2kRgo{y%` z9LlMI2D55PpXCA_TSK4A6ojqNXQ=>&G<5w>-`B5vx0Uo66vTRQwlR%%w8+~*r`xB^ z@|>H{XHGRza-L;RQ%~Y)^s5tN&-_{<$ed)Q`omVZ%|uzQ0kv&JS+29RO+;C)Ve~8$ zWxA<{s8eSXvYZwUFKLMY2AWHRnIB2UL!Y}`d+)}kNb_i8!@5hU(;S7;sfH76POGH~ zFEYVA_n{jr?BB>%OU)nm7>G*d*U*E1>d6&DkKf1m0;C%`h(C(c6=la#V^}DxL|9Z7{=`XDA9FMp^bFuz6 z(1@>Ie;;C`KK-6IIu%E=eOFGMH16PP=xW>f` z(p*$Z3r$h5Eu15hsG3pCFEY)8S}KvE7B!o)EK%o-(qbzdfmGv3rct*pLV2ntwbWap zSV{}@$u){f6#?{kD%CTg3h1vXkgJgi!~=Xc%Gi8-!68nxdIXMLsM7vBgp@MrEittjCLFAvVTB zD4CPp%7cqeF6Z@k?$pkmIdW(pPxW&5>gwOV&cvRJb;O2azln807^ogssv$X)L%o4B zlNC9GE~A+|6R*dIJ&>L{Z0WF|9X#7>w8y!3jVljsIYT<@U3qYF?d z0^aDW7yA1KhEZ?wIg~+z$>&foe#{e2AmYfPQAq59k8lk;iGX}$D!U_@iGG(7iFm!< zx}nnu*=lJr9^@OAl45zOqh~t7mnoWfA>cFSrlw`rK*o_TnD~%!L;>LRGlFaPrQ)@# zSa$7lHVv?qKT6ofJ|m~*$ppwik$0YL|iQbO7fl3MuHjViVDkt!oV-S z$PzXP%iHS&tA_@kuYGX8cIgT`59h9~-MkYXhwhy;P4?(sSl*;$j(XP3O2(kUbCcPM zlVQM71=1TQ%lx0wP+QR0@}xrY#FVha1a`tW&T|sT7a|WAB|J4Ey%hOINQt+?l>YA9 z5HTi+Ju}KSzuKh?6Fvlt%96mhUy|e^k|ek(5u_###xP7H5ttU%0#Y$a4u?{fR>7Ol ztdx*5i>IMv&}D148QypS0Aa_n7Guhn^~~#W4VjGqRzqCgD83%q0(7lV1QVGQ zJ*pgC^FSu}f%LZ84AaBap&P|Dc55=-WLp@=nzVy)z7}rsFOSzKOG72C#?4Jrzk7@M z>4L!g-Gh}MPdgdtgmBIC%sl#L_0iq!NJi&mar9!?u}};f*0n68!9V6=+Mcm}V~5AU z9Zlz3Ox!Fhu*DlD832gJ8>st91~dt7AY#x!J7|{9Mg+vuUTmf#636A8EUNSREbyjK z#Go{7sHT=!Fm;F9wa?A22bk;0u4olO+ zWpP-CFV7#OLDMMc7IE{mFhV7Vnxet9~DGhNLliy6d#G%Z1Yf>9-ASB?196L)%weciI z4(OYwF_IUNwdqeBf?rviKfoav2JPsBUkSu5M=OIOCZgM@h&|E7NAg=wne&R9nPkF~ znPhKNW|F?{>A~q_pPQLvq?~=F%)2}2=8q_;vqVmBaoC^wf;+#ti6!=IBzq2?V<{qX zJT-*IQ$v(_%7|H>mtuzJr6};c6w{D8;zXM%A`Z3{k7XuiO`}{QE*az*WE+e?eUS-{ z$`LZ@^{zcEg)vd(xvMlUxaM9f%2}|tvD&}&z_ZAO$-!m`U8{zB90nuFY*z0^*@a>V zmSrbw!^qousfioBa6xpw-vW=p{MLF5Qa!tvz*MN;b@+skMN931tGk`BL+f7yEHnWN z$@amkQ$?9O-11e#wTs)l2(#?WWGAFwV)@Ks2u38T?bxNC_)pv)4_oBAh@LB(ilnLpnHjUr~y<6XmO)bo871#rpOtKeEX>) zLF_*LAvPa=w7U0UrmrR&Pq%uS7Y`@((TP&7Gu!8hU^VnH$i&vu+ppk#8?k;`ZuxD>6jQaIWVTf2RXy)1 zJ6`cxBYdodoLAn_f-^2&aFT2wE}8qDIyvr%lr5h?CR;LVn2SqGh*dD)<<5reNgXWH z@K1JfO2P04lTSg;#C8>jk)*gUv9NCv!>kCNoqYjudg5u#4w|kxW%2A`hK4kSCJqu1 zUm?c;NIkU|JVQ-UwR;sWfJz`!30;emH5v3BzC_VY7dGm@CSX~RSKe2jA!N>UZbN#o z(h#p4sDQ@+Kc9#uA(SjoJ{3hXNey`T?NQGQ2zi9%R%K;J0XReK+}wyCMqwH0V`JsS z2&5zQ}k&ZfIIqCAq_S(9r?3*ZmE&g}1d6 z{LDbAS%qq`S`}``UEy}0N4VV+CEWH;59IoKNv|W^zFN+X3*q*FE5RD}95F3fGCR~D zv*T+KqA%VZ_2R9l7yF}L9BC?E?-b&75d>^OXv`+!b)JdWb6lLxaWPusVsx2{*Rx#w zp5fwm0mSR+HpS}$!3>Ot%6^&mH5zd$$0WFpQEN}HuYS9{e(HApzuyl;sO9DC2tPet zdHBKl)qCq-eFlN#=YOhwbfI?d+RBrQ;A!{h;o7}>EJn=}bH*I`nv0C)HfBE1gkZ0_ zClykA7l>^xZZsY+=epR@4F0V-14=Ao*kqb!I`AZJY}A9tVLSB0hP<)F1viY`^dj1B zhGnwqEC)AkuYY#Be&uZa=3o9T z@XJ(-no$@psIz3`;P|tEWZoGy#WYU>$)?>zp_}jPc5%+*g3AI2d_9T)WS#nDg$L)# zF_NJUwrKTF_i9f*ZG@7kM6CAsWc`z$96V;`+|_IEvc^9@zQ7{PR~|g9fBB>HkVTlY zpR1qTkps(}0QDGqUHjtf`q{IqpWIn}^aaGV)07Gj?)%gGwXfgq(hIX)Ib)ufU`)Gt zXZ6-YD5%C-UV5)~`iJ`YllAN8Yj-d6(Yyh{&csI!j)w#Xi#$wiEBnk}JUqDEB8t1X z(OSaGR(jedL~nt(zQu^E6sjZL;`g4`?tKNs_2I`2DJ!owL!-!fqf5){C$FtNJsazq zHjM>~@Khf4|Gu>L&AIx8v$cEI9DJ(%>8I86XMcWtu6F6KYs-(o3qY!0*R}f1quP6S zetvxZnZ>MzG`m!u&g;3|6bjD*#g^yOlwNx>mNw}m3W+`6ZUL?K^w$!lmI4yPDK#U) zk@UJHv=gTxBz!=Q6Z13HQfl}U4qkLqyuc{07fI(F;bAMOL?0-5z2PvTJww_IO2(40 zfzpXs()a1Kv)0q6*6uy1o&FmvnjS~_wrOy&AaB~4W@Dq(TMt)$djIFg*A~=#zND7G zy==~~4GXLJ>2d+J+?kUfe=s@NJvc}^XDQR1Tj}S=*V4&!Ust}IJHCkNpQfIhYdVJ8 zcVB-l-L2BT**&)Y@lW*+ZvXuFnn>oe^5jb(Ry3;%r)pj9ph%f=;z0g=?zV`t)LKs4 z=KZuz61+x`2#nd8UNwmuF5U17+hdmfArzMPV!o-t9Q>c54e>F7i*WUj_%pN`uOA8-OpH!HqN>+v6uCTdDfOIKh_>! zYA&+;8{CIE0PPHbRyay*!L4}VVeQ6^@jWdxiaZLzc_l{o9{uBi{bNVR_e35DPdegO zdy6_2A&oY5UvlWIegAd+-2L^p@2%eZ`_@Bf?3I!6eXS)?Y^|?f7&@(|>T44)BL~Ni zzC8Aa)^aem+FQH8*_K4&8>P5MSVC1PrqiXkuaW6JBd@kBW-v0#WDM4{cJUIWnlx?O zM;Cak6%{T1JqhIkUDmT8GO(F66&5^6CnK9jVKDz{D~_~V`eGA@n$M@)th$9KU1W6o zUtrlhuyFHhE;X$K<4xcf-9sy@{^dwi7|=XEHqAjd(+pi?+jOg0B4xq>6R!~GZd6u z-&)O`*07WI(QobSUu*B(VLoiFqF>7{Y9Szx^iZ4Keh;+}v}r4aFZU4^u24p+u29oh z^}9m7u{j4Q$A|}M9K4!mS|B#SVZu{}1n`$E)3e+VA+A%BYn8`~DzK%IE=p{`Vedh7 zJdwETM3lRZ>q>+g9&98$LwsKe=afdLh5Gtz*wcqOH2lBe>*HIi$JNI;9_{Gk4V~O( zho2TVq#dW8rj9XTNAoQrd4y)$mi9PMcBy|r)Z~Xlx>ojQ>{6a zspy3Q(R8?Nb|iUv1JeoQle*8^36szpBTkc)AO-XM4OY%H^7+F?Jc*MuB++doXCpZF z8yc25#Dnf&4kmMZtiV(h7S$qR8#8>s7jr}OF;6fj9{)~bkDY)p@nWRRUQoX_@$gmtke>|k`1SIT zxZ0i3s==%q`;1w`&2zESvJI0!@daA2*&_C+Nii-iaxm3J9+(QvGN#;jh1 z91#|=_pq^FQmr`&Ug$R*0z(|ud4my43O(U}*AO*5)FZ4HUUS+%2j>{S>>lGcJ;!)4 z;uQDfw3(EabBm$>p`3lWT*c{u!S0N3BjYJzDtf%PyBiX;b@%r5M!$vH)KPCSFRo7i z9q3i6xVJCW*Wl~^)L=h+HIQtj&vdFA{^=d;ha)|u4E=vyUB8K0M%m1fSJYBTFU}r0 gv@e_L?N9Vfr}}z&r~4Cc(4zPM7swD-y8W^Q06iOls{jB1 diff --git a/js/157.4b1645b7.js.map.gz b/js/157.4b1645b7.js.map.gz deleted file mode 100644 index 9469c3309fb2766c8dfeb65c167873711e965c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327773 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%0AQ!tuJgQ;{?*FB4;4j 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�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 literal 0 HcmV?d00001 diff --git a/js/157.4b1645b7.js.map b/js/925.2ee8e454.js.map similarity index 99% rename from js/157.4b1645b7.js.map rename to js/925.2ee8e454.js.map index 6bf203b..eb41c20 100644 --- a/js/157.4b1645b7.js.map +++ b/js/925.2ee8e454.js.map @@ -1 +1 @@ -{"version":3,"file":"js/157.4b1645b7.js","mappings":"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","sources":["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/./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?5740","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?2ab0","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/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?535e","webpack://sanyue_imghub/./src/components/CustomSelect.vue?b677","webpack://sanyue_imghub/./src/components/CustomSelect.vue","webpack://sanyue_imghub/./src/components/CustomSelect.vue?9326","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?2dac","webpack://sanyue_imghub/./src/components/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?5e68","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?c59c","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?fb67","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?e29e","webpack://sanyue_imghub/./src/components/SysCogPage.vue?9fa0","webpack://sanyue_imghub/./src/components/SysCogPage.vue","webpack://sanyue_imghub/./src/components/SysCogPage.vue?c23d","webpack://sanyue_imghub/./src/components/SysCogOthers.vue?a313","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":["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 };","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 key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_44 = {\n class: \"progress-header\"\n};\nconst _hoisted_45 = {\n class: \"progress-phase\"\n};\nconst _hoisted_46 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_47 = {\n class: \"progress-details\"\n};\nconst _hoisted_48 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_49 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_50 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_51 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_52 = {\n class: \"error-icon\"\n};\nconst _hoisted_53 = {\n class: \"error-content\"\n};\nconst _hoisted_54 = {\n class: \"error-message\"\n};\nconst _hoisted_55 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_56 = {\n class: \"error-actions\"\n};\nconst _hoisted_57 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_58 = {\n class: \"restore-section\"\n};\nconst _hoisted_59 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_60 = [\"src\"];\nconst _hoisted_61 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_62 = {\n class: \"file-card-header\"\n};\nconst _hoisted_63 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_64 = {\n class: \"file-name\"\n};\nconst _hoisted_65 = {\n class: \"file-meta\"\n};\nconst _hoisted_66 = [\"src\"];\nconst _hoisted_67 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_68 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_69 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_70 = {\n class: \"file-name\"\n};\nconst _hoisted_71 = {\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_progress = _resolveComponent(\"el-progress\");\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[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"文件总数\", -1)), _createElementVNode(\"div\", _hoisted_5, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[10] || (_cache[10] = _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[11] || (_cache[11] = _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[12] || (_cache[12] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"系统版本\", -1)), _createElementVNode(\"div\", _hoisted_13, \"v\" + _toDisplayString($data.version), 1), _cache[13] || (_cache[13] = _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[14] || (_cache[14] = _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[15] || (_cache[15] = _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[16] || (_cache[16] = _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[17] || (_cache[17] = _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[18] || (_cache[18] = _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[19] || (_cache[19] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"状态类型\", -1))])]), _createElementVNode(\"div\", _hoisted_35, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\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(status), 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[20] || (_cache[20] = _createElementVNode(\"span\", null, \"系统维护\", -1))]), _createElementVNode(\"div\", _hoisted_42, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_43, [_createElementVNode(\"div\", _hoisted_44, [_createElementVNode(\"span\", _hoisted_45, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_46, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_47, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_48, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _cache[21] || (_cache[21] = _createTextVNode(\" 条记录 \", -1))])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_49, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_50, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _cache[22] || (_cache[22] = _createTextVNode(\" 取消操作 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_51, [_createElementVNode(\"div\", _hoisted_52, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_53, [_createElementVNode(\"div\", _hoisted_54, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_55, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_56, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[23] || (_cache[23] = _createTextVNode(\" 重试 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\" 关闭 \", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_57, [_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 disabled: $data.isProcessing,\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\", \"disabled\", \"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 disabled: $data.isProcessing,\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\", \"disabled\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_58, [_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 disabled: $data.isProcessing,\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\", \"disabled\", \"onClick\"])])]),\n _: 1\n })]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_59, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[5] || (_cache[5] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$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_60)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_61, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_62, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _cache[25] || (_cache[25] = _createElementVNode(\"span\", null, \"最近上传\", -1))]), _createElementVNode(\"div\", _hoisted_63, [_createElementVNode(\"div\", _hoisted_64, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_65, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$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[6] || (_cache[6] = $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[7] || (_cache[7] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_66)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_68, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _cache[26] || (_cache[26] = _createElementVNode(\"span\", null, \"最早上传\", -1))]), _createElementVNode(\"div\", _hoisted_69, [_createElementVNode(\"div\", _hoisted_70, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_71, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\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","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认 5000\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 5000;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取所有记录\r\n * 2. 按时间戳降序排序\r\n * 3. 分块上传\r\n * 4. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 4. 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/esnext.json.parse.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';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\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 isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\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 // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? '已屏蔽' : '正常';\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\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 z: 100,\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 // 预计剩余时间(Requirements 9.2)\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return '即将完成';\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return `约 ${seconds} 秒`;\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return `约 ${minutes} 分钟`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `约 ${hours} 小时 ${remainingMinutes} 分钟`;\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': '正在获取数据',\n 'sorting': '正在排序',\n 'uploading': '正在上传',\n 'finalizing': '正在完成',\n 'building': '正在构建备份',\n 'downloading': '正在生成下载',\n 'restoring_files': '正在恢复文件',\n 'restoring_settings': '正在恢复设置',\n 'completed': '已完成',\n 'retrying': '正在重试'\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\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 // 重建索引 - 使用前端辅助重建流程 (Requirements 3.6, 9.1, 9.2, 9.3, 9.4)\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning('已有操作正在进行中');\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成 (Requirement 9.4)\n this.$message.success(`索引重建完成!共处理 ${result.totalFiles.toLocaleString()} 个文件`);\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理 (Requirement 9.3)\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程 (Requirements 4.6, 9.1, 9.2, 9.3, 9.4)\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning('已有操作正在进行中');\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成 (Requirement 9.4)\n const settingsMsg = result.settingsCount > 0 ? `,${result.settingsCount} 个设置项` : '';\n this.$message.success(`备份完成!共备份 ${result.fileCount.toLocaleString()} 个文件${settingsMsg}`);\n } catch (error) {\n // 错误处理 (Requirement 9.3)\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\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 if (this.isProcessing) {\n this.$message.warning('已有操作正在进行中');\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error('备份文件格式无效,请选择有效的 JSON 文件');\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 成功完成\n this.$message.success(`恢复完成!已恢复 ${result.restoredFiles} 个文件和 ${result.restoredSettings} 个设置项`);\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n console.error('恢复数据失败:', error);\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error('恢复数据失败: ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\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 openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id, '_blank');\n },\n // 处理进度更新 (Requirements 3.6, 4.6, 9.1, 9.2)\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误 (Requirement 9.3)\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作 (Requirement 2.4)\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info('正在取消索引重建...');\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info('正在取消备份...');\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info('正在取消恢复...');\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=1132f6a8&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=1132f6a8&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-1132f6a8\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\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([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: option.icon,\n class: \"option-icon\"\n }, null, 8, [\"icon\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nexport default {\n name: 'CustomSelect',\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '' }]\n },\n placeholder: {\n type: String,\n default: '请选择'\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.placeholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=6c59d112&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=6c59d112&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-6c59d112\"]])\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, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_9 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_10 = {\n class: \"card-header\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"channel-name\"\n};\nconst _hoisted_13 = {\n class: \"card-body\"\n};\nconst _hoisted_14 = {\n class: \"card-info\"\n};\nconst _hoisted_15 = {\n class: \"info-item\"\n};\nconst _hoisted_16 = {\n class: \"info-text\"\n};\nconst _hoisted_17 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_18 = {\n class: \"info-text\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_20 = [\"title\"];\nconst _hoisted_21 = {\n class: \"info-item\"\n};\nconst _hoisted_22 = {\n class: \"info-text\"\n};\nconst _hoisted_23 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"info-item\"\n};\nconst _hoisted_26 = {\n class: \"info-text\"\n};\nconst _hoisted_27 = {\n class: \"info-item\"\n};\nconst _hoisted_28 = {\n class: \"info-text\"\n};\nconst _hoisted_29 = {\n class: \"info-item\"\n};\nconst _hoisted_30 = {\n class: \"info-text\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_32 = {\n class: \"quota-text\"\n};\nconst _hoisted_33 = {\n class: \"card-actions\"\n};\nconst _hoisted_34 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_35 = {\n class: \"form-warning\"\n};\nconst _hoisted_36 = {\n class: \"quota-label\"\n};\nconst _hoisted_37 = {\n class: \"quota-status\"\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_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[59] || (_cache[59] = _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 class: \"help-icon\"\n })]),\n _: 1\n })]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: \"筛选渠道类型\",\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _cache[60] || (_cache[60] = _createTextVNode(\" 添加渠道 \", -1))]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(channelType.value),\n class: \"group-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_cache[61] || (_cache[61] = _createElementVNode(\"span\", {\n class: \"switch-label\"\n }, \"负载均衡\", -1)), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, _toDisplayString(channel.name || '未命名渠道'), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [...(_cache[62] || (_cache[62] = [_createTextVNode(\"环境变量\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_16, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_18, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || '未设置公开链接'), 9, _hoisted_20)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_22, _toDisplayString(channel.bucketName || '未设置'), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_23, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_24)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_25, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_26, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_28, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[63] || (_cache[63] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(channel.repo || '未设置仓库'), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [...(_cache[64] || (_cache[64] = [_createTextVNode(\"私有\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_32, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _cache[65] || (_cache[65] = _createTextVNode(\"详情 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _cache[66] || (_cache[66] = _createTextVNode(\"编辑 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _cache[67] || (_cache[67] = _createTextVNode(\"删除 \", -1))]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_9);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, \"暂无 \" + _toDisplayString(channelType.label) + \" 渠道\", 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.showAddDialog = $event),\n title: \"添加新渠道\",\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[25] || (_cache[25] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[73] || (_cache[73] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [...(_cache[74] || (_cache[74] = [_createTextVNode(\"确认添加\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $data.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道类型\",\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: \"请选择渠道类型\",\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(ch.value),\n class: \"select-option-icon\"\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString(ch.label), 1)]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"渠道名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: \"请输入渠道名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Bot Token\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Chat ID\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: \"可选,例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: \"Endpoint\",\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: \"例如: https://s3.us-east-005.backblazeb2.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"CDN 域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: \"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com\"\n }, null, 8, [\"modelValue\"]), _cache[68] || (_cache[68] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本\", -1))]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: \"请输入存储桶名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: \"默认填写 auto\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入访问密钥 ID\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入机密访问密钥\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"路径风格\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"]), _cache[69] || (_cache[69] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"使用 OpenList 时需开启\", -1))]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"停用阈值 (%)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Bot Token\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Channel ID\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: \"可选,例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Nitro 会员\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"]), _cache[70] || (_cache[70] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"会员单文件限制 25MB,否则为 10MB\", -1))]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_35, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _cache[71] || (_cache[71] = _createTextVNode(\" Discord 有接口频率限制,不建议将其用作大规模并发场景 \", -1))])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: \"仓库名\",\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: \"格式: username/repo-name\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Access Token\",\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Access Token\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"私有仓库\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"]), _cache[72] || (_cache[72] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"私有仓库限制 100GB\", -1))]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.showDetailDialog = $event),\n title: '渠道详情 - ' + ($data.currentChannel?.name || ''),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[27] || (_cache[27] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[77] || (_cache[77] = [_createTextVNode(\"关闭\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"编辑\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: \"渠道名称\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"渠道类型\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"状态\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? '已启用' : '已禁用'), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: \"配置来源\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [...(_cache[75] || (_cache[75] = [_createTextVNode(\"环境变量\", -1)]))]),\n _: 1\n })]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"Bot Token\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"Chat ID\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || '未设置'), 1)]),\n _: 1\n })], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: \"公开访问链接\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || '未设置',\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n })) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"Endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"CDN 域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || '未设置',\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"存储桶名称\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"存储桶区域\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"路径风格\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? '是' : '否'), 1)]),\n _: 1\n })], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"Bot Token\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"Channel ID\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || '未设置'), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"Nitro 会员\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? '是' : '否'), 1)]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"仓库名\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"私有仓库\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? '是' : '否'), 1)]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"停用阈值\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_36, [_cache[76] || (_cache[76] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_37, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.showEditDialog = $event),\n title: '编辑渠道 - ' + ($data.editChannel?.name || ''),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[57] || (_cache[57] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[80] || (_cache[80] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [...(_cache[81] || (_cache[81] = [_createTextVNode(\"保存修改\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $data.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editChannel.name = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"启用渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\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.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: \"公开访问链接\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[34] || (_cache[34] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[36] || (_cache[36] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"停用阈值 (%)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: \"Endpoint\",\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"CDN 域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: \"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com\"\n }, null, 8, [\"modelValue\"]), _cache[79] || (_cache[79] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本\", -1))]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"路径风格\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[45] || (_cache[45] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[47] || (_cache[47] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"停用阈值 (%)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\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.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Nitro 会员\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: \"仓库名\",\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Access Token\",\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"私有仓库\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[56] || (_cache[56] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_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.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.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport CustomSelect from '@/components/CustomSelect.vue';\nexport default {\n components: {\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }],\n // 可添加的渠道类型(排除 cfr2,因为只能通过绑定 R2 或 S3 添加)\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false\n },\n // 添加表单验证规则\n addRules: {\n type: [{\n required: true,\n message: '请选择渠道类型',\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: '请输入渠道名称',\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: '渠道名称只能包含中英文、数字、下划线和横线',\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 channelId: [{\n required: true,\n message: '请输入 Channel ID',\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 repo: [{\n required: true,\n message: '请输入仓库名',\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: '请输入 Access Token',\n trigger: 'blur'\n }]\n },\n // 编辑表单验证规则\n editRules: {\n name: [{\n required: true,\n message: '请输入渠道名称',\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: '渠道名称只能包含中英文、数字、下划线和横线',\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 channelId: [{\n required: true,\n message: '请输入 Channel ID',\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 repo: [{\n required: true,\n message: '请输入仓库名',\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: '请输入 Access Token',\n trigger: 'blur'\n }]\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n const iconMap = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot'\n };\n return [{\n value: '',\n label: '全部类型'\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n icon: iconMap[ch.value] || 'server'\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n // 获取渠道图标\n getChannelIcon(type) {\n const icons = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot'\n };\n return icons[type] || 'server';\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return '未设置';\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning('该名称为系统保留名称,请使用其他名称');\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning('该类型下已存在同名渠道,请使用其他名称');\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const newName = this.editChannel.name;\n const currentIndex = this.currentChannelIndex;\n const isFixedChannel = this.editChannel.fixed;\n\n // 非环境变量渠道才检查名称\n if (!isFixedChannel) {\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env'];\n if (reservedNames.includes(newName)) {\n this.$message.warning('该名称为系统保留名称,请使用其他名称');\n return;\n }\n\n // 检查名称是否与其他渠道重复(排除当前编辑的渠道)\n const isDuplicate = settings.channels.some((ch, idx) => idx !== currentIndex && ch.name === newName);\n if (isDuplicate) {\n this.$message.warning('该类型下已存在同名渠道,请使用其他名称');\n return;\n }\n }\n settings.channels[this.currentChannelIndex] = {\n ...this.editChannel\n };\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning('环境变量配置的渠道无法删除');\n return;\n }\n this.$confirm('确定要删除该渠道吗?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings\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 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 // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\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=89234e52&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=89234e52&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-89234e52\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-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([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? '保存中' : '保存'), 1)], 2);\n}","export default {\n name: 'FloatingSaveButton',\n props: {\n loading: {\n type: Boolean,\n default: false\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=26e68e9c&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=26e68e9c&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-26e68e9c\"]])\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: \"dialog-footer\"\n};\nconst _hoisted_16 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_17 = {\n class: \"token-result\"\n};\nconst _hoisted_18 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_19 = {\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_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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\"])]), _createVNode(_component_FloatingSaveButton, {\n onClick: $options.saveSettings\n }, null, 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_15, [_createVNode(_component_el_button, {\n onClick: _cache[14] || (_cache[14] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[39] || (_cache[39] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [...(_cache[40] || (_cache[40] = [_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[36] || (_cache[36] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[37] || (_cache[37] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[38] || (_cache[38] = [_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_16, [_createVNode(_component_el_button, {\n onClick: _cache[18] || (_cache[18] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[44] || (_cache[44] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [...(_cache[45] || (_cache[45] = [_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[41] || (_cache[41] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[42] || (_cache[42] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[43] || (_cache[43] = [_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_19, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[21] || (_cache[21] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[48] || (_cache[48] = [_createTextVNode(\"我已保存\", -1)]))]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"p\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[46] || (_cache[46] = _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[47] || (_cache[47] = [_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';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\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=63b9b06c&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=63b9b06c&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-63b9b06c\"]])\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};\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_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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 === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: \"请先选择上传渠道\",\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\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: 3,\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)), _createVNode(_component_FloatingSaveButton, {\n onClick: $options.saveSettings\n }, null, 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.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: false,\n // 可用渠道列表\n availableChannels: {}\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 currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\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 async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\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=7b8c65e5&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=7b8c65e5&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-7b8c65e5\"]])\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, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, 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: \"first-title\"\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_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[13] || (_cache[13] = _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[14] || (_cache[14] = _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[15] || (_cache[15] = _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[16] || (_cache[16] = _createTextVNode(\"访客图库 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)\",\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.publicBrowse,\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.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"开放目录\", -1)), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [...(_cache[17] || (_cache[17] = [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n }\n }, [_createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, [_createElementVNode(\"b\", null, \"允许公开浏览的目录,多个目录用逗号分隔\")]), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, \"示例:wallpaper,photos,album\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\",\n \"color\": \"#909399\"\n }\n }, \"支持子目录:2026/lucky,2026/rich\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0\",\n \"color\": \"#67c23a\"\n }\n }, \"访问链接:https://你的域名/browse/2026/lucky\")], -1)]))]),\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.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_cache[19] || (_cache[19] = _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[5] || (_cache[5] = $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[6] || (_cache[6] = $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[7] || (_cache[7] = $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_7, [_cache[20] || (_cache[20] = _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[8] || (_cache[8] = $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[9] || (_cache[9] = $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[10] || (_cache[10] = $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 }), _createVNode(_component_el_form_item, {\n label: \"上传渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: \"默认渠道\",\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"指定渠道名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: \"自动选择\",\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n onClick: $options.saveSettings\n }, null, 8, [\"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: false\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\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 async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\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 this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=0c6af1f8&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=0c6af1f8&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-0c6af1f8\"]])\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=4cdf1dc2&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=4cdf1dc2&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-4cdf1dc2\"]])\n\nexport default __exports__"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","toPrimitive","t","r","e","i","call","TypeError","String","Number","toPropertyKey","_defineProperty","Object","defineProperty","value","enumerable","configurable","writable","_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","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","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_component_Doughnut","_component_el_progress","_component_el_button","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","keys","channelStats","length","channelChartData","options","chartOptions","count","channel","style","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","size","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","ref","accept","onChange","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","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","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","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","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","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","hashBuffer","crypto","subtle","digest","hashArray","Uint8Array","padStart","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","components","newest","oldest","channelColors","typeColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","computed","stats","aggregatedStats","mappedStatus","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","$refs","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","$nextTick","isOpen","toggleDropdown","modelValue","displayLabel","selectOption","$slots","placeholder","emits","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_dialog","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","channelType","getChannelIcon","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","confirmAddChannel","model","newChannel","rules","addRules","onChannelTypeChange","addableChannels","ch","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","currentChannelIndex","pattern","quotaStats","iconMap","telegram","cfr2","s3","discord","huggingface","card","currentTarget","refKey","glowEl","icons","showLength","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","newName","currentIndex","isFixedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","adminPassword","handleAdminPassInput","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","circle","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","dialogWidth","createToken","newToken","tokenRules","showEditTokenDialog","updateToken","editingToken","showTokenResultDialog","createdToken","append","copyToken","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","results","isValid","every","auth","upload","access","groupedSettings","categoryGroup","categoryName","setting","currentUploadChannel","currentChannelList","clearable","availableChannels","category","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","fetchAvailableChannels","axios","telemetry","randomImageAPI","allowedDir","publicBrowse","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","webDAV","username","password","uploadChannel","webdavChannelList","channelName","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 +{"version":3,"file":"js/925.2ee8e454.js","mappings":"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","sources":["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/./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?5740","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?9b56","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/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?535e","webpack://sanyue_imghub/./src/components/CustomSelect.vue?b677","webpack://sanyue_imghub/./src/components/CustomSelect.vue","webpack://sanyue_imghub/./src/components/CustomSelect.vue?9326","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?2dac","webpack://sanyue_imghub/./src/components/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?5e68","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?c59c","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?fb67","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?e29e","webpack://sanyue_imghub/./src/components/SysCogPage.vue?9fa0","webpack://sanyue_imghub/./src/components/SysCogPage.vue","webpack://sanyue_imghub/./src/components/SysCogPage.vue?c23d","webpack://sanyue_imghub/./src/components/SysCogOthers.vue?a313","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":["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 };","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 key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_44 = {\n class: \"progress-header\"\n};\nconst _hoisted_45 = {\n class: \"progress-phase\"\n};\nconst _hoisted_46 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_47 = {\n class: \"progress-details\"\n};\nconst _hoisted_48 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_49 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_50 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_51 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_52 = {\n class: \"error-icon\"\n};\nconst _hoisted_53 = {\n class: \"error-content\"\n};\nconst _hoisted_54 = {\n class: \"error-message\"\n};\nconst _hoisted_55 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_56 = {\n class: \"error-actions\"\n};\nconst _hoisted_57 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_58 = {\n class: \"restore-section\"\n};\nconst _hoisted_59 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_60 = [\"src\"];\nconst _hoisted_61 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_62 = {\n class: \"file-card-header\"\n};\nconst _hoisted_63 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_64 = {\n class: \"file-name\"\n};\nconst _hoisted_65 = {\n class: \"file-meta\"\n};\nconst _hoisted_66 = [\"src\"];\nconst _hoisted_67 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_68 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_69 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_70 = {\n class: \"file-name\"\n};\nconst _hoisted_71 = {\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_progress = _resolveComponent(\"el-progress\");\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[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"文件总数\", -1)), _createElementVNode(\"div\", _hoisted_5, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[10] || (_cache[10] = _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[11] || (_cache[11] = _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[12] || (_cache[12] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"系统版本\", -1)), _createElementVNode(\"div\", _hoisted_13, \"v\" + _toDisplayString($data.version), 1), _cache[13] || (_cache[13] = _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[14] || (_cache[14] = _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[15] || (_cache[15] = _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[16] || (_cache[16] = _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[17] || (_cache[17] = _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[18] || (_cache[18] = _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[19] || (_cache[19] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"状态类型\", -1))])]), _createElementVNode(\"div\", _hoisted_35, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\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(status), 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[20] || (_cache[20] = _createElementVNode(\"span\", null, \"系统维护\", -1))]), _createElementVNode(\"div\", _hoisted_42, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_43, [_createElementVNode(\"div\", _hoisted_44, [_createElementVNode(\"span\", _hoisted_45, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_46, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_47, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_48, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _cache[21] || (_cache[21] = _createTextVNode(\" 条记录 \", -1))])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_49, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_50, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _cache[22] || (_cache[22] = _createTextVNode(\" 取消操作 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_51, [_createElementVNode(\"div\", _hoisted_52, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_53, [_createElementVNode(\"div\", _hoisted_54, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_55, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_56, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _cache[23] || (_cache[23] = _createTextVNode(\" 重试 \", -1))]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\" 关闭 \", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_57, [_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 disabled: $data.isProcessing,\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\", \"disabled\", \"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 disabled: $data.isProcessing,\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\", \"disabled\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_58, [_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 disabled: $data.isProcessing,\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\", \"disabled\", \"onClick\"])])]),\n _: 1\n })]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_59, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[5] || (_cache[5] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$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_60)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_61, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_62, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _cache[25] || (_cache[25] = _createElementVNode(\"span\", null, \"最近上传\", -1))]), _createElementVNode(\"div\", _hoisted_63, [_createElementVNode(\"div\", _hoisted_64, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_65, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$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[6] || (_cache[6] = $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[7] || (_cache[7] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_66)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_68, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _cache[26] || (_cache[26] = _createElementVNode(\"span\", null, \"最早上传\", -1))]), _createElementVNode(\"div\", _hoisted_69, [_createElementVNode(\"div\", _hoisted_70, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_71, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\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","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认 5000\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 5000;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取所有记录\r\n * 2. 按时间戳降序排序\r\n * 3. 分块上传\r\n * 4. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 4. 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/esnext.json.parse.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';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\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 isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\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 // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? '已屏蔽' : '正常';\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\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 z: 100,\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 // 预计剩余时间(Requirements 9.2)\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return '即将完成';\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return `约 ${seconds} 秒`;\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return `约 ${minutes} 分钟`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `约 ${hours} 小时 ${remainingMinutes} 分钟`;\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': '正在获取数据',\n 'sorting': '正在排序',\n 'uploading': '正在上传',\n 'finalizing': '正在完成',\n 'building': '正在构建备份',\n 'downloading': '正在生成下载',\n 'restoring_files': '正在恢复文件',\n 'restoring_settings': '正在恢复设置',\n 'completed': '已完成',\n 'retrying': '正在重试'\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\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 // 重建索引 - 使用前端辅助重建流程 (Requirements 3.6, 9.1, 9.2, 9.3, 9.4)\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning('已有操作正在进行中');\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成 (Requirement 9.4)\n this.$message.success(`索引重建完成!共处理 ${result.totalFiles.toLocaleString()} 个文件`);\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理 (Requirement 9.3)\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程 (Requirements 4.6, 9.1, 9.2, 9.3, 9.4)\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning('已有操作正在进行中');\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成 (Requirement 9.4)\n const settingsMsg = result.settingsCount > 0 ? `,${result.settingsCount} 个设置项` : '';\n this.$message.success(`备份完成!共备份 ${result.fileCount.toLocaleString()} 个文件${settingsMsg}`);\n } catch (error) {\n // 错误处理 (Requirement 9.3)\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\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 if (this.isProcessing) {\n this.$message.warning('已有操作正在进行中');\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error('备份文件格式无效,请选择有效的 JSON 文件');\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 成功完成\n this.$message.success(`恢复完成!已恢复 ${result.restoredFiles} 个文件和 ${result.restoredSettings} 个设置项`);\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n console.error('恢复数据失败:', error);\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error('恢复数据失败: ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\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 openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id, '_blank');\n },\n // 处理进度更新 (Requirements 3.6, 4.6, 9.1, 9.2)\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误 (Requirement 9.3)\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作 (Requirement 2.4)\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info('正在取消索引重建...');\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info('正在取消备份...');\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info('正在取消恢复...');\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=b126e9b2&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=b126e9b2&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-b126e9b2\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\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([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: option.icon,\n class: \"option-icon\"\n }, null, 8, [\"icon\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nexport default {\n name: 'CustomSelect',\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '' }]\n },\n placeholder: {\n type: String,\n default: '请选择'\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.placeholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=6c59d112&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=6c59d112&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-6c59d112\"]])\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, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_9 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_10 = {\n class: \"card-header\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"channel-name\"\n};\nconst _hoisted_13 = {\n class: \"card-body\"\n};\nconst _hoisted_14 = {\n class: \"card-info\"\n};\nconst _hoisted_15 = {\n class: \"info-item\"\n};\nconst _hoisted_16 = {\n class: \"info-text\"\n};\nconst _hoisted_17 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_18 = {\n class: \"info-text\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_20 = [\"title\"];\nconst _hoisted_21 = {\n class: \"info-item\"\n};\nconst _hoisted_22 = {\n class: \"info-text\"\n};\nconst _hoisted_23 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"info-item\"\n};\nconst _hoisted_26 = {\n class: \"info-text\"\n};\nconst _hoisted_27 = {\n class: \"info-item\"\n};\nconst _hoisted_28 = {\n class: \"info-text\"\n};\nconst _hoisted_29 = {\n class: \"info-item\"\n};\nconst _hoisted_30 = {\n class: \"info-text\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_32 = {\n class: \"quota-text\"\n};\nconst _hoisted_33 = {\n class: \"card-actions\"\n};\nconst _hoisted_34 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_35 = {\n class: \"form-warning\"\n};\nconst _hoisted_36 = {\n class: \"quota-label\"\n};\nconst _hoisted_37 = {\n class: \"quota-status\"\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_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[59] || (_cache[59] = _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 class: \"help-icon\"\n })]),\n _: 1\n })]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: \"筛选渠道类型\",\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _cache[60] || (_cache[60] = _createTextVNode(\" 添加渠道 \", -1))]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(channelType.value),\n class: \"group-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_cache[61] || (_cache[61] = _createElementVNode(\"span\", {\n class: \"switch-label\"\n }, \"负载均衡\", -1)), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, _toDisplayString(channel.name || '未命名渠道'), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [...(_cache[62] || (_cache[62] = [_createTextVNode(\"环境变量\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_16, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_18, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || '未设置公开链接'), 9, _hoisted_20)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_22, _toDisplayString(channel.bucketName || '未设置'), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_23, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_24)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_25, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_26, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_28, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[63] || (_cache[63] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(channel.repo || '未设置仓库'), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [...(_cache[64] || (_cache[64] = [_createTextVNode(\"私有\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_32, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _cache[65] || (_cache[65] = _createTextVNode(\"详情 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _cache[66] || (_cache[66] = _createTextVNode(\"编辑 \", -1))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _cache[67] || (_cache[67] = _createTextVNode(\"删除 \", -1))]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_9);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, \"暂无 \" + _toDisplayString(channelType.label) + \" 渠道\", 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.showAddDialog = $event),\n title: \"添加新渠道\",\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[25] || (_cache[25] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[73] || (_cache[73] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [...(_cache[74] || (_cache[74] = [_createTextVNode(\"确认添加\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $data.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道类型\",\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: \"请选择渠道类型\",\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(ch.value),\n class: \"select-option-icon\"\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString(ch.label), 1)]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"渠道名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: \"请输入渠道名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Bot Token\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Chat ID\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: \"可选,例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: \"Endpoint\",\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: \"例如: https://s3.us-east-005.backblazeb2.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"CDN 域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: \"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com\"\n }, null, 8, [\"modelValue\"]), _cache[68] || (_cache[68] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本\", -1))]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: \"请输入存储桶名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: \"默认填写 auto\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入访问密钥 ID\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入机密访问密钥\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"路径风格\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"]), _cache[69] || (_cache[69] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"使用 OpenList 时需开启\", -1))]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"停用阈值 (%)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Bot Token\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Channel ID\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: \"可选,例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Nitro 会员\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"]), _cache[70] || (_cache[70] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"会员单文件限制 25MB,否则为 10MB\", -1))]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_35, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _cache[71] || (_cache[71] = _createTextVNode(\" Discord 有接口频率限制,不建议将其用作大规模并发场景 \", -1))])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: \"仓库名\",\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: \"格式: username/repo-name\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Access Token\",\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: \"请输入 Access Token\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"私有仓库\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"]), _cache[72] || (_cache[72] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"私有仓库限制 100GB\", -1))]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.showDetailDialog = $event),\n title: '渠道详情 - ' + ($data.currentChannel?.name || ''),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[27] || (_cache[27] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[77] || (_cache[77] = [_createTextVNode(\"关闭\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"编辑\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: \"渠道名称\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"渠道类型\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"状态\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? '已启用' : '已禁用'), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: \"配置来源\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [...(_cache[75] || (_cache[75] = [_createTextVNode(\"环境变量\", -1)]))]),\n _: 1\n })]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"Bot Token\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"Chat ID\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || '未设置'), 1)]),\n _: 1\n })], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: \"公开访问链接\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || '未设置',\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n })) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"Endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"CDN 域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || '未设置',\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"存储桶名称\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"存储桶区域\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"路径风格\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? '是' : '否'), 1)]),\n _: 1\n })], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"Bot Token\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"Channel ID\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"代理域名\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || '未设置'), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"Nitro 会员\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? '是' : '否'), 1)]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"仓库名\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"私有仓库\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? '是' : '否'), 1)]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, {\n label: \"停用阈值\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_36, [_cache[76] || (_cache[76] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_37, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.showEditDialog = $event),\n title: '编辑渠道 - ' + ($data.editChannel?.name || ''),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[57] || (_cache[57] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[80] || (_cache[80] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [...(_cache[81] || (_cache[81] = [_createTextVNode(\"保存修改\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $data.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editChannel.name = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"启用渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\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.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: \"公开访问链接\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[34] || (_cache[34] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[36] || (_cache[36] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"停用阈值 (%)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: \"Endpoint\",\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"CDN 域名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: \"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com\"\n }, null, 8, [\"modelValue\"]), _cache[79] || (_cache[79] = _createElementVNode(\"span\", {\n class: \"form-tip\"\n }, \"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本\", -1))]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"路径风格\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[45] || (_cache[45] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"容量限制\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[47] || (_cache[47] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"停用阈值 (%)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\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.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Nitro 会员\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: \"仓库名\",\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"Access Token\",\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"私有仓库\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[56] || (_cache[56] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_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.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.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport CustomSelect from '@/components/CustomSelect.vue';\nexport default {\n components: {\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }],\n // 可添加的渠道类型(排除 cfr2,因为只能通过绑定 R2 或 S3 添加)\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false\n },\n // 添加表单验证规则\n addRules: {\n type: [{\n required: true,\n message: '请选择渠道类型',\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: '请输入渠道名称',\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: '渠道名称只能包含中英文、数字、下划线和横线',\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 channelId: [{\n required: true,\n message: '请输入 Channel ID',\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 repo: [{\n required: true,\n message: '请输入仓库名',\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: '请输入 Access Token',\n trigger: 'blur'\n }]\n },\n // 编辑表单验证规则\n editRules: {\n name: [{\n required: true,\n message: '请输入渠道名称',\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: '渠道名称只能包含中英文、数字、下划线和横线',\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 channelId: [{\n required: true,\n message: '请输入 Channel ID',\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 repo: [{\n required: true,\n message: '请输入仓库名',\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: '请输入 Access Token',\n trigger: 'blur'\n }]\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n const iconMap = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot'\n };\n return [{\n value: '',\n label: '全部类型'\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n icon: iconMap[ch.value] || 'server'\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n // 获取渠道图标\n getChannelIcon(type) {\n const icons = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot'\n };\n return icons[type] || 'server';\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return '未设置';\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning('该名称为系统保留名称,请使用其他名称');\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning('该类型下已存在同名渠道,请使用其他名称');\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const newName = this.editChannel.name;\n const currentIndex = this.currentChannelIndex;\n const isFixedChannel = this.editChannel.fixed;\n\n // 非环境变量渠道才检查名称\n if (!isFixedChannel) {\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env'];\n if (reservedNames.includes(newName)) {\n this.$message.warning('该名称为系统保留名称,请使用其他名称');\n return;\n }\n\n // 检查名称是否与其他渠道重复(排除当前编辑的渠道)\n const isDuplicate = settings.channels.some((ch, idx) => idx !== currentIndex && ch.name === newName);\n if (isDuplicate) {\n this.$message.warning('该类型下已存在同名渠道,请使用其他名称');\n return;\n }\n }\n settings.channels[this.currentChannelIndex] = {\n ...this.editChannel\n };\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning('环境变量配置的渠道无法删除');\n return;\n }\n this.$confirm('确定要删除该渠道吗?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings\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 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 // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\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=89234e52&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=89234e52&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-89234e52\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-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([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? '保存中' : '保存'), 1)], 2);\n}","export default {\n name: 'FloatingSaveButton',\n props: {\n loading: {\n type: Boolean,\n default: false\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=26e68e9c&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=26e68e9c&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-26e68e9c\"]])\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: \"dialog-footer\"\n};\nconst _hoisted_16 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_17 = {\n class: \"token-result\"\n};\nconst _hoisted_18 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_19 = {\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_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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\"])]), _createVNode(_component_FloatingSaveButton, {\n onClick: $options.saveSettings\n }, null, 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_15, [_createVNode(_component_el_button, {\n onClick: _cache[14] || (_cache[14] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[39] || (_cache[39] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [...(_cache[40] || (_cache[40] = [_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[36] || (_cache[36] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[37] || (_cache[37] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[38] || (_cache[38] = [_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_16, [_createVNode(_component_el_button, {\n onClick: _cache[18] || (_cache[18] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[44] || (_cache[44] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [...(_cache[45] || (_cache[45] = [_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[41] || (_cache[41] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[42] || (_cache[42] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[43] || (_cache[43] = [_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_19, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[21] || (_cache[21] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[48] || (_cache[48] = [_createTextVNode(\"我已保存\", -1)]))]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"p\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[46] || (_cache[46] = _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[47] || (_cache[47] = [_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';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\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=63b9b06c&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=63b9b06c&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-63b9b06c\"]])\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};\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_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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 === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: \"请先选择上传渠道\",\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\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: 3,\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)), _createVNode(_component_FloatingSaveButton, {\n onClick: $options.saveSettings\n }, null, 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.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: false,\n // 可用渠道列表\n availableChannels: {}\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 currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\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 async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\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=7b8c65e5&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=7b8c65e5&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-7b8c65e5\"]])\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, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, 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: \"first-title\"\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_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[13] || (_cache[13] = _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[14] || (_cache[14] = _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[15] || (_cache[15] = _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[16] || (_cache[16] = _createTextVNode(\"访客图库 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)\",\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.publicBrowse,\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.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"开放目录\", -1)), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [...(_cache[17] || (_cache[17] = [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n }\n }, [_createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, [_createElementVNode(\"b\", null, \"允许公开浏览的目录,多个目录用逗号分隔\")]), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, \"示例:wallpaper,photos,album\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\",\n \"color\": \"#909399\"\n }\n }, \"支持子目录:2026/lucky,2026/rich\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0\",\n \"color\": \"#67c23a\"\n }\n }, \"访问链接:https://你的域名/browse/2026/lucky\")], -1)]))]),\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.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_cache[19] || (_cache[19] = _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[5] || (_cache[5] = $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[6] || (_cache[6] = $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[7] || (_cache[7] = $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_7, [_cache[20] || (_cache[20] = _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[8] || (_cache[8] = $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[9] || (_cache[9] = $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[10] || (_cache[10] = $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 }), _createVNode(_component_el_form_item, {\n label: \"上传渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: \"默认渠道\",\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"指定渠道名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: \"自动选择\",\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n onClick: $options.saveSettings\n }, null, 8, [\"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: false\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\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 async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\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 this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=0c6af1f8&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=0c6af1f8&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-0c6af1f8\"]])\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=4cdf1dc2&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=4cdf1dc2&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-4cdf1dc2\"]])\n\nexport default __exports__"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","toPrimitive","t","r","e","i","call","TypeError","String","Number","toPropertyKey","_defineProperty","Object","defineProperty","value","enumerable","configurable","writable","_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","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","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_component_Doughnut","_component_el_progress","_component_el_button","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","keys","channelStats","length","channelChartData","options","chartOptions","count","channel","style","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","size","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","ref","accept","onChange","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","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","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","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","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","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","hashBuffer","crypto","subtle","digest","hashArray","Uint8Array","padStart","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","components","newest","oldest","channelColors","typeColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","computed","stats","aggregatedStats","mappedStatus","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","$refs","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","$nextTick","isOpen","toggleDropdown","modelValue","displayLabel","selectOption","$slots","placeholder","emits","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_dialog","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","channelType","getChannelIcon","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","confirmAddChannel","model","newChannel","rules","addRules","onChannelTypeChange","addableChannels","ch","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","currentChannelIndex","pattern","quotaStats","iconMap","telegram","cfr2","s3","discord","huggingface","card","currentTarget","refKey","glowEl","icons","showLength","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","newName","currentIndex","isFixedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","adminPassword","handleAdminPassInput","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","circle","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","dialogWidth","createToken","newToken","tokenRules","showEditTokenDialog","updateToken","editingToken","showTokenResultDialog","createdToken","append","copyToken","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","results","isValid","every","auth","upload","access","groupedSettings","categoryGroup","categoryName","setting","currentUploadChannel","currentChannelList","clearable","availableChannels","category","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","fetchAvailableChannels","axios","telemetry","randomImageAPI","allowedDir","publicBrowse","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","webDAV","username","password","uploadChannel","webdavChannelList","channelName","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/925.2ee8e454.js.map.gz b/js/925.2ee8e454.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..cbab65a3aeaf23ab223bb9afe7a4c526a7190067 GIT binary patch literal 327772 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 z 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 JuWPD{69Aa*RDl2h literal 0 HcmV?d00001 diff --git a/js/app.98eb0a2b.js b/js/app.0ada2a3c.js similarity index 95% rename from js/app.98eb0a2b.js rename to js/app.0ada2a3c.js index befaab7..73c52d2 100644 --- a/js/app.98eb0a2b.js +++ b/js/app.0ada2a3c.js @@ -1,2 +1,2 @@ -(function(){"use strict";var e={457:function(e,t,o){o(4114);var n=o(4373),r=o(4570),a=o.n(r),s=o(6915),i=o(1219);const l=n.A.create({baseURL:"/"});l.interceptors.request.use(e=>{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},2885: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),c=o(6768);function u(e,t,o,n,r,a){const s=(0,c.g2)("router-view");return(0,c.uX)(),(0,c.Wv)(s)}var d=o(8401),m=o(3785),p={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,d.L8)(["userConfig","useDarkMode"])},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{useDarkMode(){this.setSiteIcon()}},methods:{initOverlayScrollbars(){try{if(m.ae.valid(document.body))return void(this.osInstance=(0,m.ae)(document.body));this.osInstance=(0,m.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)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const t=document.querySelector(".el-image-viewer__wrapper");t?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})},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)(p,[["render",u]]);var g=h,b=o(6915),v=o(5507),y=o(7477);o(1862),o(635);s.Yv.add(i.X7I);const C=(0,n.Ef)(g),k=(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(v.A.state.cusDarkMode&&null!==v.A.state.useDarkMode)t=v.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}v.A.commit("setUseDarkMode",t)}t?e.classList.add("dark"):e.classList.remove("dark")},w=e=>{const t=document.documentElement;e?t.classList.add("dark"):t.classList.remove("dark")},U=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)};v.A.dispatch("fetchUserConfig").then(()=>{A(),U(v.A.getters.userConfig),S(v.A.state.useDarkMode,v.A.getters.userConfig),v.A.subscribe((e,t)=>{"setUseDarkMode"===e.type&&v.A.state.cusDarkMode&&(w(t.useDarkMode),S(t.useDarkMode,v.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),S(v.A.state.useDarkMode,v.A.getters.userConfig))}),C.use(v.A).use(b.A).use(a.A).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),C.use(v.A).use(b.A).use(a.A).use(k).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:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,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,storeChannelName:e=>e.storeChannelName,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},setStoreChannelName(e,t){e.storeChannelName=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 c=(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()},u=(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(275),o.e(600),o.e(969)]).then(o.bind(o,9977)),beforeEnter:u},{path:"/login",name:"login",component:()=>Promise.all([o.e(600),o.e(100)]).then(o.bind(o,2560))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([o.e(275),o.e(456),o.e(488)]).then(o.bind(o,4280)),beforeEnter:c},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([o.e(275),o.e(456),o.e(119),o.e(419)]).then(o.bind(o,8419)),beforeEnter:c},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([o.e(275),o.e(456),o.e(119),o.e(157)]).then(o.bind(o,1157)),beforeEnter:c},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([o.e(600),o.e(214)]).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:"/browse/:dir*",name:"publicBrowse",component:()=>o.e(667).then(o.bind(o,9667))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>o.e(226).then(o.bind(o,8226))}],m=(0,n.aE)({history:(0,n.LA)("/"),routes:d});t.A=m}},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(u=0;u=a)&&Object.keys(o.O).every(function(e){return o.O[e](n[l])})?n.splice(l--,1):(i=!1,a0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[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+"."+{100:"d7a2e066",157:"4b1645b7",214:"e7ecaacc",226:"f737e39a",419:"714823b1",456:"bfb68f0d",488:"c52f99c6",600:"3d796c41",667:"bbd60d43",845:"1bb9a557",917:"833cbf86",969:"2a9b59ff"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{100:"07b87787",119:"2a856832",157:"6f29c6ed",214:"07b87787",226:"6548e7b4",275:"bf4b380e",419:"605c1f2d",488:"085a2879",667:"a3c83e09",845:"6b45e8e3",917:"8529ad1e",969:"d96a182f"}[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 c=document.getElementsByTagName("script"),u=0;u{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},2885: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),c=o(6768);function u(e,t,o,n,r,a){const s=(0,c.g2)("router-view");return(0,c.uX)(),(0,c.Wv)(s)}var d=o(8401),m=o(3785),p={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,d.L8)(["userConfig","useDarkMode"])},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{useDarkMode(){this.setSiteIcon()}},methods:{initOverlayScrollbars(){try{if(m.ae.valid(document.body))return void(this.osInstance=(0,m.ae)(document.body));this.osInstance=(0,m.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)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const t=document.querySelector(".el-image-viewer__wrapper");t?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})},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)(p,[["render",u]]);var g=h,b=o(6915),v=o(5507),y=o(7477);o(1862),o(635);s.Yv.add(i.X7I);const C=(0,n.Ef)(g),k=(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(v.A.state.cusDarkMode&&null!==v.A.state.useDarkMode)t=v.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}v.A.commit("setUseDarkMode",t)}t?e.classList.add("dark"):e.classList.remove("dark")},w=e=>{const t=document.documentElement;e?t.classList.add("dark"):t.classList.remove("dark")},U=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)};v.A.dispatch("fetchUserConfig").then(()=>{A(),U(v.A.getters.userConfig),S(v.A.state.useDarkMode,v.A.getters.userConfig),v.A.subscribe((e,t)=>{"setUseDarkMode"===e.type&&v.A.state.cusDarkMode&&(w(t.useDarkMode),S(t.useDarkMode,v.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),S(v.A.state.useDarkMode,v.A.getters.userConfig))}),C.use(v.A).use(b.A).use(a.A).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),C.use(v.A).use(b.A).use(a.A).use(k).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:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,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,storeChannelName:e=>e.storeChannelName,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},setStoreChannelName(e,t){e.storeChannelName=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 c=(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()},u=(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(275),o.e(600),o.e(969)]).then(o.bind(o,9977)),beforeEnter:u},{path:"/login",name:"login",component:()=>Promise.all([o.e(600),o.e(100)]).then(o.bind(o,2560))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([o.e(275),o.e(456),o.e(488)]).then(o.bind(o,4280)),beforeEnter:c},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([o.e(275),o.e(456),o.e(119),o.e(419)]).then(o.bind(o,8419)),beforeEnter:c},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([o.e(275),o.e(456),o.e(119),o.e(925)]).then(o.bind(o,1925)),beforeEnter:c},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([o.e(600),o.e(214)]).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:"/browse/:dir*",name:"publicBrowse",component:()=>o.e(667).then(o.bind(o,9667))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>o.e(226).then(o.bind(o,8226))}],m=(0,n.aE)({history:(0,n.LA)("/"),routes:d});t.A=m}},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(u=0;u=a)&&Object.keys(o.O).every(function(e){return o.O[e](n[l])})?n.splice(l--,1):(i=!1,a0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[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+"."+{100:"d7a2e066",214:"e7ecaacc",226:"f737e39a",419:"714823b1",456:"bfb68f0d",488:"c52f99c6",600:"3d796c41",667:"bbd60d43",845:"1bb9a557",917:"833cbf86",925:"2ee8e454",969:"2a9b59ff"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{100:"07b87787",119:"2a856832",214:"07b87787",226:"6548e7b4",275:"bf4b380e",419:"605c1f2d",488:"085a2879",667:"a3c83e09",845:"6b45e8e3",917:"8529ad1e",925:"b22712db",969:"d96a182f"}[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 c=document.getElementsByTagName("script"),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 J#_CBm0028ZD1`t3 diff --git a/js/app.98eb0a2b.js.map b/js/app.0ada2a3c.js.map similarity index 98% rename from js/app.98eb0a2b.js.map rename to js/app.0ada2a3c.js.map index 2ccf52c..86d1de9 100644 --- a/js/app.98eb0a2b.js.map +++ b/js/app.0ada2a3c.js.map @@ -1 +1 @@ -{"version":3,"file":"js/app.98eb0a2b.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/App.vue?eaa6","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 data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode'])\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\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 this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = 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 setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\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=7df82a17\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\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: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\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 storeChannelName: state => state.storeChannelName,\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 setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\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: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.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 + \".\" + {\"100\":\"d7a2e066\",\"157\":\"4b1645b7\",\"214\":\"e7ecaacc\",\"226\":\"f737e39a\",\"419\":\"714823b1\",\"456\":\"bfb68f0d\",\"488\":\"c52f99c6\",\"600\":\"3d796c41\",\"667\":\"bbd60d43\",\"845\":\"1bb9a557\",\"917\":\"833cbf86\",\"969\":\"2a9b59ff\"}[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 + \".\" + {\"100\":\"07b87787\",\"119\":\"2a856832\",\"157\":\"6f29c6ed\",\"214\":\"07b87787\",\"226\":\"6548e7b4\",\"275\":\"bf4b380e\",\"419\":\"605c1f2d\",\"488\":\"085a2879\",\"667\":\"a3c83e09\",\"845\":\"6b45e8e3\",\"917\":\"8529ad1e\",\"969\":\"d96a182f\"}[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 = {\"100\":1,\"119\":1,\"157\":1,\"214\":1,\"226\":1,\"275\":1,\"419\":1,\"488\":1,\"667\":1,\"845\":1,\"917\":1,\"969\":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(!/^(119|275)$/.test(chunkId)) {\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} else installedChunks[chunkId] = 0;\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__(2885); })\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","data","osInstance","imageViewerObserver","computed","mounted","this","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","useDarkMode","setSiteIcon","methods","valid","document","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","console","log","MutationObserver","mutations","imageViewer","querySelector","options","observe","childList","subtree","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","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","setUserConfig","setBingWallPapers","setCredentials","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","get","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","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","test","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.0ada2a3c.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/App.vue?eaa6","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 data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode'])\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\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 this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = 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 setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\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=7df82a17\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\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: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\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 storeChannelName: state => state.storeChannelName,\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 setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\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: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.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 + \".\" + {\"100\":\"d7a2e066\",\"214\":\"e7ecaacc\",\"226\":\"f737e39a\",\"419\":\"714823b1\",\"456\":\"bfb68f0d\",\"488\":\"c52f99c6\",\"600\":\"3d796c41\",\"667\":\"bbd60d43\",\"845\":\"1bb9a557\",\"917\":\"833cbf86\",\"925\":\"2ee8e454\",\"969\":\"2a9b59ff\"}[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 + \".\" + {\"100\":\"07b87787\",\"119\":\"2a856832\",\"214\":\"07b87787\",\"226\":\"6548e7b4\",\"275\":\"bf4b380e\",\"419\":\"605c1f2d\",\"488\":\"085a2879\",\"667\":\"a3c83e09\",\"845\":\"6b45e8e3\",\"917\":\"8529ad1e\",\"925\":\"b22712db\",\"969\":\"d96a182f\"}[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 = {\"100\":1,\"119\":1,\"214\":1,\"226\":1,\"275\":1,\"419\":1,\"488\":1,\"667\":1,\"845\":1,\"917\":1,\"925\":1,\"969\":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(!/^(119|275)$/.test(chunkId)) {\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} else installedChunks[chunkId] = 0;\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__(2885); })\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","data","osInstance","imageViewerObserver","computed","mounted","this","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","useDarkMode","setSiteIcon","methods","valid","document","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","console","log","MutationObserver","mutations","imageViewer","querySelector","options","observe","childList","subtree","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","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","setUserConfig","setBingWallPapers","setCredentials","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","get","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","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","test","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.0ada2a3c.js.map.gz b/js/app.0ada2a3c.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..a7f4a2bfda900462dbcf6e60bb2f358fe4372ebf GIT binary patch literal 16002 zcmV-|K7GL-iwFP!000023eA0McjLy9=wCs&IVS0WNWGs?5&(oKj--(^99c6S&7A|1 zO%W0ZZ~#y*Tj$t&<}lo133db8XvUx%u2)P_}x#(x}z4#;u8FX)nmB zxvtgg+3s$To6p(H+M1@WY4BfD)3y!xuZDlG8S1*Gt*eG+OzDQYscCjaUDIlAWf_|5 zHPzBI3mY~KwWb*pI{afAYE{!}h+^FUm?oe&&~X%lk5a=?YMORWy{8!`dIbwzZ1$P?=_Q^tG5<>xR0bX)Efs zW^UX{5VoS##&mT>wQI(Sv5rJ-@*bw($mYO**MW`3ScP+~s%ghMpxxJD=)DTbW*fM> zsc9C_VDt>tP!DwjDK$)FvO#~YaY?Qk(C41Iq8ZN`s;6t(BVAq5%o80DXfR)G3tEve z+o}N=P=>aynPnY@MVzKd6E=`f(4$eo2c~+cYsTsl{-~;xx@O)%+<=Cpp1Bmf-kh?h}sENo1s`*?t5Pnm&G-Cs>EukLN0c-;>YTAaFzG8 z0GLhJQ159K?ODWk6ZFj@4l@q3uC0`f;ms?c2L=d(Gu6x+L$Dm zDTB0i)BycPC7GxI<|PuzA+YOEM|mzwatL%pKB3$_lkX{yt@ zW*it5SYPIZ9ifU%a!cr-V3XbaliI zjJZo%0&Hmzqd@(Rh)>9bW6)4-R}TqKUoc8NHo;(2kVht$Q&rQ@^w4TCT#1j{6NF%r z^Knx%9K#^oGXqTrh6znjP??z0UvaA&FJX}V;S`5o@TViXc4dD zV!DBIs;|JK^$BX3Bo)O~eh=no%owYPxOy>|Q@M$QnZv=lx@PWGHZB|V-j&9@ccmdM z&2%dcNw+Hu7_{F(YpZi>d3!G_Tha&1;(3z>T_A zBNI)=-iUgG9@b#XS`&NG3L5QZ755e+QeI=sxFaDlIcQa@@l74KK~D#IjZoU>o4pFo z_)!Jz;fx+lu6h#zX#DFAX$LRbYEKFh+$YX8^!Zp{^QQby=-y6^+Bz z_^fb^?;4u6YvAraRskuJ^=@zp0zOXb3R-LvcXHrCRo&K%J^dNPSx1@Sav~=HZ4$`Z z)NV_(ZP9KGCSqT|3rgc65PC_5hM4a)k-HPbBz03W$8<|-IO6VDU8|M#V%`=8o7v=wqqw+Rkrp>=ic6R&{$LQuOZh#LjfkUDkIv)w!aw8oqspe$KO z&tCqTHC`Fgxf)gixtFJt=>vsCq+31EN27xDIl4zOMC8+;mxJc03H!sjOMsQOq^!FZ|myFevNBPLmw7|fFMz3;ge$G+-Wqfvw{`%T9 zAET}wn#SC62UVGw>D>=a_K7~G$H#;NJwD#-S5$_3Fm90sIq+~!;Rl*6&1f0wJ}N4} zxVphR7}ye^wMP5t=mwrFY?PO=r<-WHEcBuqRoq&4b(oOR(Q7DZ20NU&r?22I4@crPHPAZ37HYRkz;R(5M91o~v&hRO@X;Oy;J_XB;X4I)jtCHW>I-G+{l|g8k_Y4zDD|b ztO5{rFhE(+$C#!?LEZNCkot{dzXP4NOVSSRBp5vCKwC2PV+Yi2k}sGkJ=PqpsnMBF z^kSmdu6{(_rupib(PNd;n8pK8yqgzM`A9#ZezQ7lb91_+ZRpZs^h@-V=QoC2Tn9sh z0S>JSX2|qRJSyuGl~^@3Myj#ynRwI`(TztDx{Z%=;ex}*jiUV#GVtPXAt%5>m4+y>&NKiPl4*kO0NYpc~0zMl5KnD1(V-1 z_~dDUX!~5_`1JS4C0$Q&(;-q04bqk)BVI%)Z5h`Svv)6|q$4Py1*h5iflNt8 z*CRTnDx`js6=`=*sGnVvdiiD?vf~~juDWEGM`nVDA$97Tq#3O88uy>!1YkPIJapJ7bhtLRgz;a! zB{?29R_GkjMN8(=(0r?zLl>ZqTMHg_cyy|x%h4%1?9Sj!T2fT%7zlc_LZ?cksD~7d zU6G=`4hoM1S?)?iiME0#)Cs*?rISjx5=WzJc+Q#8d5{zj#(f>4t_ZXRJX{NnqZOq5 zm_{OF#k>l~P^D-9w5*62m1c|*2`4KwI+9P%#36GHc5K8|Ghx1UbR`-FKXGnq+Sbep za*6uY=*V)LQ?{v9kMtuh0NTd(QGe$2nDy@RC9DU%uva6!xWf$w{x*dJ9r<7D>hzLv zQhPQ&mWh)eQ7wYo@#&8=q&cGxI~UvnzsE2_+!rLfhmrqU_kUe3S{qt8*AJGqPi%- zHV#lbScP-rE%H}ks6(C~sB5O9`_*AV0CG9YdKZLa7$GV3B&zww(duBn0rC)f9~)Ls zs62GJ3qdrX$S@(Uv|_H)LMB<Eri-jns@28_h%u($Qn$70lDeW+4S%_YOLSbPkg%y$ zJ5qN~#}wIA94plro|KPubQGr0B0thQc&^^lZQL`L(Y9zjRJEy9eW`zaHSUjx=IUO> z6gCi(YU_8^b!}NQi2#hvZei?cg)*`ggr@AICOrX@S?!rM{scBL^#jdl4`2k z#)*DJBvonoRyCu2o4|1C)nXP<0(494BUQ}^af7WQG0Um}(bfnR!;RZTTqJA2--F!vNvJARdPHrcD8ae^?VP{_S*Jp^0|oto0~vPwZ^$?V%{&4 ziZ!GH4So+d!MkV|1C%)Wb)Zl_1*#`0<3)fT=C8HtJz>qX`dp3tUVuGbmKbR|*s|i) zVq!60-dQ0swz1DLF{7rLzFvt)za#AnO{ARxRaML?YSk5z9T-UrfY+Od>lWd{lNSnx z1b-JSpgDnxdMl{Xf@pAe%*4IOfLL6V+y~3+>l><}-84u|w1~0;9<`3-o)Rr`9Hx4k zPg^{w;#1_%7Sa$wWI!8!Rc^)gv6|3EQ#*v|-uP8733CQeCEc2Xyvt zBbm3f6J72@WF8S^qe$(E5i>W$bM=+M*r!_@+pHqaO!?AwO?Bya_5dVIuV#ni$6B%Su?y6Mc_c%zZ<)AjEwbd~98I z*2k8z7M4w#T@|ShZbP=_a6d1b$nzu#<``PYmC2htcv}T=a*pE(w5Az1IrToLF_36P zPqV`-1=fU3-J<;lr&puBNZbDJ`wN7D%WWIBtdk9-e_3-m{e9e{sHO&4bHM3e7onuT z9s1WaV~ps(8PR{p`M=H2z}hIqc-pwuj&;7+Ag+lU3Te<3dZ?Qe*1kolji!dn-snh& zD@ec^x5=6#+Pj^bfZ&n9y9Q|+vUG;F0YNmC8QPIPTb0)ksfWeWUYJ{i?!6WK=g|tU zN#YSDP~%4i2d3;JAPuXrk+j5WfhaH?r=gDL2qLef(Uo}I4jPjc^eD8o2{iVgdyE^nv8=Bl32;Ja zoN%FxVl~`>j!D4v&4|$YgbZLhl>`9BhVDl6RyFgeLbR?=P(~BWrCJHOt)qh2OBCEi z&hcbdYzwja!1Rr~6dFU_ycT=G)%^Z5ddmc8j(m?03(RlVAipq0^GzcICEB9PKv$8zeEehQxQV zg6X6ZF2&)<3QzFr5Nx|a%%z0Xv_X|JE23ZsT?Mx~MWr#T#4!jz+@&z(^b$RSiqN|= z1l6Hu;~3ApJ3$Y7WCeHO1Y~h5QT^8&Uusm7-pW?5$ZgrZxr_q75fHvllyqMr~8l zgqd3u^+YJFtl@j#HmUX8Mr!ZdgnEv_y)Q5csc)t>zYayB`;<$l5L9T=+4hi3F75bb znimO{D*vKqo0>rh9){sp-r7N5^;owt*_b#LIl~!)PmTke;N*_7CuiYN05<(yBa>*D2{!sNq$!6r*?C64+2|REyo$+8*uTA7{OAYdPNSkQSzkDJkMMLc zX7o9MNh65+#!+Mgp(Y%sgN3;@8v_Is2d8KZ&|JMWv6ML8j917d0g_KD@fl~2lg9x^51sz|{(>MFg@U?}_N|JN#Co_+6`!}Gwi;#)Yns+Eh-&^++t;ZoaBB>K!pblV z!1q37c_?*QcWR>0-#9WyR}+xH*s?ClkilM5HS?}&X_fWkiUf&CLPONAtA;jVjvKfw zu1t^uQR0z`IebY}b4gLP;(eWpO;J+j7$KoKKGMreiG%tsw;mHjG*uJr!cTC|9n3w2 zRenaQY1)B~u6Y%`WL%%d(pW`i7}{;xmf>v;tht9xmQ3RejB~7abZI1hPCG$9m>qf5 z;5o8(RL@>v+SVhk#VKT<79b!J(JQZzN%2wsv(Wtsfm2OyeLmh`Sfn$ z!M#_RSSQ~S1%)YyXXzYAZw6p-q(Mb7)w#+r-oq)|n5+y=#<)vdpF~w1)d%DQajMGf z3Qw0AJXNdJ+QKWS;fb~`vMuBrfHpyd>G-C225Cogmf~B!ak0OEd7NIQvr6?Cbutlj zNZK=pI0@t^ZK1_lny6DwUvd)~l&e{ru1Y>Z3V<2f z;hKD$HN{C5W!l8R1(ikM{ERtJy6R1I7esu3Vy9b)^(2h0hbl57>#xb{wyHkWx9uYf z`qHUsQlG=9KpCXCQadI#W2kEN8H&DbQ$CHNv-%C3cC&mtdgkh+u3MeDcvh{^RBQMu z2eE^q(zBGPjDlcv-noIwa6~Ug?dtbL@Ezl5hEERi39|nlx=F^f2Z@k`Nh`q$0mkr+ ziWJ&6abKc-+C7XrRC%O;wx>Fx=fwcCeVsg;~u_3R|$CC^;Dh0u=PQ}B*;pzN&gsXRjnDl zrGur|>k9Ols-PU|D2|q*)2ty9UOdozgPS^9ov__6(=kKF0kik2s+m)Bf!Ft&EXd8@ z&mFQx&uZ?^m&<|W9{1TpySv-zH_D}Q;5WOrB0PFYN(C)Hw zv(tC?700t$taY7kUbkn3$}S6)7HeC5Csf!`&-24;;ApY7?J}k3dp+id$ABzkesB#8 z%nkZJQ*aK~=mu2pSqE0o^zB|q-4%EN*0s9qns~alYmYR8;B#PcyoTjmqeI6E)(_nc z!M32|`C-R$uOmK?w?fmuMz5~5&lH$l(6gFM@fv%qd7b{fe#5bw8&=r4j-~|xs;BMl zUZdAu;JG~|R_?3y4noTh`@P(Q$Xpqo8!|Tpt7UgVzZEo0O569kN*@2tFYNd`E^lpm z-oDL5`$3xq?~fO}3coi!E&)-F>{IXH7zm$~6c&*=wwfQA2;%gWg+ zKRNs8&q&ePyFdHnKfevno1PnlitPrW-OqAti&b@ zf)aBNO1IW4=0o$=Gs@!PqLT0VUaQ{>ZO_dsUsLksyfUxk%T~|MtAOLQxFAvT8h zfB*OA-~RRaE5AMa@jEylPC?0bL*_SGFZBGN+ZKOz_R9MmX0@0vaM^7!MoI2lj7L)xVwymqEDE8Pc3D`+i|2WoGj##9Ru(SA z2BQ%f!Tq@Z0}u!QA)z`Ie@1`!EbRL(N5mmdRn9Qx`<|cV7l+^Qy{;XwlFwk7azN1? z{z(Y!?E9~u{rQb62`%V(Zop)ziD#K~h{h{W9!Z*1h|4=E=1)F+40V@6E z=vYFO(NZj7r$YY8yT5$$-iv3y{QZ+Z{OYeCzxL$44?cbQ_47A58Grrw#e|B`A}{s& zL8p)}JKnDCO6{kgU3j$bM%%EE8n)-uTx3do7I@A9GrVrkbD0||R-imgKU5X3$6Vd< zn)}!u{ZbV&8gY~Sn;WN{+(Do1g!on(9H2Qp*mSp6h}UiO7nH zI<&%OCz6T8^+FnVz{0v6vRcz~vk-Mz*zsCHglY%_C8Yjw{Dau=e_uHNr(d1_=)JS= z{rc>Ke|!AVcO%KhaKMfMyrl!nv0H_f*X)C9RBCvw<6==p&nFRUva&d+Ehz*Ga(7x2 z(xcNIH$nZ`pWk@=#ye-PystoKe0NC@7S#tbJNrv$8;y~N>Y@i4A$Fo zSjq8r3;97?0xE4=j(x&fO3-hDr`+y4&T&4*ajG<7K}EjJbA!ma@33Uq4r?i)C!rmb z{(N3l#MbX7h!?yWZiC{%%Vp*9PyXTTd;fa&lmC4D>dT-0;u}wX^UB$e-+BDjH_l)E z{@KSbl+RxJ_fLQLJMgBy_0IVVFP?wrH)pT>agdzLjE%CWxa@GikQKW8L69)CVrQ2S zDT_*^?~nS-Kdv)}!ERc}mzXnxkhrTe|KY8q$8WqtYgFzMncsMs76;c_qP@i3mqH5c0u{bkjfE=n)^y`(^1*4+aLLN9FehM_ zu_V%k^A~?{_RH7*wpo&~y06EQXj!H9_N=YcqdzV%$<2=Kv{vmP958l4zY+S3C5>D( zsI;2nO*XNB&%XEC`49hi{*ynPzwsxA9=6yDyVXZo5g55TZGs?uV4tK4WK?#`XIOQcFH_ltm>E zzw=RRf*=8s=4T8plOUiY?#5uzYLuL}#Bz*?>iDd!EGhz+d)r?t1zh8l=bu;bVCtc> zQ0lq6d1>7w$^V?l5|jH}xCV{dXPEF8HP$Er9S zHZixWbdV>J^!#_+(}kRxD?hFD-Ja9mwcQblc=B^}ptS73YJj8jbXkf+Kqw#%8I+=I z%R!$#6(0B4V#vBZ#|qg~c588_)t()<#%6YM(V3UW?T7a#fTtYG-Ccwub#&@|`dXc$ z0jYN!IT1)oW!G!5hvG;NlgCVoUvAk!Sf*~v%;_W7Y`igCCqZ{hwPTt>&an+d?M0JAj`~ZMKE7K z=(B#n%AgYY1>A<-`}pjoUrDeM3T_oQoPIDYRLvn14P_RTV~r_yDaKX~!ea-6|JUp| z((sN_ofFe^?1pdo$MGE7o*!C=EbzLl-1c1Y_egNCI|4DAR6xFM1w;D!jEw}IW4Ev? zEXjZ~?c*Puz4WW|S6?{)>8lDtfX{XQ_R9&xOP(8QgbS@f<{+S95|R0Z)ciog)Gbo* z{II-3iRT?;08CLv?f5Ir!lxnlC&?PO^k@2_*VhvwLN1J?s7OkYj;GCzk$Yw!y<~>Vd)f#q#c;Iq2{yq{`BPcKNo1>BHl>B3we!dHmKl z&R+PKvNGqdy!rSyAAS1cUn(GIIpZw|7^LKuJ_VIV+WCE@T zOcJnCvmc>_OoH4bGvG^$ix?A4rG?;7PQ$+X?Xz#a^W@$Cq*TZGTR(jA>c1sN#?j-! z7Ke=$XA^`|lpOHM2mkcxTi<>B?;kz>=$~kW^H<(H|KT4${ox;m4s~d|E$^_@g}BBV zYuQ#IU+DR)&HP}b={cT15;Q5+1Trn=iv-Gog#^mBQutDgH^qxsxUP4|g9sH!P!<=m z!8%?agALvx&^Ewv{{BDQ8c}7 z*A5H$fQ4I9=vtL%NacEDts2T0N!LqFSQK!!MEjG+cwX^BiD&ob=d1w)xRwV^nsYp` zDrIs%_xk)BoqxHkKtu#q3_z_6|<-eT&;Qg3GJ)iMI`yD%UK+y`Z zZ=YmO#EOtZrVjyx0ZsvRtWHpB-QDGWgEsl0q>(FeA!+DOBm}1_!>If$v4({F|L0;2 zoQ&(m8l99dC$t?kmL`IQV7phO64F^zr-ZCwl*q1Ndjc zlywBZHli%+a=m$eAyfP!W|x|nEY>T<7cPZO#}_W`kcuxPY#r^cEj#FeQ&GsbS=j7s z#i`s|nrAZ9|vVJW94?F>sqWcYo9E=FO15reK>VwZaJeR(HLgAVZenp{qJhiMO<*e+vo1 zv{=IQEoE;9T-(g-Ef&%OnY=u&@1tPk#O-IG4IY4<%%(D3*hNl49YZ&XDj_N0Ay=(_ zT`sXtR<9za4frfj5VBSs4_GUTz*&ynnaMOF~tt^F+*d?ikc$c(6HUzZOd^s zEEsHFx&I()YWl3jTu7D&sZRYK$YBj@Q0A39rz4+gH@x2QmhUWies^BU$E^_0@L3QD zdgM~jeh_+HAeBJomA*@5>n&9-7^T+DzD30p7Xj&(pAA4+#>+->511d`@wQo`mj!aF zCd~U5O}t~dE^`u-#%A7d%j$~KEN8dUB>2E)M;nnkR|MOozel4G;#}v@`i1+;xYxx z7nx?>G<1EYdL)~(mu{+y)Rv_ZVpXR}lNv8t=b7Ckh@n;>O=Y6_!c~^)IS6vWBFyS5 z0bIOhh7T-YE?PS238x{{VT(Cy*r@q}g_P=-2FRMLFam{450w|L%95rIaQtz+rscq% z1Qp!7EUbmBTgb~$`63>Z@`EchvEByPNaVg`uEIgS4!}z+6J{XI9H}w2qND06X-$($ z&etw6D;e^UxRze(i6i7f#>T=zJ+aCK{^Z)v7$XUwET(#7k7dN>K@22WjEqsFR?4@C zU)lI&D-&@_dX~j2sTsH>{k&)l$?7Brk{X7NCc#8QO3#MyE@8C9pwB6o#yPN@K2uJ! zIGE@LIV5;j1>v*DsSlXA)CB2a#!!RCF`ga$zFcg)C=?@{&nfxgcTKo zWf<6trzoIA3Mct=hz!$q`08Rz_q?hkBjcTzX!La093ucRz34&qSX#>9UwLBbo#G1f zk^&TxIn0bp45siFmCPhtN=j+`!{Q!;*~3K{_EIgR%}R{Y#$Q9t2H*b{Ia~~s*balt z?Jz=qnWhk3f+BgV$`YQ`OmDzNKhtkRiSevvdVjNmW4EcKqJf3y6w1S;l!jh4@Y8k2 z;-xPj;?T1B8JS-4gI62N(km&+@Ix}&7r(X=y&4Da)5u*0>%#r)vh!5TK#p{%8FNqV z!(Z_HVRtScT8`7Rc%AhCj;Iy3+QjtnKN&p+e1I4Qybx4~ehx$*r5BS@!KFT)zB*yp z3+Bt^!^1=LG+-OcD>vc+N`2o^lYLKzCxDZYB|40K`ipOzee3NffB6g5OhXjyM<1R2 z{AZ7U@`tlm-lvBg;N92GU-@1l-j6&M@AX-ZQ%JJnsZb$neQD_`E-EqN|qmmKpDARZy(!)5{nep8k%Fh2!%nhNR_hpw`up63T#%`bSV zrTlBE?u)FCcup0M5TeQon-z)=E{fLO#?YU5sdAe&mTlNFkL3W~$Y6cem0k$H^i}j> z1z&Q-*QIeoIUW7NTaVv>*GV3~`}4=&`{vm{{D{9A`|c}eum6iwP5}EhynS2kTRtdR zA@o#4t}5_4o~*v*vhvAC-$8ml`S5p7zVpG^ci%jF`FH29zf0|eG3o0kgU3=Eb-{PP z3_GB&`v8Rw3Va0~XHXfAi6Y{;3+Ua zujF+ru$v0lz5yO2w-QBx_n{3rID_veMA3ChulX!U85Urr&jRtfG;nQvbTqZv!jA79 zqQx<@UYLF{Wzqk{qPoXFg9!2s~ln=he{oV&>FTFyfrHDeL&*6<1 z^9ij`PNku^RY;|XWr9xAb#n27!H8-0Y617-ii-t`+^&3IfqYlN@HOCkX7wk1?s~$FyBNyX9GQJOO!qpP< zNnKBFvjZe?bxP5ddU`owxRQycO9pINL8swaersURjF!s>#$#{A3OYLUyof8w{qhnj z<5U%$MpC2>YrdRbBhm8EQG;+b$$}&o2Df;h3<@4(*lIs|g@8^FBER0D zZEIR^WoO*RWS~k|M;Aek;|u1`5~rUR_=5dKM^T-i_4CCVEM|!hx`gH z{w@^V@PcnQJqOo-pw|Ok;mRi)P8|GVm>oB|A|}ScfgV0A5Vjh|k=&iITviNli@_P- zMA-0Rz93~M1Y+<oM9m17bA#?Lb(UySLvO&kX@ zcn^4sC8i3%xKz4nd7N_9gC~JJm4M$~rxY^gQQUDeNGf$R#1cGwh?M5k9Eh(4FGlzb z-1YmQR#|A)AsWjW2_9|V301nOuGR`vrR}Op&$m6_4v)Fk+3kX8kMvN0D2ov^WG_b- zsJZR=1t7?VYGO`Q$zkqp*jZ3)<*Ujlc>JQ}zO9TXV-N0+KTy6Jp<7Vwk&&VV^FYGI zd+^bcF!!@3BY>l;RQO^6GQo28own^b$h(@`hWfK(1j5&u#9T&!`mbb6>BfzSHE07k z2?>%P+#eN008HCWwT{WH5`$%!@dO5mW;i&<%qNQXh~hovD-l5v#d{LPWPJ+JkWVRN zcrqIWktTTa)kR4;o_b2W%(c&sgF>dV6-(@Z`NxGwNs^0^?5dn(x=f>;pmMwg-Drb3&k znYt7W^n@-_<=60FI7V?jccf$aUC%uh)+*bQxUwZ7NIqwn5XHfiMPa<3dP>;GhYwl6 zH@UBIjTKlV)ga*eQ8nFz1?5zkzYKl>ulH~86HYRO!R_8dfO!!yn@VKMjFF?bXM?WkK>_`O05t17s>phh;Uhtg#cz~ z*>0eCu5(NquM0^eT=b>LmrLBPn$&8m)k1nKhoFXthRLGgCWSL4bq^xA6PMY#cCqBM zR=>$&W7nhZoZo`onVl0x4|Xl;SxoF&(PP@aROS8yys$(lEAdcp!g3t%5UPaneMtsa zd{Of5BA)bz^Q2rBYpw4)$Y*igaDbP%wiM4*#N7!J6L)fZL3t+!@nFKI+<@B)@X2#K zxv|mFo!tCRt~Fzgv(f44ot(Op8y}m*hiry5Evwn2hvU=uust&|!zSh|d^kBahYx4Q zCTGVd8e{ZuiXa>9#`J7^v_%hRXYpZkYP>x+*Q9}_`REg^nYroaBz2#jo}uoI*7Rs= zasnUDPEO&&u|{LgnwpxyhjU{DIXf}YY_w+y=iE3!jx#pPCZ{Ip;WW`XZp}5O=GyI@ z+^O(X9uPzL?TcTaFyVG+BM6rMD`eUXt|HXYna1qQ%q%f$Y)r6Vc4~TdVmu+~1f-Dk z^wi`mn`saS$7iOvP$wG`v!g5_{^`-F=2&|?De2MKDQkRoW-cLAYoa+j!A9p2LY;0* zPO(`wkre9G_?*=mV+o-)#>Z#I##@bqP+N1;*4XTLhESV>pxZ{Fy$`3y_!0bZdnAlbD zNMwc9Hc>%U(8{8+lS|ycJ&yt^mvJwt^UGbtx)U#1SmN5313UUNw05)Cog+^Y(*8=z za~a=9lMB#p7h=Ni_kHI9@FMkyuI&XJ#RYK}q!OK8#2qbguGYfPYIb-;0i5k2afG;E z;w9N#Cf<+^^y53$F4nf~qVs%RCYB;UGmyQ1|TzlAl|^RFM{jzTN1D zIG*3!$rTl#+;>2C2OvPKBb@OZbWqYa__izLwWtIOO2cQ?KIfk7KiloXmk2JRJ7#F| zfEA$|_M$8S7syWH!GLud+-JyD9OI;|P+Ba6PvP21*&ye<5)` z$;OdnraF|9>FH371y)u>Tudr19LGUzN!*|Xo=YnXYC|0sCS0(d&kj_D9l+flQgF#S z@a&e-WnIN#);VJ>Z2TkX__FXgbXD@7P`D^}|9){}!d=G!VLkFO8>W z5rr9$;Os^|ZqM?W8{QI^a-<*fSHJ1aQ?6|SJ0Bh5BJ^kU@_59cwksLRwp$=pEyNx- zo@CiUWS8NGfJ#I>`1FBcEEGIR%LeM0S_OJBCw|vQc}@xG9T|=!uPUMC<57UGjMJj3 zjE#?uj*il>15&zZq$F?(0hj8P`eOwkc9#}1vUk|Kz_CP9$3N-F>bV!6_xz0WUTo|6 zURpoyHav$?-4SQ;d~TT1YBKk$J!lkvv+a;!nZhgC*&RYRRlY^Afg4mg&2Tdl~s0fAv+4o z!ri-)O&2K8h9{!CGI(;~(u?X@*7GvESxOEXFUI)Epv}Zj7#!fWA<-+r0F{?ECeHOJ zc9jmk0ogbfuRTY6`1OMb@j@aL#w=%BhOR(ZIj)mF_)3YhC!L`zIwsf!&B7*>pai9E zHyqpD6^9&IJBRNDV)6^=2rF+u`$yKQZM&^(TSewcOiQvy;+B|ILUt7=T(VDD4tN^l z(A-3bW-tvNyX4~3#Ft=b?PfaPFd?wp&p)39!dqjvBowxEF>Os@ITzvq7Z(+=o)Zrv zCPvOph(eHTqnH!Q;)+~FO0K}x2T9>25&N0Ba{>mw-;@w$;hW%=PjoT zGxk@S8DGK|g`uL6k~u8rg04N~h9a4C$gd<8TY7~RrO*B(Hl?&jk>y5^|CpX6F|tVM z+;UlDZbOe(FY~N+w3`IPZ~PDr{JD2z51#m>f}fZ13SB^!%EV`EV~Y%B_bjh!w;@r?A$ zqnKDRBA!AT7l9%=wAB~mL@yfi$<2)MqI~rghlPzRu~H(XrOMEBqz<+6LUbZ0eyU2o zS|T~fkCj7_MEf|^mx^s4-&lwjIVz{?DV?q#|G>Kv!)C{JcM}hzFD}v(`UYE#gACDd zC?65&7NP0oa(ptx*BQZ`a=noEp*0mXL<5%vT~G&7E-Uv_i%u1`=Rwq$kE|-AiAR7S zx!kV3*7mNl%Fv^}Szo`kkxo2$zVtQ6*svuDs#u{l#Kd`p6zx)o@N4OL#fl|ezY!b9 zj6rdAK-i#MRz{UBv)n-0$ytuitk!Xi9%A>d&@(tZ2nj@8ntdN!F6UTGow|fWhfZYd zhb=$>e1H7GMd^Ep&XxaHVQg&f`SF>l;+M;%kOlGDObmteaLe9+@Ydc9MJCvQq1Pc{K4`Ago-0^@qFRikxA7|PZMIP!*|)tWMF#7j)tS{ zlujbNwiQTd?kj!w5DE&xdcaw&AFy`cp|;S6?{-2a$xqWJ4h``+Ejgs{U~G5SbX%-7 z{NO8T%r#fr01DZ%UqQ|b1HCU=kQZo6dSPFJF@x?44&B+udHAem*A4>P-Gz^9#xTW& zY}|0htYiH5YG?GoZ)RYk?;rBJ(;+OrD(^4!4pDS0&&#LseCkjRFCOtDIgoWj$rtlO z2joZdeDY*I9DeAzI}MmTgV!_XoUyjY9u%Ztr~JRu%8WZkLCJAg~8v>j^~>I;Ns)LPKb z3S_^p4OP>EH_2*YNqba&a!yr^mf(W;ct5o-5|k|*`b5ni9L&XNu$fC!OjI!rG5Hd> z8d06J_nGI`M76VoBvreeSqI34R8+`Xin={|S{PPy9OWX1>rqh|-d5nR{_|MIf}K_R zDF-fubzO|W;&{dNcTlkU!&YAAc_|5UfAm2im9V_j_{fpDOiRIQoQt9yJ6d_1bycjN zz(knSzP}?r(oN&ZWdb|72Umo8{&_0D9vmi0>1CM_If*rjXS)mp;2y$@?U(c)(vv_2 z8;eDr@8X{zN7D!py!4LOaDpY^ypD2UqEaaV*kTY!g$h2!3p>mgri6}-h=*Z)Ka^NN zb`H!`1Nu4Eu{hGj;*>vElPzQ^J$Zj>bn=08*1ovhxG+9DJB2A!d8fI2zzkTB7<{`O ztEcdj?fm<5IW>oGrRLNe`OP^s$G>_G`7!D9);TrDU5K2T>jwZx7kk3jXb7~I#iJY3_rx`>HmLLD1i!yR*j^1X?sk!K7P-w?@ZgOf4GzQ_}gFle! zYlcVo4;-R$YK}gj41eHh3;qE61OM_b?jdy6ca3vuj)TUZ>BDOZ2EKcT^P{i#=F}Yj z0&h;uLFE#RBtE2zoXq&@E6j4pS1Lga@@H{@sOWpOz;URCB0-4jaR{5ZNEQg9FVA8P zl4Ap5BH|3#z1A`Gkcq($&H#Ay^-~fie#lh%6TfK+=%P=U0w>}RmICYe*9&uM4&-u7 z+5%Th;$(P=zF=i@l9c#MqCi?KAy^ZHO5}DhYb}4M ziho)Mpjyz{wgT!Ak)+|@n)GCu&_>#wQ*)`$;pEiZJ_DqbX9qUXM{jVw4Se>7D{$i0 zV<12NjD)0I@ss!_d|c0-FV;0mt1q`wl^(KDd`?CDK%!i1tWa0@MoCW1i4UC6RJ(SF zTFAd>3T=*8vi7woVsF$ubqh%G{0Vjh{Wf(4*~5nj}wp~je$Gz=$SSsgXFDq5ysR;mLY|<_#=q7629KNKRt0Er7l#eWFU%UnO7D&92Le*i%DWB)vn7TR85A5ljYl z+ANzS8DNrluMPG%Vn*LVbIZ??z)lwlrnlyBkBQ%>19|dSEkVFw0q}?l-6WVj+DOr> zg_j9I*7zPB3<)Tsje<7zAes{@DbdN_Py&q+52BJc+?mCzO)xk-h^K)wgBN><^%$lH zF#{8LW*aDg|3|g>;0^Et2)a*u)VD|fP-Q!aIZ@k=9)Kt=lT%1u|BcPKubCIbfwQ;yRNcBJH++l?a>K>gkl7&d( zu*40oD4xR2w?$rATwla31FtB85fkMIk}E6S;epV9EU_v-nI3P}X znu?MPJgLx8E2MK}FFF#+fnh%NI$6=^Fqjo+h{Tx{fj wYJ$^F*qzu(f1u{{Re=q?>E_P&kJ+&x!mdh2ZJ#Ys8PxQ0EF~fEdT%j literal 0 HcmV?d00001 diff --git a/js/app.98eb0a2b.js.map.gz b/js/app.98eb0a2b.js.map.gz deleted file mode 100644 index 24302c8232e36b29af35e5a1a439bd05b6818444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16004 zcmV-~K6}9*iwFP!000023eA0McjLy9=wCs&IVRv#}F9d;g538Gp)OxTmVRfd&Zb zVS9ITa^exu)z#Hi)z#Hig~oHa1Lg;|=jP@o)Lh$kSZ+SI7nH1CuQ)f$8e`UYqqrC3 z)Lhr<^=x-H$j#^MWo=DU*EIOAscG8={8z)j*9>)C)7Di(Gp2My-PAO@qONH*x3Ub) z^_psFnuQIUhFa5%2_6114YjIiHAJy)08A559OyWT!AGg#C^b#Hr{2?y6TJcmmX@$n z4Ney2C|5Yws+xAJ1KNEZhTf}?Y_@^B zo0?_;4MxvU4fRkrkW#}$CL8qU8kgj%0e$YNE1L1Fp?bQeJ<`<`%{)K6hTvi|H znz2#kKY$od2f3Rwf|`hIpqkHR1K~GSOEWeA+Y;(Q9l$mKqo!?$>6<3%B6Qf-H#sXo z0D#$a4fUQ@(Vj(oH$mSl;xOYd>)J}m7~Z@BdSHMsI8zPHc!txw3p3-7*OAxA*g8Tq zHI0E(XZGj5|QRH554|MQ+!-H6wmR#T@9&1iv~NXRqDq>V{} znKDRQ#|+SKRFa7bU|u4T90I!zb(H6_B!@sp0|jT--ZThq2}A_~S2^*a~Oa&0yI{AilmT7#nz`o%lDdP<0MMpsAd zz?i$FCBT*jF$&c0i1>s|I0g;XcJ+|(^aZ2TV-pNU1$kt0IaM_cO%JUW!#9`dPRWuWQ)qfI1bm#<6|~qU?&QFOs=BQid-^kovyL*uteUT^*Ig@bx`X-bZNuHhZX$_Z}fTEtpvCh|HF)YpCjbsQdSP z^e#FioV%adW}1I9Hq&hPVH+^C3E5f_J0$aWl(1L>%`=8o7v=wqqw+Rkrp>=ic6R&{$LQuOZh#LjfkUDkIv)w!aw8oqspe$KO z&tCqTHC`Fgxf)gixtFJt=>vsCq+31EN27xDIl4zOMC8+;mxJc03H!sjOMsQOq^!FZ|myFevNBPLmw7|fFMz3;ge$G+-Wqfvw{`%T9 zAET}wn#SC62UVGw>D>=a_K9BB<72{s9v^S^D=Nc17`I4+9C$dV@B_`3X0!}-9~Bi~ zT;1Ru3~UL|TBH4RbOTQoHpcK zgYN-A2O!@6p9(;6RjPHvnPqgD~Gr|$tHjJwo2h9|^beNzgsAQse9^S~^T z+$Lr2p=mIt^l35?a+5(V-3p&XPj0*cgPA?!XbDUu9Qchpv#2~8ZsbiLjm`Q2Un6}z zRsje*7@(}^V@%VcplpDu>(rW=to)deRWZRy3!Q}T0 zK6zRo+CJAfKK(s%N!JtHbcmEggS6$yh!;^xTgLUo?A?nf=?F?_!D+UBAXCyIO6rpO z^@xtC3aQ^@McUmH>Sx!aUcMQJ?6}8>t1j8)k(uCONS*p7sosGp7C)%$GLEqt zD^k?gLE(`g%Uy{m(N^$;I-z%~bW-V7;%IaY&p9(X50c`+xUWOh6@j*Zhijp6w1Si$ z(@12jm{;K#suT@?mK71B(u^@8;betINAl^JIApHDj*Yl#Cd{{vu0+G&C(cbx+nQNH zE>XW49a(O3$~Lv?k$%JlK-<_p>d%}Wv)*04g!P~o_G+XTceug8-==V&BmZk%onA6d zYR|^UGI8=Fszq=+KK+q~G-vcd=XDFiH)tbC;2j&>$6%Df$0 zBd*689%qe$v0IvPXR`V^_%^pH6NVl=ifkP$4J}&mZ10Y(eopS))2eM?Tg^lruTv1n z&!E8+*>9fD~7*! z@mQ^REQ>mTBPu$BYnkeOXkOTRSL)5K+qoI{wXQPFdold>;579CcoxGquL6JZWHLH* z^@}LlHMCm$0KJU*^lJJHY5}IQF0x9gRvRNAMp?h5Zfn&gbw#Zj{&EeM=(tWHVNPDIe?TC`_S6ex!HsT)n5;xMwb-ZP9qBYE!HFQvdpD+#e6k)xC-- zY#=7p*6*t8+OlR60T`Rz!r0RaWn?P|P1#9JdIBc1+B0kX5k$}cy|zqnI{(vaiW$6SgsOeS)rx=i&B=O$>!8xM$25d|hC6Z$vt z{5uu3MLY2EO_BUYKMn*#e%^L?6I5=(MCvy*F^tWZm9Uy8`X0BK`-W^mi2E>jd0lqa z%S%}c%O=gPiqr?UAzO2}pO;MJd6ERPj23cb@+J@7RzaMc<9GtCX~s=Xz0YY3BpT7v z?C?r~HDOb?XurYf)o3r$w*UM70%72C+lDRcWCQ76)?7}1ANMG#sX^8paQfFpDCuv9 z{x!`g6a61Lc8`s*g&KDcRHE}~B4Vpp^b(6x{wh^8__JJM&X@){!buz1=FbBoZuw}SsXTH!TG zJfZ|@{K(+IlzjxGVKp|AmRKzi1*YRP)bSiaR4!AW#Y@WS^ zafwHe!7+M}R88%vG;_#ACinIOvSockI3Jp}>GM1}PJ&uYUT_0v>w_iSOM@l3fud*J zMLAiC4cFuf&l=)VU*V~T9{43@6-*bDpFmOr&+wGsnYfimK0>y~xPcqX`Wlh|Cxpfc z7s?n`!yV|D1YF;Y2(3@Z0H#w(0AOtBZbWZYGmk1n>-q#`G_hQ&m5|#yDu}&A!CmAW zPj>m5BoB2Y zud%lQB;SpV$^M3{ei1c6DykU~iZ+1R2 zPAcJ29FDB;1g{Rkwj0D;N=Qu`R4KC}3Wm^CaH~^P8na3qgYd&$3R6xm(Icn`y*oot z9eOs7@yxpu^sq-(a2HN6#xuC&Ht(WpZ}Y!nTd+l1jLB>Xpdenk8duV{jqbaH2DNu`_7YHYH7% zxkXV=gu==izV~gDTF-5y_P$N1=NR1k0+W#XW@_{6P$arfxr7Qqg(jVC56R@xj$fjA zkzlFvFM77A8I<5*7=Gog9rRU?bsLi{RtF2+Hh1Y)gFG)#ElkV%OYx%R3uJFIHMzPt z*l!Nbkc`4UM75JMoH6+1IKT-`?kIb579Is))892RiALRyh(4$YH8N^dNo<%jGG@q^ zqqD?%y!XW6{VJAVqc206a#)j{XY`wmo^i;ln9PLz+q=b&en9RtDhiYJg>&}^PZwpQ z&k0N#LEJZvA{z)b;W!;E%&plNAfPxnMPq>G>aB^T#PMdlLM{oAd{T+eID4dAhZRvT zCmem~^xyXv1i>g2)P=NfRg@&w!*#0oydAaGFl$)Tw2nbk^QYRrPE~YvMP?Y*tao&2Bz{giK|YurdDY-K zvUXI@USZnSBd*0MWT1|e&?e2t@@?Z}d3-&S(ki~HP}Qm-joqnS#af!EQ%+xU6B?AOS(~m(K0)J%2HwCS_V3VH`(`Y+>Oq}H1Puy+8QS5R ze4I7KNfu?=#J~lWMd195IZ(RlO>`GTe1Kx7TZ#1~jIM_&G9&A+$?LYNKGnDFBMbV{ zscBN5!>B+Bq_|Q$CN^WJYV{e4zHL)JjiR&q4V-qfbUS+H>ZGn)ow|5dtPV2yP zjeg8Rbsri7r^?O$1Zwr>qYdiSG2-JMzCu?Cc-{3>ox-s7LBJ%)O0Y@)7;06m8NH>0 zrP%8V^qH!l9O@{JmZHf#n|e*+aX#+vzt-#ZurmOa0Jxf|7M)djY+Ecrm!v>lF|B>}$-jrmqTo zWu#VlV(L=hu4TJdp)?3RpOtL4#g485?tA@^`B#DG&r1!@3xm+NdRKt;`)+7=S*h9S zyZegcSuNJOPB*XHvqEK;g-VOHt-cc~?5OAY;WcoySlf1)((}C@^TT667BWA$1_tH^ zeV-{fhih~Ls`sn|D`@(5FQo1Yya4N3U3N`8UE8%sn?dk7usB}Ba<0*#V+HGn?uKAn z(DD4RW4YH6AIMvw>0hH)*V<|96Ff&kUic6YDQ zYcKHJo)Rnf)p`e^<%j)V?m=X(49^Xj8-mrcyP)3+8YZRfdtD`uf9Dr={2iCKHa&0O zW}^L|&qn!^1Qac84)pcJN>9K&rlO2%dFvTvadA<}_k6F_Z-%z#=9RB0`BGk)SMnvRXXjPGaXPXfQS#)y56*x8 z_vhdK_4zBmJ^S%HI3G?y(RM@TH(4+A{GjNwM|~EA#eTpFL`tFQxovxQL|Oc*!l_df znB1@b{`_Y@{q&{RAOGduPd@zJ`P(l)dH4NK{`}2DJM3uvuw!^F_ScVJJA38F=O27@ z_N})q{_O0P_dCpLF<;=a+hUBO+;=1%O;Lzx0)?_Dgj(EXVIeP`=V{K=1<+bqxDXqR zMq~u{Qww0{o%8)@4Flkhdfm|!To74`#E`pL0! zLX^=`EMliZ{>i()eDdClXTSXYlRy0GuOGkm6*efjnCH#r%9{rJU%iqIl2_WD7m zkS{sjuI)8!A?yJWM}S6|cu!-SL|H z*dF~-6*3xell+?-r=8qEpY7xpBBI)T7p;ckGq=V3!oy~Gq$&@aR#PHtoYuyDS{ z6Do|Ti8&OqM}Xd^F&lSsP0weedqJt|wfYVVN-QYaA@i+}v@8hyeiQ!Q3y=|4>eu%C zQD!wesZP%+U8`3muPCzr2YuWmVwm*<<~!DLz3F?7)378^k6MDLCBHDBF34iwdx5h% zV%2j(bG@L(b!uL5`;MbVR3JjzrTidawJC6_4;neS~0D-@%`i3Z@zu@+M5}iIRE>9J^zn) z&p&$W>|5`g|Krc8PuQ`8;+I`^6yC9$`-K9xL3~o!YP)tgfUQ896ak^u)&_YH!JUps z9B8n%=d&#rr;wPy`G+q({@yp0wSH)U-U~Fb2_upQ2O3FJJqS{4*+J8DT`(dMSus(E zR@m%BGLg7mNaGGzShqt~YkF=LqAm+NUMq-D4Pl^!)IW}Y5F7sQ3+MmztMebdclNzs zpMCIek3afuB-t1a*fD^&cwjkptI+bAeQ=G64X<@PG9shrlZZ80Ssc`s6oLi0JFN-n z(dmwxp#JR7Z#;hEowHZoSD>?U_U_Lff9L(Pm)<%1{R^2&_?c)@lXHp}_I$DdP_r(Z zSMpvkihqu_EPp?*CV>v@z;4)%9Ujjs;Fox50C=`+w*V21H4LD_9P4;qnI0QU0knK; zmu54sgnpl;nwyT@+?U(s=F{g4pY3hz+x)XRMDauj?>+LzL z=yvt2x3*HR3LGj?FlJfW`|8Vxbe?9xje?ETo6y?(PZiVx2I&udE83ik0=@+`}a z>>#w=T|gWRU1XZ$6!MPk?%(&Bv$&H(Jh=y|B0Wownr@E?$UTr&W`Y24cTKC=DInR4 zU&Z+peb)63SYagY#LYv~b60J5UnZN}c9S9@L~}mf4=JsE#?CN}>-QC;7JcR@i%K4T z=cCpHK>{Sr&lp@LK|n{`jlrVTC^>J5X z*mHOD(z;2K|2dH*Cil5;4H~u2FySw1u3ykJQ!^BQL|O>3q#|s7Zp#3RQxH>*RdG0M zVs2OIAWtIc`R}-=3pq7cdRpnbJ*U5GyQ38GY1x6*07vKPk`#x4P(U0qC`Q?q zgFbsIJnpf@kac^G6|$%7*5XX7Jv(ldXLfSYnU}}yhxaFdryR@OU4$cbbn1QjTAiW+ zsdpSX5lD(9*K4td;z$pZ$4rV}YS}?pqHfE~=`o52h=A_ z5ePNIB8u8!=@dptJ1}oU&1diZ>B;YZF3`e7ype(z@*ww7p`GXisA;94@!Fn`Nsb^? z?(ef>Rf&*1P`tLXj%m9hb3@-|K_NqwBU0QuNkkIe2oTIWs(aCVE0Nm6c*nz+ti7bj8{__0I-@(c6l@BQLbpE6Fp1l0qvv=S6^v`r(sT|1CK(jvf!T zIBcvqn;@K`YNkm*Q%gg{xakU-g13SWxxrg#wx*Yys05TODI%8`X^ zu#VTqV1suEIk{!8Pr=y~Y+@eR<*SRz_&E4k`0FdmbfV8`id}Hpdh`7ZZIh9`Qn?;ktA;X0()D5!76qIw(f;Hyo;Px##It+zbJhR?T+4$d%{d-e zl`^@Xdwu?m&c9SrAR+>*@*f`m%a70Be)-d1{0OA~@?Xw>@P5ppp3nH9{f-?vplF5I zw@OcIm(zd{UfUAuaLUCgIO58PK{K(xeMPNPa7y?cie8n~J^7-q(ID6&& zLBId6AHQ}1B^ND?FG>oZN#h4R_0!}^fWs=3r6HCP{F7oF^tW`>9Vt>BM*i=tUXO37 zrz1s7-%|E=z_rcH-eMswkjcyQ`aTLqPTYP5+Ta1$$!sdqg6Es1lL_9&**{ z*X0uXWc4ay+JMgj1tDwIK|T_~(Vl2Q$>oQYph*OY8dK~rA2T$Ttf(pC4Gr7f-L@QO z!-B!)mHQ8(rl!wY%!Oomkm}U$fgIMb24!B!b2{>=cEjr(Z~4xW=Xd9oeB28044(yo zphqqR?FXUP1yTuQUg^73w%$_Zf>CPS>|0b!aS@Pi`Pl%JWxQ-8_kj7~9dDa8dRZW+ zYQns4(ZoBJ>oO-XX>8^Vx2&!x?ZR{KYcHR@`xaCOeE9aKFMj{*d#^wK&HI1-_%#4{ z^7D5d|MJhDeDt03pZ@mK7hXO8_CNpi3sH zhR@peQ37+!Myu7e-T&etkT1l56l*{lAN+nGAS9X0)Jl-HqIueN)MVK$H?2dKA}&*~ ze35D9O+(jbszsw`>h0LLH4Yg!KM zNl?MP%fed7x`n(9l^?-lQhsoSCf3{F8j0MO%vCtZ*8zBmWx@=knIko(R&-QdC9P?4 z$@$tPW+g*D64%m8J#mCw$k(>Mo~(`U+Q z76%jEAcq9+svvy!IQ0P&mzp3w%ou9WIL5Q1-xrK18OBI8;zz?qlX`)E#J?_`o3Nr{ zunYrx@e~D=NZ}-(4v}Hn4qsi2>7G}WWMsS(6OEn@n_~nZrWZZP9!pCZ{3}l^y;EFa zUQ&QUGKZOQiNO@!qLP_pOGzn>e^}gOFnhQt!(OU|v{{K!+W2dz+2H%%B8Q8C65C;r zxgAExFVhsFOHd?lRawH5n&}O==x6$EC^4SZOz&@2aO^gfR5Y;goI-iHl+w_v27bEk zSiJNFL>yW+KO@sie(-8zNqQwE8GcA+`{LJDqF3YKeHyvTU|qPMU3Q*|8OV_iHDm6n zefSHWKkUw>L(6e`7O%4&z!9~=R-2eU{wJfyfDaI(fER)a(a(YCqx51@D!A0g(^n@9 zd%=9Eba;4(o(61VdF4htK(X&TYO?R?@C0x&vP6fmPk-@^vv0lqPrmcP*>~SOd--?gufI#}gfZ#sCxgdQ8+E~V zzvT|RG6zEHp;v^94X|1#k94lm8@kD?()<7Tu9|Ma&M**|;ln~&dq5dvlZ`=zsQ z{zo#Uns^rU)ExE76?9>GQTU62c{94F;K-gixKHVpn zsAJCxJ8;EE9Ixg>ccAPz5j4e8(0N|0N!vyN_7ZqcFDQ{`zwC7x79)?ufniVdmX)ySBKKi1Hi7oQ#(q{Q{YC9m&Z%NpF`eKII`kYTI+=oJDwL5Tc% zhmH^P0|$zNe5sSJ)y;=nw^zkDWd7rGN=7c9M&*Z?Qc1bfVf;j-;4LmY?t$ei41A<-;bcHLQY&dc7i(z)$=!%#a2M2oiut3;q7)NqWEi}`|-oe+q@AFVZNUmQx?eS!P|5E$a=K<)`1MwDRZ1nh+3GA0SK$X~faG^c`2 zl!IcSGs0;tSZ+({^+Uym_Z>nHZfPJ)BZBts)u{&F5>2I&;(EMm(QYX&V=dOoXrpWX z678J!dF45zoP>ql%p=z9hYX42WW`e33DX1yGHt~s1UR}0_NW|-_&0u@A^DM*j@!g> zAcOaSw^(AT0E|neo0i8ZS3P(V$WsaU?R82aV;&bnimiNA83T`BwA{CqQKkIg{`dpss}Z^d#U33UkzgK3 zxOfjfS`y}d_GAQbbd?HUEI=k$&c4&O9S3<=bK6jVc8oyyI+K{o7*PL}j49o?5wQks z04E_q@`L+hf(U?VyQ$W)+$u3xh8a&_kZ6X3bIg3Ac#kOFQ@#=r6j8hG2%o3AcP%JI}w;$^OVb{rHkm2ITR4w!#jh%|1Wfm%iPVP*Bfd`hHp_xB!* zEI@QFrgkTcrW5oWyU7ZBqob-)9$63&@oU+lhs-N1Oj(HA>~=i&uOucsl2(mKJEM{4 z5B`tcF0|vm(eRPJaB^)TS2TmHFiApp8^t2=)4KqzSBQKrNaLPLHi#e=#JkZYsJN-n zW@@G`MFTydi&XhFJQ$8qT+bctSbo=YkA=0$wj{1>NeGh9874$=FlA8~@28#;_VM9E z7Vu5(Yg}Um7D+V-_FJ%Ex|1tU&EUhyMtOR2sxgBP$IFxWkj=2BWi^}haC{mc zwr3`0*uj8%ELbo*H9b2qo{;o( zdwi}r%~}abC%OwsPftzGvYEytJ)D{1LY-_(%#N{y_@~FFn&tL*Qqp6yQ`Y$G%v?gK z)>6NK)YRt3BTX>od>{+)FZmK7jTR$h`S(_==37)Xn}LJ7KT={!y^jdY!8Ve z#QhR4$?h`ohIF7G-?4VFwrwXzkaU-A`gq5WL>yV>iHHveDN=&EZ$FUy+ybVGv@rDT zMnA;y{N_$>L;=cu2XuD;0>nDX8P7onC4GZ$yFy-zO0b|bd}i%)?#ceM-7b8I;3B$X zh9(bK5xQY7$`U|cL=i-fVzXoU0Shs06ShZZ^9%7R%k;3D5)V0!Ajt^VbDLm`lp*~W z66cd_97$%XLphnA4%Jv-Wktlrq~gMH9MqP?4O-y2w8Ee^)L~)51?&0jKvmcQ-0dL+ zm#hQNZYf>XRUBsRW5BIu788`jB_YuRUPuDjMb3k!!z}-f-DO@sEQIv$h;*C=LYMHR z@zgA$Far{t-N?u7Sw3^aTjElV^h5sYH@$hvwM}5>qeEPT{)}E8j~LW;B}3VE3&g60 z*yF~NEIWwoGW-xwiHHZEJ}``hf+uO&Kpj)7KriOR@A@duDIvWh!;$1wCA54z3h&M-O=TNFU;w-*gNiD_DtB1br?%uI>qor`kA#JcHhzg5R=aoEBpBJivif{?S zd_3#CgbEBHp&9Da^l+0c?c@MJav=og(TUi}MKcEr9>wJ_e#T$ngZq{`3@v8bfmI>= z<-kkls^U2|ds|)T}yTfhvP7Xl$7U%ASyaT_AU?&$uw4k>T1JJ9o%1$n1 zM`200dsnjQ0tMReM08gMPcB?~Q9a9gUS>Co$wA}A7(W@bnfM8V1H3jQdL0%=e*GwI)S^T6}ZM+&i!8krX!QccEA zZk2}&jC!315eCjNN*iCXE$-~N1#FDzhvs?e5fKW{Mq>A9CuF`)#Vnv01|Wt(kpQk9 z0;)-696LFqUVmsTZ{1pXxVo-Y9xiFMRkM-;=DHRUlW63hGr_V*qAL+g6jF{iqY-8B zSz?3Y%_Fg(#n&K42Evb5P^+ZsCKeIDJ3?%&UWS_De z@HEDuxrq?XU>ZDj$;GLOFTv2-&2+wDLSVO_e?AL@x5jQsC~WCs+M2?0F2n;aE-GR@ zCmu#jjGUVgg&^5RF(;J86}gI(T!F0-&MWdYg8!_HjahdM-ej;wC@CIpFWOL(kx#kK zTTT~d?5{L4zJxCdLq#Jcb6Cy=U3l1KKql{l+qqWmK#C-V|tRr z$Pr5CmP#UX8+yEYnP;`5-6SA>7`P9GQ`&z!JTrwkoTcA6*WWymjqo<2U032_fv~b6}IO=)R&K}Dr1R9 zfFQZtuD#awuCmI|qrO>RzqOH0JbAwKHOJVnB?+onp*6(Bd4&}1Qi$+t>3PM9C0)M} z8^?@6adkl0pj1-ElrFQ}K-tMzj?b*taf}{f_pZ=0I6MdmL|vMFA6zcySWKO|ghPi; zWbB76KmmMz{J}-(dx*}J{#T(~o_l_LW@_ZirDDi}cx@(zLi+K`B+(q8Mhm4DRceX< zQLP0*Enaok%NFiXQ7sPW_X8t8D;AXU;ieZI>Suq+qA~ztiM{#Lv?NbY>okl27u&QNfbK zz@u`|BVGg&PHu%SP}H%EGAP*#yr70$=7>AgA z30#e+PTKp-b8Dj7SwfPk-Oj87#*VNU!0j`&D7jVG50?BpI?5$gHpsr-6ym?))}Wk%#A))=1cG7x}!2rsr@(tk)# z0vT)^8R7XZ{t0q4jR3(*?|2O-SOU)LC%=-7yO7}obg zi3Mcmz)UrupJN@1BV8;``ExbdLYC5#_ov1tA4q5Ii_47*!00DyF{Cwx6#`gSy6 zjQ`~CkLJ`Ie?>c|=Fp$WsX2a{LBwGB@ejHvBd6x*ZPuKci(UqWc6{e1r{+Lo5FS4G z1F61dc!dAJAu6Zl=mW~|2cEXz53oP*FaP2mLT7!~IH%?~X#ANzyry8_yLUK0`g(6p z&G9er=F}WiF2P9RL%PVxjIX}JEQfrh62u^X78i($zE=wzhiWJigt#7uu!)Ogfgt+w zEY=`7HV`Hv&Vb!(9YYV982sQ2fJa|HC1K)+Or<~Zo2Gy+`h+QPBK}}0u#SJdFsJ4~ zF2|%TaK%JU%{d+@P5NV)K(V;6Ey?eknoC@f5BMV?@^25q0OA{iFfaP5AZVL>>3tfL zhQxBq2ZIvlDAUA$LmDDl9z0GD%#d&M2HK^|x)B9nhTttpiN7QYq{R|~H9@FEZU?j0 z@`tMUr*#0T1+8r>pdJxP8vd1s1tR?!`BG6+?M;gU&S zhsJG~xK%4TcErtrTQ$*S#g~GS@ZnmpsqE(-~AW0~0^cFrC6AwuCJ(x1M6*=t8g}X?E zTZM#KVJC7u@J4`$#@oX6;xAN34e=Y*XgKkm>O}EX@-^M;x~zyjHMB+2JH)t!<9-;y zWMHSwvPqHwCW-gjV2>ka^c^&}{45FVbdg|sYYz9A_cX zVR{fVFo9>bfdcq{RErPZ06&1B`?N=Wd-M-gwu6`xwe9Euh~iT2At&l^fkWs7xQyIN zyN5~|l{ZFD1LDa*#RC9PQ&e|AHVNvI0acS56sa{`Y)M=90f~dQSE;fVH+%6HuVh7~ z7xg-k>nD7%xB`{-WL%0EHO{Fys%pf=8PzocI%zW(nOagChr5GR|AWpQR=A+<(J3QY zh$Ie6-0+IxDcpQp>QH~(F!lJMSC$r0?$q^3}iQwjEB@qoKgkyyR z;-sgkD9ON+3LUjVI#>3hBcU7^=2Nee6^#yqS%HQ~oLM0#G$2u=46stj3k2=qKX^(S yj6t9#IPHYpiJkNZYR=wuJs&Ub$j#q>0O

=$7#C>Dy%4xk3E- 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,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),p=(i(5331),i(7128),i(8507)),f=(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=f.A,h=(0,s.g2)("font-awesome-icon"),c=p.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)),w=(i(9648),i(9655));i(2893);const C={class:"status-panel"},F={class:"overview-cards"},S={class:"card-icon"},M={class:"card-content"},A={class:"card-value"},P={class:"overview-card index-status"},T={class:"card-icon"},D={class:"card-content"},E={class:"card-value"},L={class:"card-subtitle"},I={class:"card-icon"},V={class:"card-content"},O={class:"card-value"},R={class:"charts-section"},W={class:"chart-card"},B={class:"chart-header"},z={class:"chart-content"},N={key:0,class:"empty-state"},U={key:1,class:"pie-chart-container"},$={class:"pie-chart-wrapper"},j={class:"chart-center-text"},H={class:"center-value"},X={class:"chart-legend"},q={class:"legend-label"},K={class:"legend-value"},Y={class:"legend-percent"},Q={class:"chart-card"},G={class:"chart-header"},J={class:"chart-content"},Z={key:0,class:"empty-state"},tt={key:1,class:"pie-chart-container"},et={class:"pie-chart-wrapper"},it={class:"chart-center-text"},st={class:"center-value"},nt={class:"chart-legend"},at={class:"legend-label"},ot={class:"legend-value"},rt={class:"legend-percent"},lt={class:"actions-section"},ht={class:"action-card"},ct={class:"action-header"},dt={class:"action-content"},ut={key:0,class:"progress-container"},gt={class:"progress-header"},pt={class:"progress-phase"},ft={class:"progress-percentage"},mt={class:"progress-details"},bt={key:0,class:"progress-count"},xt={key:1,class:"progress-time"},yt={key:0,class:"progress-message"},_t={key:1,class:"error-container"},vt={class:"error-icon"},kt={class:"error-content"},wt={class:"error-message"},Ct={key:0,class:"error-suggestion"},Ft={class:"error-actions"},St={key:2,class:"action-buttons"},Mt={class:"restore-section"},At={key:0,class:"file-info-section"},Pt=["src"],Tt={key:2,class:"card-bg-fallback"},Dt={class:"file-card-header"},Et={class:"info-card-footer"},Lt={class:"file-name"},It={class:"file-meta"},Vt=["src"],Ot={key:2,class:"card-bg-fallback"},Rt={class:"file-card-header warning"},Wt={class:"info-card-footer"},Bt={class:"file-name"},zt={class:"file-meta"};function Nt(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=(0,s.g2)("Doughnut"),c=w.ve,d=k.S2,u=p.R7,g=v.Zq,f=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",C,[(0,s.Lk)("div",F,[(0,s.Lk)("div",{class:"overview-card total-files",onClick:e[0]||(e[0]=(...t)=>r.fetchIndexInfo&&r.fetchIndexInfo(...t))},[(0,s.Lk)("div",S,[(0,s.bF)(l,{icon:"database"})]),(0,s.Lk)("div",M,[e[9]||(e[9]=(0,s.Lk)("div",{class:"card-title"},"文件总数",-1)),(0,s.Lk)("div",A,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[10]||(e[10]=(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",D,[e[11]||(e[11]=(0,s.Lk)("div",{class:"card-title"},"索引更新时间",-1)),(0,s.Lk)("div",E,(0,n.v_)(r.formatTime(o.indexInfo.lastUpdated)),1),(0,s.Lk)("div",L,(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[12]||(e[12]=(0,s.Lk)("div",{class:"card-title"},"系统版本",-1)),(0,s.Lk)("div",O,"v"+(0,n.v_)(o.version),1),e[13]||(e[13]=(0,s.Lk)("div",{class:"card-subtitle"},"点击查看更新日志",-1))])])]),(0,s.Lk)("div",R,[(0,s.Lk)("div",W,[(0,s.Lk)("div",B,[(0,s.bF)(l,{icon:"share-alt"}),e[14]||(e[14]=(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",N,[(0,s.bF)(l,{icon:"inbox"}),e[15]||(e[15]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",U,[(0,s.Lk)("div",$,[(0,s.bF)(h,{data:r.channelChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",j,[(0,s.Lk)("div",H,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[16]||(e[16]=(0,s.Lk)("div",{class:"center-label"},"文件总数",-1))])]),(0,s.Lk)("div",X,[((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",K,(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",Q,[(0,s.Lk)("div",G,[(0,s.bF)(l,{icon:"file-alt"}),e[17]||(e[17]=(0,s.Lk)("span",null,"文件状态分布",-1))]),(0,s.Lk)("div",J,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,s.uX)(),(0,s.CE)("div",Z,[(0,s.bF)(l,{icon:"inbox"}),e[18]||(e[18]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",tt,[(0,s.Lk)("div",et,[(0,s.bF)(h,{data:r.typeChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",it,[(0,s.Lk)("div",st,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),e[19]||(e[19]=(0,s.Lk)("div",{class:"center-label"},"状态类型",-1))])]),(0,s.Lk)("div",nt,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.aggregatedTypeStats,(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",at,(0,n.v_)(e),1),(0,s.Lk)("span",ot,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",rt,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,s.Lk)("div",lt,[(0,s.Lk)("div",ht,[(0,s.Lk)("div",ct,[(0,s.bF)(l,{icon:"tools"}),e[20]||(e[20]=(0,s.Lk)("span",null,"系统维护",-1))]),(0,s.Lk)("div",dt,[o.isProcessing?((0,s.uX)(),(0,s.CE)("div",ut,[(0,s.Lk)("div",gt,[(0,s.Lk)("span",pt,(0,n.v_)(r.phaseDescription),1),(0,s.Lk)("span",ft,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,s.bF)(c,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,s.Lk)("div",mt,[o.processingProgress.current>0?((0,s.uX)(),(0,s.CE)("span",bt,[(0,s.bF)(l,{icon:"file-alt"}),(0,s.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,s.Q3)("",!0),e[21]||(e[21]=(0,s.eW)(" 条记录 ",-1))])):(0,s.Q3)("",!0),r.estimatedTimeRemaining?((0,s.uX)(),(0,s.CE)("span",xt,[(0,s.bF)(l,{icon:"clock"}),(0,s.eW)(" "+(0,n.v_)(r.estimatedTimeRemaining),1)])):(0,s.Q3)("",!0)]),o.processingProgress.message?((0,s.uX)(),(0,s.CE)("div",yt,(0,n.v_)(o.processingProgress.message),1)):(0,s.Q3)("",!0),(0,s.bF)(d,{type:"danger",plain:"",size:"small",onClick:r.cancelOperation,class:"cancel-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"times"}),e[22]||(e[22]=(0,s.eW)(" 取消操作 ",-1))]),_:1},8,["onClick"])])):o.processingError?((0,s.uX)(),(0,s.CE)("div",_t,[(0,s.Lk)("div",vt,[(0,s.bF)(l,{icon:"exclamation-triangle"})]),(0,s.Lk)("div",kt,[(0,s.Lk)("div",wt,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,s.uX)(),(0,s.CE)("div",Ct,(0,n.v_)(o.processingError.suggestion),1)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",Ft,[o.processingError.recoverable?((0,s.uX)(),(0,s.Wv)(d,{key:0,type:"primary",size:"small",onClick:r.retryOperation},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"redo"}),e[23]||(e[23]=(0,s.eW)(" 重试 ",-1))]),_:1},8,["onClick"])):(0,s.Q3)("",!0),(0,s.bF)(d,{type:"default",size:"small",onClick:r.dismissError},{default:(0,s.k6)(()=>[...e[24]||(e[24]=[(0,s.eW)(" 关闭 ",-1)])]),_:1},8,["onClick"])])])):((0,s.uX)(),(0,s.CE)("div",St,[(0,s.bF)(u,{content:"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,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","disabled","onClick"])]),_:1}),(0,s.bF)(u,{content:"备份所有文件元数据和系统设置到JSON文件",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,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","disabled","onClick"])]),_:1}),(0,s.bF)(u,{content:"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置",placement:"top"},{default:(0,s.k6)(()=>[(0,s.Lk)("div",Mt,[(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)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,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","disabled","onClick"])])]),_:1})]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",At,[o.indexInfo.newestFile?((0,s.uX)(),(0,s.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[5]||(e[5]=t=>r.openFileInNewTab(o.indexInfo.newestFile))},[r.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.Wv)(g,{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,Pt)):((0,s.uX)(),(0,s.CE)("div",Tt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})])),(0,s.Lk)("div",Dt,[(0,s.bF)(l,{icon:"arrow-up"}),e[25]||(e[25]=(0,s.Lk)("span",null,"最近上传",-1))]),(0,s.Lk)("div",Et,[(0,s.Lk)("div",Lt,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,s.Lk)("div",It,(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",{key:1,class:"file-info-card info-card-oldest",onClick:e[8]||(e[8]=t=>r.openFileInNewTab(o.indexInfo.oldestFile))},[r.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.Wv)(g,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=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[7]||(e[7]=t=>r.handleImageError("oldest"))},null,40,Vt)):((0,s.uX)(),(0,s.CE)("div",Ot,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})])),(0,s.Lk)("div",Rt,[(0,s.bF)(l,{icon:"arrow-down"}),e[26]||(e[26]=(0,s.Lk)("span",null,"最早上传",-1))]),(0,s.Lk)("div",Wt,[(0,s.Lk)("div",Bt,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,s.Lk)("div",zt,(0,n.v_)(r.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)])),[[f,o.loading]])}i(8111),i(8237),i(8335);var Ut=i(797),$t={rE:"2.5.4"},jt=(i(116),i(1701),i(1114));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([[925],{333:function(t,e,i){i(5331),i(6711)},415:function(t,e,i){i(5331),i(3565)},694:function(t,e,i){i(5331)},1114:function(t,e,i){function s(t){return s="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},s(t)}function n(t,e){if("object"!=s(t)||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,e||"default");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=n(t,"string");return"symbol"==s(e)?e:e+""}function o(t,e,i){return(e=a(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}i.d(e,{A:function(){return o}})},1925:function(t,e,i){i.r(e),i.d(e,{default:function(){return Yu}});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),p=(i(5331),i(7128),i(8507)),f=(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=f.A,h=(0,s.g2)("font-awesome-icon"),c=p.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)),w=(i(9648),i(9655));i(2893);const C={class:"status-panel"},F={class:"overview-cards"},S={class:"card-icon"},M={class:"card-content"},A={class:"card-value"},P={class:"overview-card index-status"},T={class:"card-icon"},D={class:"card-content"},E={class:"card-value"},L={class:"card-subtitle"},I={class:"card-icon"},V={class:"card-content"},O={class:"card-value"},R={class:"charts-section"},W={class:"chart-card"},B={class:"chart-header"},z={class:"chart-content"},N={key:0,class:"empty-state"},U={key:1,class:"pie-chart-container"},$={class:"pie-chart-wrapper"},j={class:"chart-center-text"},H={class:"center-value"},X={class:"chart-legend"},q={class:"legend-label"},K={class:"legend-value"},Y={class:"legend-percent"},Q={class:"chart-card"},G={class:"chart-header"},J={class:"chart-content"},Z={key:0,class:"empty-state"},tt={key:1,class:"pie-chart-container"},et={class:"pie-chart-wrapper"},it={class:"chart-center-text"},st={class:"center-value"},nt={class:"chart-legend"},at={class:"legend-label"},ot={class:"legend-value"},rt={class:"legend-percent"},lt={class:"actions-section"},ht={class:"action-card"},ct={class:"action-header"},dt={class:"action-content"},ut={key:0,class:"progress-container"},gt={class:"progress-header"},pt={class:"progress-phase"},ft={class:"progress-percentage"},mt={class:"progress-details"},bt={key:0,class:"progress-count"},xt={key:1,class:"progress-time"},yt={key:0,class:"progress-message"},_t={key:1,class:"error-container"},vt={class:"error-icon"},kt={class:"error-content"},wt={class:"error-message"},Ct={key:0,class:"error-suggestion"},Ft={class:"error-actions"},St={key:2,class:"action-buttons"},Mt={class:"restore-section"},At={key:0,class:"file-info-section"},Pt=["src"],Tt={key:2,class:"card-bg-fallback"},Dt={class:"file-card-header"},Et={class:"info-card-footer"},Lt={class:"file-name"},It={class:"file-meta"},Vt=["src"],Ot={key:2,class:"card-bg-fallback"},Rt={class:"file-card-header warning"},Wt={class:"info-card-footer"},Bt={class:"file-name"},zt={class:"file-meta"};function Nt(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=(0,s.g2)("Doughnut"),c=w.ve,d=k.S2,u=p.R7,g=v.Zq,f=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",C,[(0,s.Lk)("div",F,[(0,s.Lk)("div",{class:"overview-card total-files",onClick:e[0]||(e[0]=(...t)=>r.fetchIndexInfo&&r.fetchIndexInfo(...t))},[(0,s.Lk)("div",S,[(0,s.bF)(l,{icon:"database"})]),(0,s.Lk)("div",M,[e[9]||(e[9]=(0,s.Lk)("div",{class:"card-title"},"文件总数",-1)),(0,s.Lk)("div",A,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[10]||(e[10]=(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",D,[e[11]||(e[11]=(0,s.Lk)("div",{class:"card-title"},"索引更新时间",-1)),(0,s.Lk)("div",E,(0,n.v_)(r.formatTime(o.indexInfo.lastUpdated)),1),(0,s.Lk)("div",L,(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[12]||(e[12]=(0,s.Lk)("div",{class:"card-title"},"系统版本",-1)),(0,s.Lk)("div",O,"v"+(0,n.v_)(o.version),1),e[13]||(e[13]=(0,s.Lk)("div",{class:"card-subtitle"},"点击查看更新日志",-1))])])]),(0,s.Lk)("div",R,[(0,s.Lk)("div",W,[(0,s.Lk)("div",B,[(0,s.bF)(l,{icon:"share-alt"}),e[14]||(e[14]=(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",N,[(0,s.bF)(l,{icon:"inbox"}),e[15]||(e[15]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",U,[(0,s.Lk)("div",$,[(0,s.bF)(h,{data:r.channelChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",j,[(0,s.Lk)("div",H,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[16]||(e[16]=(0,s.Lk)("div",{class:"center-label"},"文件总数",-1))])]),(0,s.Lk)("div",X,[((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",K,(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",Q,[(0,s.Lk)("div",G,[(0,s.bF)(l,{icon:"file-alt"}),e[17]||(e[17]=(0,s.Lk)("span",null,"文件状态分布",-1))]),(0,s.Lk)("div",J,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,s.uX)(),(0,s.CE)("div",Z,[(0,s.bF)(l,{icon:"inbox"}),e[18]||(e[18]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",tt,[(0,s.Lk)("div",et,[(0,s.bF)(h,{data:r.typeChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",it,[(0,s.Lk)("div",st,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),e[19]||(e[19]=(0,s.Lk)("div",{class:"center-label"},"状态类型",-1))])]),(0,s.Lk)("div",nt,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.aggregatedTypeStats,(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",at,(0,n.v_)(e),1),(0,s.Lk)("span",ot,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",rt,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,s.Lk)("div",lt,[(0,s.Lk)("div",ht,[(0,s.Lk)("div",ct,[(0,s.bF)(l,{icon:"tools"}),e[20]||(e[20]=(0,s.Lk)("span",null,"系统维护",-1))]),(0,s.Lk)("div",dt,[o.isProcessing?((0,s.uX)(),(0,s.CE)("div",ut,[(0,s.Lk)("div",gt,[(0,s.Lk)("span",pt,(0,n.v_)(r.phaseDescription),1),(0,s.Lk)("span",ft,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,s.bF)(c,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,s.Lk)("div",mt,[o.processingProgress.current>0?((0,s.uX)(),(0,s.CE)("span",bt,[(0,s.bF)(l,{icon:"file-alt"}),(0,s.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,s.Q3)("",!0),e[21]||(e[21]=(0,s.eW)(" 条记录 ",-1))])):(0,s.Q3)("",!0),r.estimatedTimeRemaining?((0,s.uX)(),(0,s.CE)("span",xt,[(0,s.bF)(l,{icon:"clock"}),(0,s.eW)(" "+(0,n.v_)(r.estimatedTimeRemaining),1)])):(0,s.Q3)("",!0)]),o.processingProgress.message?((0,s.uX)(),(0,s.CE)("div",yt,(0,n.v_)(o.processingProgress.message),1)):(0,s.Q3)("",!0),(0,s.bF)(d,{type:"danger",plain:"",size:"small",onClick:r.cancelOperation,class:"cancel-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"times"}),e[22]||(e[22]=(0,s.eW)(" 取消操作 ",-1))]),_:1},8,["onClick"])])):o.processingError?((0,s.uX)(),(0,s.CE)("div",_t,[(0,s.Lk)("div",vt,[(0,s.bF)(l,{icon:"exclamation-triangle"})]),(0,s.Lk)("div",kt,[(0,s.Lk)("div",wt,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,s.uX)(),(0,s.CE)("div",Ct,(0,n.v_)(o.processingError.suggestion),1)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",Ft,[o.processingError.recoverable?((0,s.uX)(),(0,s.Wv)(d,{key:0,type:"primary",size:"small",onClick:r.retryOperation},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"redo"}),e[23]||(e[23]=(0,s.eW)(" 重试 ",-1))]),_:1},8,["onClick"])):(0,s.Q3)("",!0),(0,s.bF)(d,{type:"default",size:"small",onClick:r.dismissError},{default:(0,s.k6)(()=>[...e[24]||(e[24]=[(0,s.eW)(" 关闭 ",-1)])]),_:1},8,["onClick"])])])):((0,s.uX)(),(0,s.CE)("div",St,[(0,s.bF)(u,{content:"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,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","disabled","onClick"])]),_:1}),(0,s.bF)(u,{content:"备份所有文件元数据和系统设置到JSON文件",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,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","disabled","onClick"])]),_:1}),(0,s.bF)(u,{content:"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置",placement:"top"},{default:(0,s.k6)(()=>[(0,s.Lk)("div",Mt,[(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)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,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","disabled","onClick"])])]),_:1})]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",At,[o.indexInfo.newestFile?((0,s.uX)(),(0,s.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[5]||(e[5]=t=>r.openFileInNewTab(o.indexInfo.newestFile))},[r.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.Wv)(g,{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,Pt)):((0,s.uX)(),(0,s.CE)("div",Tt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})])),(0,s.Lk)("div",Dt,[(0,s.bF)(l,{icon:"arrow-up"}),e[25]||(e[25]=(0,s.Lk)("span",null,"最近上传",-1))]),(0,s.Lk)("div",Et,[(0,s.Lk)("div",Lt,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,s.Lk)("div",It,(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",{key:1,class:"file-info-card info-card-oldest",onClick:e[8]||(e[8]=t=>r.openFileInNewTab(o.indexInfo.oldestFile))},[r.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.Wv)(g,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=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[7]||(e[7]=t=>r.handleImageError("oldest"))},null,40,Vt)):((0,s.uX)(),(0,s.CE)("div",Ot,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})])),(0,s.Lk)("div",Rt,[(0,s.bF)(l,{icon:"arrow-down"}),e[26]||(e[26]=(0,s.Lk)("span",null,"最早上传",-1))]),(0,s.Lk)("div",Wt,[(0,s.Lk)("div",Bt,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,s.Lk)("div",zt,(0,n.v_)(r.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)])),[[f,o.loading]])}i(8111),i(8237),i(8335);var Ut=i(797),$t={rE:"2.5.4"},jt=(i(116),i(1701),i(1114));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 @@ -19,5 +19,5 @@ function Oe(){}const Re=(()=>{let t=0;return()=>t++})();function We(t){return nu * (c) 2025 Chart.js Contributors * Released under the MIT License */ -class fa{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],a=e.duration;n.forEach(s=>s({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(i-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Xi.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 ma=new fa;const ba="transparent",xa={boolean(t,e,i){return i>.5?e:t},color(t,e,i){const s=as(t||ba),n=s.valid&&as(e||ba);return n&&n.valid?n.mix(s,i).hexString():e},number(t,e,i){return t+(e-t)*i}};class ya{constructor(t,e,i,s){const n=e[i];s=Qs([t.to,s,n,t.from]);const a=Qs([t.from,n,s]);this._active=!0,this._fn=t.fn||xa[t.type||typeof a],this._easing=ss[t.easing]||ss.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=Qs([t.to,e,s,t.from]),this._from=Qs([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(!ze(n))return;const a={};for(const t of e)a[t]=n[t];(Be(n.properties)&&n.properties||[s]).forEach(t=>{t!==s&&i.has(t)||i.set(t,a)})})}_animateOptions(t,e){const i=e.options,s=ka(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&va(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 ya(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?(ma.add(this._chart,i),!0):void 0}}function va(t,e){const i=[],s=Object.keys(e);for(let n=0;n0||!i&&e<0)return n.index}return null}function Ia(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=Ta(a,o,s),d=e.length;let u;for(let g=0;gi[t].axis===e).shift()}function Oa(t,e){return Js(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Ra(t,e,i){return Js(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}function Wa(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 Ba=t=>"reset"===t||"none"===t,za=(t,e)=>e?t:Object.assign({},t),Na=(t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Sa(i,!0),values:null};class Ua{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=Pa(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&&Wa(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=$e(i.xAxisID,Va(t,"x")),a=e.yAxisID=$e(i.yAxisID,Va(t,"y")),o=e.rAxisID=$e(i.rAxisID,Va(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&&Wa(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(ze(e)){const t=this._cachedMeta;this._data=Aa(e,t)}else if(i!==e){if(i){ji(i,this);const t=this._cachedMeta;Wa(t),t._parsed=[]}e&&Object.isExtensible(e)&&$i(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=Pa(e.vScale,e),e.stack!==i.stack&&(s=!0,Wa(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&(Ia(this,e._parsed),e._stacked=Pa(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=Be(s[t])?this.parseArrayData(i,s,t,e):ze(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),p=l.resolveNamedOptions(d,u,g,c);return p.$shared&&(p.$shared=r,n[a]=Object.freeze(za(p,r))),p}_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 _a(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||Ba(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){Ba(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ba(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=$a(e,t.type);let s,n,a,o,r=e._length;const l=()=>{32767!==a&&-32768!==a&&(oi(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 Ka(t,e,i,s){return Be(t)?qa(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Ya(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 Ja(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(We(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[$e("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;dIi(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),p=(t,e,s)=>Ii(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),f=g(0,h,d),m=g(fi,c,u),b=p(ci,h,d),x=p(ci+fi,c,u);s=(f-b)/2,n=(m-x)/2,a=-(f+b)/2,o=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:a,offsetY:o}}(0,jt.A)(ao,"id","bubble"),(0,jt.A)(ao,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,jt.A)(ao,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class ro extends Ua{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(ze(i[t])){const{key:t="value"}=this._parsing;o=e=>+ni(i[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?di*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=gs(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")}),(0,jt.A)(ro,"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 lo extends Ua{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}=Ji(e,s,a);this._drawStart=o,this._drawCount=r,Zi(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:p}=this.options,f=Ci(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=We(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])>f,p&&(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()}}(0,jt.A)(lo,"id","line"),(0,jt.A)(lo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,jt.A)(lo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class ho extends Ua{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=gs(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return yn.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*ci;let u,g=d;const p=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}}(0,jt.A)(ho,"id","polarArea"),(0,jt.A)(ho,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,jt.A)(ho,"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 co extends ro{}(0,jt.A)(co,"id","pie"),(0,jt.A)(co,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class uo extends Ua{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 yn.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,f&&(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}}(0,jt.A)(go,"id","scatter"),(0,jt.A)(go,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,jt.A)(go,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function po(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class fo{static override(t){Object.assign(fo.prototype,t)}constructor(t){(0,jt.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return po()}parse(){return po()}format(){return po()}add(){return po()}diff(){return po()}startOf(){return po()}endOf(){return po()}}var mo={_date:fo};function bo(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?zi:Bi;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=>!We(t[e.axis]));s.lo-=Math.max(0,a);const o=i.slice(s.hi).findIndex(t=>!We(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 xo(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 Fo={evaluateInteractionItems:xo,modes:{index(t,e,i,s){const n=Bn(e,t),a=i.axis||"x",o=i.includeInvisible||!1,r=i.intersect?_o(t,n,a,s,o):wo(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=Bn(e,t),a=i.axis||"xy",o=i.includeInvisible||!1;let r=i.intersect?_o(t,n,a,s,o):wo(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 Ao(t,e){return t.filter(t=>-1===So.indexOf(t.pos)&&t.box.axis===e)}function Po(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 To(t){const e=[];let i,s,n,a,o,r;for(i=0,s=(t||[]).length;it.box.fullSize),!0),s=Po(Mo(e,"left"),!0),n=Po(Mo(e,"right")),a=Po(Mo(e,"top"),!0),o=Po(Mo(e,"bottom")),r=Ao(e,"x"),l=Ao(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 Io(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function Vo(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 Oo(t,e,i,s){const{pos:n,box:a}=i,o=t.maxPadding;if(!ze(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&&Vo(o,a.getPadding());const r=Math.max(0,e.outerWidth-Io(o,t,"left","right")),l=Math.max(0,e.outerHeight-Io(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 Ro(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 Wo(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 Bo(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);Vo(u,Ks(s));const g=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),p=Eo(l.concat(h),d);Bo(r.fullSize,g,d,p),Bo(l,g,d,p),Bo(h,g,d,p)&&Bo(l,g,d,p),Ro(g),No(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,No(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},qe(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 $o{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 $o{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Ho="$chartjs",Xo={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},qo=t=>null===t||""===t;function Ko(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[Ho]={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",qo(n)){const e=Hn(t,"width");void 0!==e&&(t.width=e)}if(qo(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Hn(t,"height");void 0!==e&&(t.height=e)}return t}const Yo=!!jn&&{passive:!0};function Qo(t,e,i){t&&t.addEventListener(e,i,Yo)}function Go(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,Yo)}function Jo(t,e){const i=Xo[t.type]||t.type,{x:s,y:n}=Bn(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}function Zo(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function tr(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Zo(i.addedNodes,s),e=e&&!Zo(i.removedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}function er(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Zo(i.removedNodes,s),e=e&&!Zo(i.addedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}const ir=new Map;let sr=0;function nr(){const t=window.devicePixelRatio;t!==sr&&(sr=t,ir.forEach((e,i)=>{i.currentDevicePixelRatio!==t&&e()}))}function ar(t,e){ir.size||window.addEventListener("resize",nr),ir.set(t,e)}function or(t){ir.delete(t),ir.size||window.removeEventListener("resize",nr)}function rr(t,e,i){const s=t.canvas,n=s&&Dn(s);if(!n)return;const a=qi((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),ar(t,a),o}function lr(t,e,i){i&&i.disconnect(),"resize"===e&&or(t)}function hr(t,e,i){const s=t.canvas,n=qi(e=>{null!==t.ctx&&i(Jo(e,t))},t);return Qo(s,e,n),n}class cr extends $o{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(Ko(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[Ho])return!1;const i=e[Ho].initial;["height","width"].forEach(t=>{const s=i[t];We(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[Ho],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:tr,detach:er,resize:rr},a=n[e]||hr;s[e]=a(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;const n={attach:lr,detach:lr,resize:lr},a=n[e]||Go;a(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Un(t,e,i,s)}isAttached(t){const e=t&&Dn(t);return!(!e||!e.isConnected)}}function dr(t){return!Tn()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?jo:cr}class ur{constructor(){(0,jt.A)(this,"x",void 0),(0,jt.A)(this,"y",void 0),(0,jt.A)(this,"active",!1),(0,jt.A)(this,"options",void 0),(0,jt.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return Ci(this.x)&&Ci(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 gr(t,e){const i=t.options.ticks,s=pr(t),n=Math.min(i.maxTicksLimit||s,s),a=i.major.enabled?mr(e):[],o=a.length,r=a[0],l=a[o-1],h=[];if(o>n)return br(e,h,a,o/n),h;const c=fr(a,e,n);if(o>0){let t,i;const s=o>1?Math.round((l-r)/(o-1)):null;for(xr(e,h,c,We(s)?0:r-s,r),t=0,i=o-1;tn)return t}return Math.max(n,1)}function mr(t){const e=[];let i,s;for(i=0,s=t.length;i"left"===t?"right":"right"===t?"left":t,vr=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,kr=(t,e)=>Math.min(e||t,t);function wr(t,e){const i=[],s=t.length/e,n=t.length;let a=0;for(;ao+r)))return h}function Fr(t,e){qe(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:Ue(i,Ue(s,i)),max:Ue(s,Ue(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(){Xe(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=Gs(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=Vi(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=Ai(Math.min(Math.asin(Vi((h.highest.height+6)/a,-1,1)),Math.asin(Vi(o/r,-1,1))-Math.asin(Vi(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){Xe(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Xe(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(){Xe(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 Oi(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()),p=g.display?g.width:0,f=p/2,m=function(t){return Ms(i,t,p)};let b,x,y,_,v,k,w,C,F,S,M,A;if("top"===a)b=m(this.bottom),k=this.bottom-d,C=b-f,S=m(t.top)+f,A=t.bottom;else if("bottom"===a)b=m(this.top),S=t.top,A=m(t.bottom)-f,k=b+f,C=this.top+d;else if("left"===a)b=m(this.right),v=this.right-d,w=b-f,F=m(t.left)+f,M=t.right;else if("right"===a)b=m(this.left),F=t.left,M=m(t.right)-f,v=b+f,w=this.left+d;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(ze(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}S=t.top,A=t.bottom,k=b+f,C=k+d}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(ze(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}v=b-f,w=v-d,F=t.left,M=t.right}const P=$e(s.ticks.maxTicksLimit,c),T=Math.max(1,Math.ceil(c/P));for(x=0;x0&&(a-=s/2);break}d={left:a,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}f.push({label:y,font:C,textOffset:M,options:{rotation:p,color:i,strokeColor:r,strokeWidth:h,textAlign:u,textBaseline:A,translation:[_,v],backdrop:d}})}return f}_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(".");ws.route(a,n,l,r)})}function Or(t){return"id"in t&&"defaults"in t}class Rr{constructor(){this.controllers=new Lr(Ua,"datasets",!0),this.elements=new Lr(ur,"elements"),this.plugins=new Lr(Object,"plugins"),this.scales=new Lr(Er,"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):qe(e,e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)})})}_exec(t,e,i){const s=ai(t);Xe(i["before"+s],[],i),e[t](i),Xe(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 zr(t){const e={},i=[],s=Object.keys(Wr.plugins.items);for(let a=0;a1&&qr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Qr(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function Gr(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 Qr(t,"x",i[0])||Qr(t,"y",i[0])}return{}}function Jr(t,e){const i=xs[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(!ze(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=Yr(e,o,Gr(e,t),ws.scales[o.type]),l=Xr(r,n),h=i.scales||{};a[e]=Ze(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=xs[n]||{},l=r.scales||{};Object.keys(l).forEach(t=>{const e=Hr(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Ze(a[n],[{axis:e},s[n],l[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Ze(e,[ws.scales[e.type],ws.scale])}),a}function Zr(t){const e=t.options||(t.options={});e.plugins=$e(e.plugins,{}),e.scales=Jr(t,e)}function tl(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function el(t){return t=t||{},t.data=tl(t.data),Zr(t),t}const il=new Map,sl=new Set;function nl(t,e){let i=il.get(t);return i||(i=e(),il.set(t,i),sl.add(i)),i}const al=(t,e,i)=>{const s=ni(e,i);void 0!==s&&t.add(s)};class ol{constructor(t){this._config=el(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=tl(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(),Zr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return nl(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return nl(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return nl(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,i=this.type;return nl(`${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=>al(r,t,e))),e.forEach(t=>al(r,s,t)),e.forEach(t=>al(r,xs[n]||{},t)),e.forEach(t=>al(r,ws,t)),e.forEach(t=>al(r,ys,t))});const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),sl.has(e)&&a.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,xs[e]||{},ws.datasets[e]||{},{type:e},ws,ys]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=rl(this._resolverCache,t,s);let r=a;if(hl(a,e)){n.$shared=!1,i=ri(i)?i():i;const e=this.createResolver(t,i,o);r=tn(a,i,e)}for(const l of e)n[l]=r[l];return n}createResolver(t,e,i=[""],s){const{resolver:n}=rl(this._resolverCache,t,i);return ze(e)?tn(n,e,void 0,s):n}}function rl(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=Zs(e,i);a={resolver:t,subPrefixes:i.filter(t=>!t.toLowerCase().includes("hover"))},s.set(n,a)}return a}const ll=t=>ze(t)&&Object.getOwnPropertyNames(t).some(e=>ri(t[e]));function hl(t,e){const{isScriptable:i,isIndexable:s}=en(t);for(const n of e){const e=i(n),a=s(n),o=(a||e)&&t[n];if(e&&(ri(o)||ll(o))||a&&Be(o))return!0}return!1}var cl="4.5.1";const dl=["top","bottom","left","right","chartArea"];function ul(t,e){return"top"===t||"bottom"===t||-1===dl.indexOf(t)&&"x"===e}function gl(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function pl(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Xe(i&&i.onComplete,[t],e)}function fl(t){const e=t.chart,i=e.options.animation;Xe(i&&i.onProgress,[t],e)}function ml(t){return Tn()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const bl={},xl=t=>{const e=ml(t);return Object.values(bl).filter(t=>t.canvas===e).pop()};function yl(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 _l(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}class vl{static register(...t){Wr.add(...t),kl()}static unregister(...t){Wr.remove(...t),kl()}constructor(t,e){const i=this.config=new ol(e),s=ml(t),n=xl(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||dr(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=Re(),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 Br,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Ki(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],bl[this.id]=this,o&&r?(ma.listen(this,"complete",pl),ma.listen(this,"progress",fl),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 We(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 Wr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():$n(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return As(this.canvas,this.ctx),this}stop(){return ma.stop(this),this}resize(t,e){ma.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,$n(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),Xe(i.onResize,[this,a],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};qe(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=Yr(t,i),n="r"===s,a="x"===s;return{options:i,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),qe(n,e=>{const n=e.options,a=n.id,o=Yr(a,n),r=$e(n.type,e.dtype);void 0!==n.position&&ul(n.position,o)===ul(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=Wr.getScale(r);l=new t({id:a,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)}),qe(s,(t,e)=>{t||delete i[e]}),qe(i,t=>{Uo.configure(this,t,t.options),Uo.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(gl("z","_idx"));const{_active:o,_lastEvent:r}=this;r?this._eventHandler(r,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){qe(this.scales,t=>{Uo.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);li(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;yl(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;Uo.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],qe(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=pa(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",i)&&(s&&Es(e,s),t.controller.draw(),s&&Ls(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Ds(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Fo.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=Js(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);oi(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(),ma.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)};qe(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(){qe(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},qe(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=!Ke(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=hi(t),l=_l(t,this._lastEvent,i,r);i&&(this._lastEvent=null,Xe(n.onHover,[t,o,this],this),r&&Xe(n.onClick,[t,o,this],this));const h=!Ke(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 kl(){return qe(vl.instances,t=>t._plugins.invalidate())}function wl(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-ci/2,s+ci/2,!0);else if("bevel"===c){const o=2*e*e,r=-o*Math.cos(i+ci/2)+n,l=-o*Math.sin(i+ci/2)+a,h=o*Math.cos(s+ci/2)+n,c=o*Math.sin(s+ci/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 Cl(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+fi,s-fi),t.closePath(),t.clip()}function Fl(t){return Hs(t,["outerStart","outerEnd","innerStart","innerEnd"])}function Sl(t,e,i,s){const n=Fl(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 Vi(t,0,Math.min(a,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Vi(n.innerStart,0,o),innerEnd:Vi(n.innerEnd,0,o)}}function Ml(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Al(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 p=n-l;if(s){const t=c>0?c-s:0,e=d>0?d-s:0,i=(t+e)/2,n=0!==i?p*i/(i+s):p;g=(p-n)/2}const f=Math.max(.001,p*d-i/ci)/d,m=(p-f)/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,C=d-_,F=b+y/w,S=x-_/C,M=u+v,A=u+k,P=b+v/M,T=x-k/A;if(t.beginPath(),a){const e=(F+S)/2;if(t.arc(o,r,d,F,e),t.arc(o,r,d,e,S),_>0){const e=Ml(C,S,o,r);t.arc(e.x,e.y,_,S,x+fi)}const i=Ml(A,x,o,r);if(t.lineTo(i.x,i.y),k>0){const e=Ml(A,T,o,r);t.arc(e.x,e.y,k,x+fi,T+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(M,P,o,r);t.arc(e.x,e.y,v,P+Math.PI,b-fi)}const n=Ml(w,b,o,r);if(t.lineTo(n.x,n.y),y>0){const e=Ml(w,F,o,r);t.arc(e.x,e.y,y,b-fi,F)}}else{t.moveTo(o,r);const e=Math.cos(F)*d+o,i=Math.sin(F)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+o,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Pl(t,e,i,s,n){const{fullCircles:a,startAngle:o,circumference:r}=e;let l=e.endAngle;if(a){Al(t,e,i,s,l,n);for(let e=0;e=ci&&0===g&&"miter"!==c&&wl(t,e,f),a||(Al(t,e,i,s,f,n),t.stroke())}(0,jt.A)(vl,"defaults",ws),(0,jt.A)(vl,"instances",bl),(0,jt.A)(vl,"overrides",xs),(0,jt.A)(vl,"registry",Wr),(0,jt.A)(vl,"version",cl),(0,jt.A)(vl,"getChart",xl);class Dl extends ur{constructor(t){super(),(0,jt.A)(this,"circumference",void 0),(0,jt.A)(this,"endAngle",void 0),(0,jt.A)(this,"fullCircles",void 0),(0,jt.A)(this,"innerRadius",void 0),(0,jt.A)(this,"outerRadius",void 0),(0,jt.A)(this,"pixelMargin",void 0),(0,jt.A)(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}=Ti(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=$e(c,r-o),g=Ii(n,o,r)&&o!==r,p=u>=di||g,f=Ri(a,l+d,h+d);return p&&f}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>di?Math.floor(i/di):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(ci,i||0)),l=s*r;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,Pl(t,this,l,n,a),Tl(t,this,l,n,a),t.restore()}}function El(t,e,i=e){t.lineCap=$e(i.borderCapStyle,e.borderCapStyle),t.setLineDash($e(i.borderDash,e.borderDash)),t.lineDashOffset=$e(i.borderDashOffset,e.borderDashOffset),t.lineJoin=$e(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=$e(i.borderWidth,e.borderWidth),t.strokeStyle=$e(i.borderColor,e.borderColor)}function Ll(t,e,i){t.lineTo(i.x,i.y)}function Il(t){return t.stepped?Is:t.tension||"monotone"===t.cubicInterpolationMode?Vs:Ll}function Vl(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!==p&&(t.lineTo(m,p),t.lineTo(m,g),t.lineTo(m,f))};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?(ip&&(p=i),m=(b*m+e)/++b):(y(),t.lineTo(e,i),u=s,b=0,g=p=i),f=i}y()}function Wl(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?Rl:Ol}function Bl(t){return t.stepped?qn:t.tension||"monotone"===t.cubicInterpolationMode?Kn:Xn}function zl(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),El(t,e.options),t.stroke(n)}function Nl(t,e,i,s){const{segments:n,options:a}=e,o=Wl(e);for(const r of n)El(t,a,r.style),t.beginPath(),o(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(0,jt.A)(Dl,"id","arc"),(0,jt.A)(Dl,"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}),(0,jt.A)(Dl,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,jt.A)(Dl,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Ul="function"===typeof Path2D;function $l(t,e,i,s){Ul&&!e.options.segment?zl(t,e,i,s):Nl(t,e,i,s)}class jl extends ur{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;Pn(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=ra(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=na(this,{property:e,start:s,end:s});if(!a.length)return;const o=[],r=Bl(i);let l,h;for(l=0,h=a.length;l"borderDash"!==t&&"fill"!==t});class Xl extends ur{constructor(t){super(),(0,jt.A)(this,"parsed",void 0),(0,jt.A)(this,"skip",void 0),(0,jt.A)(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)}},nh=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class ah extends ur{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=Xe(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=Ys(i.font),n=s.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:r}=sh(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 p=i+e/2+n.measureText(t.text).width;(0===g||l[l.length-1]+p+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:p,height:s},l[l.length-1]+=p+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,p=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=oh(i,e,n,t,s);a>0&&u+m+2*o>h&&(c+=d+o,l.push({width:d,height:u}),g+=d+o,p++,d=u=0),r[a]={left:g,top:u,col:p,width:f,height:m},d=Math.max(d,f),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=Gn(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Qi(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,o=Qi(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=Qi(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,o=Qi(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;Es(t,this),this._draw(),Ls(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:a}=t,o=ws.color,r=Gn(t.rtl,this.left,this.width),l=Ys(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:p,itemHeight:f}=sh(a,c),m=function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=$e(i.lineWidth,1);if(s.fillStyle=$e(i.fillStyle,o),s.lineCap=$e(i.lineCap,"butt"),s.lineDashOffset=$e(i.lineDashOffset,0),s.lineJoin=$e(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=$e(i.strokeStyle,o),s.setLineDash($e(i.lineDash,[])),a.usePointStyle){const o={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2),h=e+d;Ts(s,o,l,h,a.pointStyleWidth&&g)}else{const a=e+Math.max((c-p)/2,0),o=r.leftForLtr(t,g),l=qs(i.borderRadius);s.beginPath(),Object.values(l).some(t=>0!==t)?zs(s,{x:o,y:a,w:g,h:p,radius:l}):s.rect(o,a,g,p),s.fill(),0!==n&&s.stroke()}s.restore()},b=function(t,e,i){Bs(s,i.text,t,e+f/2,l,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})},x=this.isHorizontal(),y=this._computeTitleHeight();u=x?{x:Qi(n,this.left+h,this.right-i[0]),y:this.top+h+y,line:0}:{x:this.left+h,y:Qi(n,this.top+y+h,this.bottom-e[0].height),line:0},Jn(this.ctx,t.textDirection);const _=f+h;this.legendItems.forEach((o,c)=>{s.strokeStyle=o.fontColor,s.fillStyle=o.fontColor;const p=s.measureText(o.text).width,f=r.textAlign(o.textAlign||(o.textAlign=a.textAlign)),v=g+d+p;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=Qi(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=Qi(n,this.top+y+h,this.bottom-e[u.line].height));const C=r.x(k);if(m(C,w,o),k=Gi(f,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+=hh(o,t)+h}else u.y+=_}),Zn(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Ys(e.font),s=Ks(e.padding);if(!e.display)return;const n=Gn(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=Qi(t.align,c,this.right-d);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);h=l+Qi(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Qi(o,c,c+d);a.textAlign=n.textAlign(Yi(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=i.string,Bs(a,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Ys(t.font),i=Ks(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Ri(t,this.left,this.right)&&Ri(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 lh(t,e,i){let s=t;return"string"!==typeof e.text&&(s=hh(e,i)),s}function hh(t,e){const i=t.text?t.text.length:0;return e*i}function ch(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var dh={id:"legend",_element:ah,start(t,e,i){const s=t.legend=new ah({ctx:t.ctx,options:i,chart:t});Uo.configure(t,s,i),Uo.addBox(t,s)},stop(t){Uo.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;Uo.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=Ks(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 uh={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 fh(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 mh(t,e){const i=t.chart.ctx,{body:s,footer:n,title:a}=t,{boxWidth:o,boxHeight:r}=e,l=Ys(e.bodyFont),h=Ys(e.titleFont),c=Ys(e.footerFont),d=a.length,u=n.length,g=s.length,p=Ks(e.padding);let f=p.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&&(f+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(r,l.lineHeight):l.lineHeight;f+=g*t+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}u&&(f+=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,qe(t.title,y),i.font=l.string,qe(t.beforeBody.concat(t.afterBody),y),x=e.displayColors?o+2+e.boxPadding:0,qe(s,t=>{qe(t.before,y),qe(t.lines,y),qe(t.after,y)}),x=0,i.font=c.string,qe(t.footer,y),i.restore(),m+=p.width,{width:m,height:f}}function bh(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}function xh(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 yh(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"),xh(h,t,e,i)&&(h="center"),h}function _h(t,e,i){const s=i.yAlign||e.yAlign||bh(t,i);return{xAlign:i.xAlign||e.xAlign||yh(t,e,i,s),yAlign:s}}function vh(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}function kh(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}function wh(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}=qs(o);let p=vh(e,r);const f=kh(e,l,h);return"center"===l?"left"===r?p+=h:"right"===r&&(p-=h):"left"===r?p-=Math.max(c,u)+n:"right"===r&&(p+=Math.max(d,g)+n),{x:Vi(p,0,s.width-e.width),y:Vi(f,0,s.height-e.height)}}function Ch(t,e,i){const s=Ks(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Fh(t){return gh([],ph(t))}function Sh(t,e,i){return Js(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 Ah={beforeTitle:Oe,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);gh(e.before,ph(Ph(n,"beforeLabel",this,t))),gh(e.lines,Ph(n,"label",this,t)),gh(e.after,ph(Ph(n,"afterLabel",this,t))),s.push(e)}),s}getAfterBody(t,e){return Fh(Ph(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Ph(i,"beforeFooter",this,t),n=Ph(i,"footer",this,t),a=Ph(i,"afterFooter",this,t);let o=[];return o=gh(o,ph(s)),o=gh(o,ph(n)),o=gh(o,ph(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))),qe(l,e=>{const i=Mh(t.callbacks,e);s.push(Ph(i,"labelColor",this,e)),n.push(Ph(i,"labelPointStyle",this,e)),a.push(Ph(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=uh[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=mh(this,i),o=Object.assign({},t,e),r=_h(this.chart,i,o),l=wh(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}=qs(o),{x:d,y:u}=t,{width:g,height:p}=e;let f,m,b,x,y,_;return"center"===n?(y=u+p/2,"left"===s?(f=d,m=f-a,x=y+a,_=y-a):(f=d+g,m=f+a,x=y-a,_=y+a),b=f):(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,f=m-a,b=m+a):(x=u+p,y=x+a,f=m+a,b=m-a),_=x),{x1:f,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=Gn(i.rtl,this.x,this.width);for(t.x=Ch(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",a=Ys(i.titleFont),o=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,r=0;r0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,zs(t,{x:e,y:g,w:l,h:r,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),zs(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=Ys(i.bodyFont);let d=c.lineHeight,u=0;const g=Gn(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+u),t.y+d/2),t.y+=d+n},f=g.textAlign(a);let m,b,x,y,_,v,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=Ch(this,f,i),e.fillStyle=i.bodyColor,qe(this.beforeBody,p),u=o&&"right"!==f?"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=uh[t.position].call(this,this._active,this._eventPosition);if(!i)return;const a=this._size=mh(this,t),o=Object.assign({},i,this._size),r=_h(e,t,o),l=wh(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=Ks(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),Jn(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Zn(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=!Ke(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||!Ke(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=uh[n.position].call(this,t,e);return!1!==a&&(i!==a.x||s!==a.y)}}(0,jt.A)(Th,"positioners",uh);var Dh={id:"tooltip",_element:Th,positioners:uh,afterInit(t,e,i){i&&(t.tooltip=new Th({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:Ah},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 Eh=(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 Eh(t,e,i,s);const a=t.lastIndexOf(e);return n!==a?i:n}const Ih=(t,e)=>null===t?null:Vi(Math.round(t),0,e);function Vh(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 Rh(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,p=c-1,{min:f,max:m}=e,b=!We(o),x=!We(r),y=!We(h),_=(m-f)/(d+1);let v,k,w,C,F=vi((m-f)/p/g)*g;if(Fp&&(F=vi(C*F/p/g)*g),We(l)||(v=Math.pow(10,l),F=Math.ceil(F*v)/v),"ticks"===n?(k=Math.floor(f/F)*F,w=Math.ceil(m/F)*F):(k=f,w=m),b&&x&&a&&Fi((r-o)/a,F/1e3)?(C=Math.round(Math.min((r-o)/F,c)),F=(r-o)/C,k=o,w=r):y?(k=b?o:k,w=x?r:w,C=h-1,F=(w-k)/C):(C=(w-k)/F,C=_i(C,Math.round(C),F/1e3)?Math.round(C):Math.ceil(C));const S=Math.max(Pi(F),Pi(k));v=Math.pow(10,We(l)?S:l),k=Math.round(k*v)/v,w=Math.round(w*v)/v;let M=0;for(b&&(u&&k!==o?(i.push({value:o}),kr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&_i(i[i.length-1].value,r,Wh(r,_,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}function Wh(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)}(0,jt.A)(Oh,"id","category"),(0,jt.A)(Oh,"defaults",{ticks:{callback:Vh}});class Bh extends Er{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 We(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=yi(s),e=yi(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=Rh(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 gs(t,this.chart.options.locale,this.options.ticks.format)}}class zh extends Bh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ne(t)?t:0,this.max=Ne(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}}(0,jt.A)(zh,"id","linear"),(0,jt.A)(zh,"defaults",{ticks:{callback:ms.formatters.numeric}});const Nh=t=>Math.floor(xi(t)),Uh=(t,e)=>Math.pow(10,Nh(t)+e);function $h(t){const e=t/Math.pow(10,Nh(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 Hh(t,e){const i=e-t;let s=Nh(i);while(jh(t,e,s)>10)s++;while(jh(t,e,s)<10)s--;return Math.min(s,Nh(t))}function Xh(t,{min:e,max:i}){e=Ue(t.min,e);const s=[],n=Nh(e);let a=Hh(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=Ue(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=Ue(t.max,u);return s.push({value:g,major:$h(g),significand:d}),s}class qh extends Er{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Bh.prototype.parse.apply(this,[t,e]);if(0!==i)return Ne(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ne(t)?Math.max(0,t):null,this.max=Ne(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ne(this._userMin)&&(this.min=t===Uh(this.min,0)?Uh(this.min,-1):Uh(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(Uh(i,-1)),a(Uh(s,1)))),i<=0&&n(Uh(s,-1)),s<=0&&a(Uh(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},i=Xh(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":gs(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=xi(t),this._valueRange=xi(this.max)-xi(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(xi(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function Kh(t){const e=t.ticks;if(e.display&&t.display){const t=Ks(e.backdropPadding);return $e(e.font&&e.font.size,ws.font.size)+t.height}return 0}function Yh(t,e,i){return i=Be(i)?i:[i],{w:Ss(t,e.string,i),h:i.length*e.lineHeight}}function Qh(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 Gh(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?ci/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 Zh(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(Ai(Li(l.angle+fi))),c=nc(l.y,r.h,h),d=ic(h),u=sc(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 tc(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:a}=t,o=Ds({x:i,y:s},e)||Ds({x:i,y:a},e)||Ds({x:n,y:s},e)||Ds({x:n,y:a},e);return!o}function ec(t,e,i){const s=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:r}=a.pointLabels,l={extra:Kh(a)/2,additionalAngle:o?ci/n:0};let h;for(let c=0;c270||i<90)&&(t-=e),t}function ac(t,e,i){const{left:s,top:n,right:a,bottom:o}=i,{backdropColor:r}=e;if(!We(r)){const i=qs(e.borderRadius),l=Ks(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(),zs(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function oc(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));ac(i,a,e);const o=Ys(a.font),{x:r,y:l,textAlign:h}=e;Bs(i,t._pointLabels[n],r,l+o.lineHeight/2,o,{color:a.color,textAlign:h,textBaseline:"middle"})}}function rc(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,di);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let a=1;a{const i=Xe(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?Gh(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=di/(this._pointLabels.length||1),i=this.options.startAngle||0;return Li(t*e+Mi(i))}getDistanceFromCenterForValue(t){if(We(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(We(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);lc(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=Ys(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=Ks(r.backdropPadding);t.fillRect(-a/2-e.left,-n-l.size/2-e.top,a+e.width,l.size+e.height)}Bs(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,jt.A)(cc,"id","radialLinear"),(0,jt.A)(cc,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ms.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,jt.A)(cc,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,jt.A)(cc,"descriptors",{angleLines:{_fallback:"grid"}});const dc={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}},uc=Object.keys(dc);function gc(t,e){return t-e}function pc(t,e){if(We(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)),Ne(o)||(o="string"===typeof s?i.parse(o,s):i.parse(o)),null===o?null:(n&&(o="week"!==n||!Ci(a)&&!0!==a?i.startOf(o,n):i.startOf(o,"isoWeek",a)),+o)}function fc(t,e,i,s){const n=uc.length;for(let a=uc.indexOf(t);a=uc.indexOf(i);a--){const i=uc[a];if(dc[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return uc[i?uc.indexOf(i):0]}function bc(t){for(let e=uc.indexOf(t)+1,i=uc.length;e=e?i[s]:i[n];t[a]=!0}}else t[e]=!0}function yc(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 _c(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=Vi(s,0,a),n=Vi(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||fc(n.minUnit,e,i,this._getLabelCapacity(e)),o=$e(s.ticks.stepSize,1),r="week"===a&&n.isoWeekday,l=Ci(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 Xe(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}=Bi(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}=Bi(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}(0,jt.A)(vc,"id","time"),(0,jt.A)(vc,"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 wc extends vc{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=kc(e,this.min),this._tableRange=kc(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(kc(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return kc(this._table,i*this._tableRange+this._minPos,!0)}}(0,jt.A)(wc,"id","timeseries"),(0,jt.A)(wc,"defaults",vc.defaults);var Cc=i(144);const Fc={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},...Fc,...Sc},Ac="2"===s.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Pc(t){return(0,Cc.ju)(t)?(0,Cc.ux)(t):t}function Tc(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Cc.ju)(e)?new Proxy(t,{}):t}function Dc(t,e){const i=t.options;i&&e&&Object.assign(i,e)}function Ec(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 Ic(t,e){const i={labels:[],datasets:[]};return Ec(i,t.labels),Lc(i,t.datasets,e),i}const Vc=(0,s.pM)({props:Mc,setup(t,e){let{expose:i,slots:n}=e;const a=(0,Cc.KR)(null),o=(0,Cc.IJ)(null);i({chart:o});const r=()=>{if(!a.value)return;const{type:e,data:i,options:s,plugins:n,datasetIdKey:r}=t,l=Ic(i,r),h=Tc(l,i);o.value=new vl(a.value,{type:e,data:h,options:{...s},plugins:n})},l=()=>{const e=(0,Cc.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,Cc.ux)(o.value);if(!c)return;let d=!1;if(n){const t=Pc(n),e=Pc(r);t&&t!==e&&(Dc(c,t),d=!0)}if(a){const e=Pc(a.labels),i=Pc(l.labels),s=Pc(a.datasets),n=Pc(l.datasets);e!==i&&(Ec(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 Oc(t,e){return vl.register(e),(0,s.pM)({props:Fc,setup(e,i){let{expose:n}=i;const a=(0,Cc.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,s.h)(Vc,Ac({ref:o},{type:t,...e}))}})}const Rc=Oc("doughnut",ro);i(6573),i(8100),i(7936),i(9577),i(1549),i(9797),i(9631),i(5623),i(4603),i(7566),i(8721);class Wc extends Error{constructor(t,e,i=!1,s=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=i,this.suggestion=s}}const Bc={401:()=>new Wc("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new Wc("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new Wc(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new Wc("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new Wc("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new Wc("操作已取消","ABORTED",!1,"")};function zc(t,e=""){if("AbortError"===t.name)return Bc.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const i=Bc[t.status];return i?i(e):new Wc(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?Bc.NETWORK():new Wc(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class Nc{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let i=null,s=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(i,t);e.push(...a.records),i=a.nextCursor,s+=a.records.length,n++,this.onProgress({phase:"fetching",current:s,batchCount:n,message:`已获取 ${s} 条记录...`})}while(i&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw Bc.ABORT();return e}catch(a){const t=a instanceof Wc?a:zc(a);throw this.onError(t),t}}async fetchBatch(t,e){const i=new URLSearchParams;t&&i.set("cursor",t),e&&i.set("includeValue","true"),i.set("limit",String(this.batchSize));try{const t=await(0,Ut.A)(`/api/manage/batch/list?${i}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const i=await t.json();e=i.error||""}catch{}throw zc(t,e)}const e=await t.json();if(!e.success)throw new Wc(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(s){if(s instanceof Wc)throw s;throw zc(s)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var Uc=Nc;class $c{constructor(t={}){this.chunkSize=t.chunkSize||5e3,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async rebuild(){this.aborted=!1;try{this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new Uc({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new Wc("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new Wc("操作已取消","ABORTED",!1,"");const i=this.splitIntoChunks(e);for(let s=0;s{const i=t.metadata&&t.metadata.TimeStamp||0,s=e.metadata&&e.metadata.TimeStamp||0;return s-i})}splitIntoChunks(t){const e=[];for(let i=0;it.toString(16).padStart(2,"0")).join("")}createHttpError(t,e=""){switch(t){case 401:return new Wc("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new Wc("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new Wc(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new Wc("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new Wc("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new Wc(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var jc=$c;class Hc{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new Uc({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:$t.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const i=await this.fetchSettings();e.data.settings=i,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const s=Object.keys(i).length;return{success:!0,fileCount:t.length,settingsCount:s}}async fetchSettings(){try{const t=await(0,Ut.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),i=new Blob([e],{type:"application/json"}),s=URL.createObjectURL(i),n=document.createElement("a");n.href=s,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(s)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var Xc=Hc;class qc{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new Wc("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:i={}}=t.data,s=Object.entries(e),n=Object.entries(i),a=s.length,o=n.length,r=a+o;let l=0,h=0,c=0,d=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:r});const e=this.splitIntoChunks(s,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var Kc=qc;vl.register(Dl,Dh,dh);var Yc={name:"SysCogStatus",components:{Doughnut:Rc},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:$t.rE,loadErrors:{newest:!1,oldest:!1},channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},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.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[i,s]of Object.entries(t)){const t="Block"===i?"已屏蔽":"正常";e[t]=(e[t]||0)+s}return e},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,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}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const i=t/e,s=i-t;if(s<=0)return"即将完成";const n=Math.ceil(s/1e3);if(n<60)return`约 ${n} 秒`;const a=Math.ceil(n/60);if(a<60)return`约 ${a} 分钟`;const o=Math.floor(a/60),r=a%60;return`约 ${o} 小时 ${r} 分钟`},phaseDescription(){const t={fetching:"正在获取数据",sorting:"正在排序",uploading:"正在上传",finalizing:"正在完成",building:"正在构建备份",downloading:"正在生成下载",restoring_files:"正在恢复文件",restoring_settings:"正在恢复设置",completed:"已完成",retrying:"正在重试"};return t[this.processingPhase]||this.processingPhase}},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,Ut.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(){if(this.isProcessing)this.$message.warning("已有操作正在进行中");else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new jc({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(`索引重建完成!共处理 ${t.totalFiles.toLocaleString()} 个文件`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning("已有操作正在进行中");else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new Xc({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?`,${t.settingsCount} 个设置项`:"";this.$message.success(`备份完成!共备份 ${t.fileCount.toLocaleString()} 个文件${e}`)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},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){if(this.isProcessing)this.$message.warning("已有操作正在进行中");else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const i=await t.text();let s;try{s=JSON.parse(i)}catch(e){throw new Error("备份文件格式无效,请选择有效的 JSON 文件")}this.currentRestoreProcessor=new Kc({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(s);this.$message.success(`恢复完成!已恢复 ${n.restoredFiles} 个文件和 ${n.restoredSettings} 个设置项`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(i){if(console.error("恢复数据失败:",i),"ABORTED"!==i.code){const t=i.suggestion?`${i.message}。${i.suggestion}`:i.message;this.$message.error("恢复数据失败: "+t),this.processingError={message:i.message,suggestion:i.suggestion,recoverable:i.recoverable}}}finally{this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null}}},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)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id,"_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info("正在取消索引重建...")),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info("正在取消备份...")),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info("正在取消恢复..."))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const Qc=(0,c.A)(Yc,[["render",Nt],["__scopeId","data-v-1132f6a8"]]);var Gc=Qc,Jc=i(9869),Zc=(i(415),i(3565),i(9267)),td=(i(5616),i(2006)),ed=i(1418),id=(i(333),i(9623)),sd=(i(6711),i(6018)),nd=(i(6808),i(200),i(5558)),ad=(i(8075),i(2687)),od=(i(8785),i(5130));const rd=["onClick"];function ld(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:i.width})},[(0,s.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>r.toggleDropdown&&r.toggleDropdown(...t))},[(0,s.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!i.modelValue}])},(0,n.v_)(r.displayLabel),3),(0,s.bF)(l,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,s.bF)(od.eB,{name:"dropdown-fade"},{default:(0,s.k6)(()=>[(0,s.bo)((0,s.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,od.D$)(()=>{},["stop"]))},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(i.options,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":i.modelValue===e.value}]),onClick:t=>r.selectOption(e.value)},[(0,s.RG)(t.$slots,"option",{option:e},()=>[e.icon?((0,s.uX)(),(0,s.Wv)(l,{key:0,icon:e.icon,class:"option-icon"},null,8,["icon"])):(0,s.Q3)("",!0),(0,s.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,rd))),128))],512),[[od.aG,o.isOpen]])]),_:3})],6)}var hd={name:"CustomSelect",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:"请选择"},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.placeholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const cd=(0,c.A)(hd,[["render",ld],["__scopeId","data-v-6c59d112"]]);var dd=cd;const ud={class:"upload-settings"},gd={class:"page-header"},pd={class:"first-title"},fd={class:"header-actions"},md={class:"group-header"},bd={class:"group-title"},xd={key:0,class:"load-balance-switch"},yd={key:0,class:"channel-cards"},_d=["onMousemove","onMouseleave"],vd={class:"card-header"},kd={class:"card-title"},wd={class:"channel-name"},Cd={class:"card-body"},Fd={class:"card-info"},Sd={class:"info-item"},Md={class:"info-text"},Ad={key:0,class:"info-item"},Pd={class:"info-text"},Td={key:1,class:"info-item"},Dd=["title"],Ed={class:"info-item"},Ld={class:"info-text"},Id={key:0,class:"info-item"},Vd=["title"],Od={class:"info-item"},Rd={class:"info-text"},Wd={class:"info-item"},Bd={class:"info-text"},zd={class:"info-item"},Nd={class:"info-text"},Ud={key:0,class:"quota-mini"},$d={class:"quota-text"},jd={class:"card-actions"},Hd={key:1,class:"empty-tip"},Xd={class:"form-warning"},qd={class:"quota-label"},Kd={class:"quota-status"};function Yd(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=dd,d=k.S2,u=ad.u,g=nd.qi,f=w.ve,m=sd.P9,b=sd.AV,x=td.xE,y=id.WK,v=ed.lq,C=td.US,F=Zc.kZ,S=Jc.MF,M=Jc.TS,A=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",ud,[(0,s.Lk)("div",gd,[(0,s.Lk)("h3",pd,[e[59]||(e[59]=(0,s.eW)(" 上传渠道管理 ",-1)),(0,s.bF)(h,{content:"管理所有上传渠道的配置,点击卡片查看详情或编辑",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",class:"help-icon"})]),_:1})]),(0,s.Lk)("div",fd,[(0,s.bF)(c,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:r.filterOptions,placeholder:"筛选渠道类型",width:"160px"},null,8,["modelValue","options"]),(0,s.bF)(d,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"plus",style:{"margin-right":"6px"}}),e[60]||(e[60]=(0,s.eW)(" 添加渠道 ",-1))]),_:1})])]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.filteredChannels,t=>((0,s.uX)(),(0,s.CE)("div",{key:t.value,class:"channel-group"},[(0,s.Lk)("div",md,[(0,s.Lk)("div",bd,[(0,s.bF)(l,{icon:r.getChannelIcon(t.value),class:"group-icon"},null,8,["icon"]),(0,s.Lk)("span",null,(0,n.v_)(t.label),1),(0,s.bF)(u,{size:"small",type:"info",class:"channel-count"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getChannelList(t.value).length),1)]),_:2},1024)]),r.hasLoadBalance(t.value)?((0,s.uX)(),(0,s.CE)("div",xd,[e[61]||(e[61]=(0,s.Lk)("span",{class:"switch-label"},"负载均衡",-1)),(0,s.bF)(g,{modelValue:r.getSettings(t.value).loadBalance.enabled,"onUpdate:modelValue":e=>r.getSettings(t.value).loadBalance.enabled=e,size:"small",onChange:r.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,s.Q3)("",!0)]),r.getChannelList(t.value).length>0?((0,s.uX)(),(0,s.CE)("div",yd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.getChannelList(t.value),(i,a)=>((0,s.uX)(),(0,s.CE)("div",{key:i.name||a,class:(0,n.C4)(["channel-card",[t.value,{disabled:!i.enabled,fixed:i.fixed}]]),onMousemove:e=>r.handleCardMouseMove(e,t.value,a),onMouseleave:e=>r.handleCardMouseLeave(t.value,a)},[(0,s.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${t.value}-${a}`},null,512),(0,s.Lk)("div",vd,[(0,s.Lk)("div",kd,[(0,s.Lk)("span",wd,(0,n.v_)(i.name||"未命名渠道"),1),i.fixed?((0,s.uX)(),(0,s.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,s.k6)(()=>[...e[62]||(e[62]=[(0,s.eW)("环境变量",-1)])]),_:1})):(0,s.Q3)("",!0)]),(0,s.bF)(g,{modelValue:i.enabled,"onUpdate:modelValue":t=>i.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,od.D$)(()=>{},["stop"])),onChange:r.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,s.Lk)("div",Cd,[(0,s.Lk)("div",Fd,["telegram"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.Lk)("div",Sd,[(0,s.bF)(l,{icon:"robot",class:"info-icon"}),(0,s.Lk)("span",Md,"Bot: "+(0,n.v_)(r.maskText(i.botToken)),1)]),i.chatId?((0,s.uX)(),(0,s.CE)("div",Ad,[(0,s.bF)(l,{icon:"comments",class:"info-icon"}),(0,s.Lk)("span",Pd,"Channel: "+(0,n.v_)(r.maskText(i.chatId)),1)])):(0,s.Q3)("",!0)],64)):"cfr2"===t.value?((0,s.uX)(),(0,s.CE)("div",Td,[(0,s.bF)(l,{icon:"link",class:"info-icon"}),(0,s.Lk)("span",{class:"info-text",title:i.publicUrl},(0,n.v_)(i.publicUrl||"未设置公开链接"),9,Dd)])):"s3"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:2},[(0,s.Lk)("div",Ed,[(0,s.bF)(l,{icon:"server",class:"info-icon"}),(0,s.Lk)("span",Ld,(0,n.v_)(i.bucketName||"未设置"),1)]),i.endpoint?((0,s.uX)(),(0,s.CE)("div",Id,[(0,s.bF)(l,{icon:"link",class:"info-icon"}),(0,s.Lk)("span",{class:"info-text",title:i.endpoint},(0,n.v_)(i.endpoint),9,Vd)])):(0,s.Q3)("",!0)],64)):"discord"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.Lk)("div",Od,[(0,s.bF)(l,{icon:"robot",class:"info-icon"}),(0,s.Lk)("span",Rd,"Bot: "+(0,n.v_)(r.maskText(i.botToken)),1)]),(0,s.Lk)("div",Wd,[(0,s.bF)(l,{icon:"hashtag",class:"info-icon"}),(0,s.Lk)("span",Bd,"Channel: "+(0,n.v_)(r.maskText(i.channelId)),1)]),i.isNitro?((0,s.uX)(),(0,s.Wv)(u,{key:0,size:"small",type:"success"},{default:(0,s.k6)(()=>[...e[63]||(e[63]=[(0,s.eW)("Nitro",-1)])]),_:1})):(0,s.Q3)("",!0)],64)):"huggingface"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:4},[(0,s.Lk)("div",zd,[(0,s.bF)(l,{icon:"database",class:"info-icon"}),(0,s.Lk)("span",Nd,(0,n.v_)(i.repo||"未设置仓库"),1)]),i.isPrivate?((0,s.uX)(),(0,s.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,s.k6)(()=>[...e[64]||(e[64]=[(0,s.eW)("私有",-1)])]),_:1})):(0,s.Q3)("",!0)],64)):(0,s.Q3)("",!0)]),i.quota?.enabled?((0,s.uX)(),(0,s.CE)("div",Ud,[(0,s.bF)(f,{percentage:r.getQuotaPercentage(i),status:r.getQuotaStatus(i),"stroke-width":6},null,8,["percentage","status"]),(0,s.Lk)("span",$d,(0,n.v_)(r.getQuotaText(i)),1)])):(0,s.Q3)("",!0)]),(0,s.Lk)("div",jd,[(0,s.bF)(d,{text:"",type:"primary",size:"small",onClick:e=>r.openDetailDialog(t.value,a)},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"eye",style:{"margin-right":"4px"}}),e[65]||(e[65]=(0,s.eW)("详情 ",-1))]),_:1},8,["onClick"]),(0,s.bF)(d,{text:"",type:"primary",size:"small",onClick:e=>r.openEditDialog(t.value,a)},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"edit",style:{"margin-right":"4px"}}),e[66]||(e[66]=(0,s.eW)("编辑 ",-1))]),_:1},8,["onClick"]),(0,s.bF)(d,{text:"",type:"danger",size:"small",onClick:e=>r.deleteChannel(t.value,a),disabled:i.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt",style:{"margin-right":"4px"}}),e[67]||(e[67]=(0,s.eW)("删除 ",-1))]),_:1},8,["onClick","disabled"])])],42,_d))),128))])):((0,s.uX)(),(0,s.CE)("div",Hd,[(0,s.bF)(l,{icon:"inbox",class:"empty-icon"}),(0,s.Lk)("span",null,"暂无 "+(0,n.v_)(t.label)+" 渠道",1)]))]))),128)),(0,s.bF)(F,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[26]||(e[26]=t=>o.showAddDialog=t),title:"添加新渠道",class:"channel-dialog","destroy-on-close":"",onClosed:r.resetAddForm},{footer:(0,s.k6)(()=>[(0,s.bF)(d,{onClick:e[25]||(e[25]=t=>o.showAddDialog=!1)},{default:(0,s.k6)(()=>[...e[73]||(e[73]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(d,{type:"primary",onClick:r.confirmAddChannel},{default:(0,s.k6)(()=>[...e[74]||(e[74]=[(0,s.eW)("确认添加",-1)])]),_:1},8,["onClick"])]),default:(0,s.k6)(()=>[(0,s.bF)(C,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:o.addRules},{default:(0,s.k6)(()=>[(0,s.bF)(x,{label:"渠道类型",prop:"type"},{default:(0,s.k6)(()=>[(0,s.bF)(b,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:"请选择渠道类型",style:{width:"100%"},onChange:r.onChannelTypeChange},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.addableChannels,t=>((0,s.uX)(),(0,s.Wv)(m,{key:t.value,label:t.label,value:t.value},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:r.getChannelIcon(t.value),class:"select-option-icon"},null,8,["icon"]),(0,s.eW)(" "+(0,n.v_)(t.label),1)]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","onChange"])]),_:1}),(0,s.bF)(x,{label:"渠道名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:"请输入渠道名称"},null,8,["modelValue"])]),_:1}),"telegram"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:"请输入 Bot Token"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:"请输入 Chat ID"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:"可选,例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1})],64)):"s3"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bF)(x,{label:"Endpoint",prop:"endpoint"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:"例如: https://s3.us-east-005.backblazeb2.com"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"CDN 域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com"},null,8,["modelValue"]),e[68]||(e[68]=(0,s.Lk)("span",{class:"form-tip"},"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本",-1))]),_:1}),(0,s.bF)(x,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:"请输入存储桶名称"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:"默认填写 auto"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:"请输入访问密钥 ID"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:"请输入机密访问密钥"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"路径风格"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"]),e[69]||(e[69]=(0,s.Lk)("span",{class:"form-tip"},"使用 OpenList 时需开启",-1))]),_:1}),(0,s.bF)(x,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1}),o.newChannel.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"停用阈值 (%)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:2},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:"请输入 Bot Token"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:"请输入 Channel ID"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:"可选,例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Nitro 会员"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"]),e[70]||(e[70]=(0,s.Lk)("span",{class:"form-tip"},"会员单文件限制 25MB,否则为 10MB",-1))]),_:1}),(0,s.Lk)("div",Xd,[(0,s.bF)(l,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),e[71]||(e[71]=(0,s.eW)(" Discord 有接口频率限制,不建议将其用作大规模并发场景 ",-1))])],64)):"huggingface"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.bF)(x,{label:"仓库名",prop:"repo"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:"格式: username/repo-name"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Access Token",prop:"token"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:"请输入 Access Token"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"私有仓库"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"]),e[72]||(e[72]=(0,s.Lk)("span",{class:"form-tip"},"私有仓库限制 100GB",-1))]),_:1})],64)):(0,s.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","onClosed"]),(0,s.bF)(F,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[28]||(e[28]=t=>o.showDetailDialog=t),title:"渠道详情 - "+(o.currentChannel?.name||""),class:"channel-dialog",onClosed:r.resetDetailData},{footer:(0,s.k6)(()=>[(0,s.bF)(d,{onClick:e[27]||(e[27]=t=>o.showDetailDialog=!1)},{default:(0,s.k6)(()=>[...e[77]||(e[77]=[(0,s.eW)("关闭",-1)])]),_:1}),(0,s.bF)(d,{type:"primary",onClick:r.openEditFromDetail},{default:(0,s.k6)(()=>[...e[78]||(e[78]=[(0,s.eW)("编辑",-1)])]),_:1},8,["onClick"])]),default:(0,s.k6)(()=>[(0,s.bF)(M,{column:1,border:""},{default:(0,s.k6)(()=>[(0,s.bF)(S,{label:"渠道名称"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1}),(0,s.bF)(S,{label:"渠道类型"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getChannelTypeLabel(o.currentChannelType)),1)]),_:1}),(0,s.bF)(S,{label:"状态"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.enabled?"已启用":"已禁用"),1)]),_:1},8,["type"])]),_:1}),o.currentChannel?.fixed?((0,s.uX)(),(0,s.Wv)(S,{key:0,label:"配置来源"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{type:"warning"},{default:(0,s.k6)(()=>[...e[75]||(e[75]=[(0,s.eW)("环境变量",-1)])]),_:1})]),_:1})):(0,s.Q3)("",!0),"telegram"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bF)(S,{label:"Bot Token"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.botToken,10)),1)]),_:1}),(0,s.bF)(S,{label:"Chat ID"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.chatId,6)),1)]),_:1}),(0,s.bF)(S,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.proxyUrl||"未设置"),1)]),_:1})],64)):"cfr2"===o.currentChannelType?((0,s.uX)(),(0,s.Wv)(S,{key:2,label:"公开访问链接"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{"model-value":o.currentChannel?.publicUrl||"未设置",readonly:""},null,8,["model-value"])]),_:1})):"s3"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.bF)(S,{label:"Endpoint"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1}),(0,s.bF)(S,{label:"CDN 域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{"model-value":o.currentChannel?.cdnDomain||"未设置",readonly:""},null,8,["model-value"])]),_:1}),(0,s.bF)(S,{label:"存储桶名称"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1}),(0,s.bF)(S,{label:"存储桶区域"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1}),(0,s.bF)(S,{label:"路径风格"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.pathStyle?"是":"否"),1)]),_:1})],64)):"discord"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:4},[(0,s.bF)(S,{label:"Bot Token"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.botToken,10)),1)]),_:1}),(0,s.bF)(S,{label:"Channel ID"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.channelId,6)),1)]),_:1}),(0,s.bF)(S,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.proxyUrl||"未设置"),1)]),_:1}),(0,s.bF)(S,{label:"Nitro 会员"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.isNitro?"是":"否"),1)]),_:1})],64)):"huggingface"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:5},[(0,s.bF)(S,{label:"仓库名"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1}),(0,s.bF)(S,{label:"私有仓库"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.isPrivate?"是":"否"),1)]),_:1})],64)):(0,s.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:6},[(0,s.bF)(S,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1}),(0,s.bF)(S,{label:"停用阈值"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1}),(0,s.bF)(S,null,{label:(0,s.k6)(()=>[(0,s.Lk)("span",qd,[e[76]||(e[76]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(d,{link:"",type:"primary",onClick:r.refreshQuota,class:"refresh-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Kd,[(0,s.bF)(f,{percentage:r.getQuotaPercentage(o.currentChannel),status:r.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>r.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(r.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,s.bF)(F,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[58]||(e[58]=t=>o.showEditDialog=t),title:"编辑渠道 - "+(o.editChannel?.name||""),class:"channel-dialog","destroy-on-close":"",onClosed:r.resetEditData},{footer:(0,s.k6)(()=>[(0,s.bF)(d,{onClick:e[57]||(e[57]=t=>o.showEditDialog=!1)},{default:(0,s.k6)(()=>[...e[80]||(e[80]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(d,{type:"primary",onClick:r.confirmEditChannel},{default:(0,s.k6)(()=>[...e[81]||(e[81]=[(0,s.eW)("保存修改",-1)])]),_:1},8,["onClick"])]),default:(0,s.k6)(()=>[(0,s.bF)(C,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:o.editRules},{default:(0,s.k6)(()=>[(0,s.bF)(x,{label:"渠道名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editChannel.name=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"启用渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1}),"telegram"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[31]||(e[31]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[32]||(e[32]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[33]||(e[33]=t=>o.editChannel.proxyUrl=t),placeholder:"例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1})],64)):"cfr2"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bF)(x,{label:"公开访问链接"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[34]||(e[34]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[35]||(e[35]=t=>o.editChannel.quota.enabled=t),onChange:e[36]||(e[36]=t=>r.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1}),o.editChannel.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[37]||(e[37]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"停用阈值 (%)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:2},[(0,s.bF)(x,{label:"Endpoint",prop:"endpoint"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"CDN 域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.cdnDomain=t),placeholder:"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com"},null,8,["modelValue"]),e[79]||(e[79]=(0,s.Lk)("span",{class:"form-tip"},"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本",-1))]),_:1}),(0,s.bF)(x,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"路径风格"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[45]||(e[45]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.enabled=t),onChange:e[47]||(e[47]=t=>r.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1}),o.editChannel.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"停用阈值 (%)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.proxyUrl=t),placeholder:"例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Nitro 会员"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1})],64)):"huggingface"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:4},[(0,s.bF)(x,{label:"仓库名",prop:"repo"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"Access Token",prop:"token"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"私有仓库"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[56]||(e[56]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[A,o.loading]])}var Qd={components:{CustomSelect:dd},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1},addRules:{type:[{required:!0,message:"请选择渠道类型",trigger:"change"}],name:[{required:!0,message:"请输入渠道名称",trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:"渠道名称只能包含中英文、数字、下划线和横线",trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",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"}],repo:[{required:!0,message:"请输入仓库名",trigger:"blur"}],token:[{required:!0,message:"请输入 Access Token",trigger:"blur"}]},editRules:{name:[{required:!0,message:"请输入渠道名称",trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:"渠道名称只能包含中英文、数字、下划线和横线",trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",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"}],repo:[{required:!0,message:"请输入仓库名",trigger:"blur"}],token:[{required:!0,message:"请输入 Access Token",trigger:"blur"}]},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){const t={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot"};return[{value:"",label:"全部类型"},...this.channels.map(e=>({value:e.value,label:e.label,icon:t[e.value]||"server"}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels}},methods:{handleCardMouseMove(t,e,i){const s=t.currentTarget,n=s.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,r=`glow-${e}-${i}`,l=this.$refs[r];l&&l[0]&&(l[0].style.opacity="1",l[0].style.left=`${a}px`,l[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const i=`glow-${t}-${e}`,s=this.$refs[i];s&&s[0]&&(s[0].style.opacity="0")},getChannelIcon(t){const e={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot"};return e[t]||"server"},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):"未设置"},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const i=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(i)),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:i}=this.newChannel,s=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env"];if(n.includes(i))return void this.$message.warning("该名称为系统保留名称,请使用其他名称");const a=s.channels.some(t=>t.name===i);if(a)return void this.$message.warning("该类型下已存在同名渠道,请使用其他名称");let o={id:s.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};"telegram"===e?Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl}):"s3"===e?Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}}):"discord"===e?Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro}):"huggingface"===e&&Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate}),s.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),i=this.editChannel.name,s=this.currentChannelIndex,n=this.editChannel.fixed;if(!n){const t=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env"];if(t.includes(i))return void this.$message.warning("该名称为系统保留名称,请使用其他名称");const n=e.channels.some((t,e)=>e!==s&&t.name===i);if(n)return void this.$message.warning("该类型下已存在同名渠道,请使用其他名称")}e.channels[this.currentChannelIndex]={...this.editChannel},this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const i=this.getChannelList(t)[e];i.fixed?this.$message.warning("环境变量配置的渠道无法删除"):this.$confirm("确定要删除该渠道吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{const i=this.getSettings(t);i.channels.splice(e,1),i.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings};(0,Ut.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success("设置已保存")})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Ut.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Ut.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,Ut.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,Ut.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,Ut.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:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Gd=(0,c.A)(Qd,[["render",Yd],["__scopeId","data-v-89234e52"]]);var Jd=Gd,Zd=i(850);i(8736);const tu={class:"save-text"};function eu(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":i.loading}]),onClick:e[0]||(e[0]=(...t)=>r.handleClick&&r.handleClick(...t))},[i.loading?((0,s.uX)(),(0,s.Wv)(l,{key:0,icon:"spinner",spin:""})):((0,s.uX)(),(0,s.Wv)(l,{key:1,icon:"save"})),(0,s.Lk)("span",tu,(0,n.v_)(i.loading?"保存中":"保存"),1)],2)}var iu={name:"FloatingSaveButton",props:{loading:{type:Boolean,default:!1}},methods:{handleClick(){this.loading||this.$emit("click")}}};const su=(0,c.A)(iu,[["render",eu],["__scopeId","data-v-26e68e9c"]]);var nu=su,au=i(7138);i(5802),i(4752);const ou={class:"security-settings"},ru={class:"first-settings"},lu={class:"second-title token-title"},hu={class:"token-actions"},cu={class:"token-table-container"},du={class:"table-cell-content"},uu={class:"table-cell-content"},gu={class:"token-display"},pu={class:"table-cell-content"},fu={class:"table-cell-content"},mu={class:"table-cell-content action-buttons"},bu={class:"first-settings"},xu={class:"second-title"},yu={class:"first-settings"},_u={class:"dialog-footer"},vu={class:"dialog-footer"},ku={class:"token-result"},wu={style:{"margin-bottom":"15px",color:"#e6a23c"}},Cu={class:"dialog-footer"};function Fu(t,e,i,a,o,r){const l=id.WK,h=td.xE,c=td.US,d=(0,s.g2)("font-awesome-icon"),u=k.S2,g=au.o8,f=ad.u,m=au.Up,b=p.R7,x=nd.qi,y=sd.P9,v=sd.AV,w=nu,C=Zd.dI,F=Zd.o5,S=Zc.kZ,M=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",ou,[(0,s.Lk)("div",ru,[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)(od.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)(od.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",lu,[e[23]||(e[23]=(0,s.eW)("API Token 管理 ",-1)),(0,s.Lk)("a",hu,[(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",cu,[(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",du,(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",uu,[(0,s.Lk)("span",gu,(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",pu,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.row.permissions,t=>((0,s.uX)(),(0,s.Wv)(f,{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",fu,(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",mu,[(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"])),[[M,o.tokenLoading]])])]),(0,s.Lk)("div",bu,[e[30]||(e[30]=(0,s.Lk)("h3",{class:"first-title"},"上传管理",-1)),(0,s.Lk)("h4",xu,[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",yu,[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.bF)(w,{onClick:r.saveSettings},null,8,["onClick"]),(0,s.bF)(S,{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",_u,[(0,s.bF)(u,{onClick:e[14]||(e[14]=t=>o.showCreateTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[39]||(e[39]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.createToken},{default:(0,s.k6)(()=>[...e[40]||(e[40]=[(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)(F,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(C,{label:"upload"},{default:(0,s.k6)(()=>[...e[36]||(e[36]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(C,{label:"delete"},{default:(0,s.k6)(()=>[...e[37]||(e[37]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(C,{label:"list"},{default:(0,s.k6)(()=>[...e[38]||(e[38]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(S,{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",vu,[(0,s.bF)(u,{onClick:e[18]||(e[18]=t=>o.showEditTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[44]||(e[44]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.updateToken},{default:(0,s.k6)(()=>[...e[45]||(e[45]=[(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)(F,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[17]||(e[17]=t=>o.editingToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(C,{label:"upload"},{default:(0,s.k6)(()=>[...e[41]||(e[41]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(C,{label:"delete"},{default:(0,s.k6)(()=>[...e[42]||(e[42]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(C,{label:"list"},{default:(0,s.k6)(()=>[...e[43]||(e[43]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(S,{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",Cu,[(0,s.bF)(u,{type:"primary",onClick:e[21]||(e[21]=t=>o.showTokenResultDialog=!1)},{default:(0,s.k6)(()=>[...e[48]||(e[48]=[(0,s.eW)("我已保存",-1)])]),_:1})])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",ku,[(0,s.Lk)("p",wu,[(0,s.bF)(d,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),e[46]||(e[46]=(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[47]||(e[47]=[(0,s.eW)("复制",-1)])]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue","width"])])),[[M,o.loading]])}i(1148);var Su={components:{FloatingSaveButton:nu},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,Ut.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,Ut.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,Ut.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,Ut.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,Ut.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,Ut.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 Mu=(0,c.A)(Su,[["render",Fu],["__scopeId","data-v-63b9b06c"]]);var Au=Mu;const Pu={class:"page-settings"},Tu={class:"first-title"};function Du(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=sd.P9,d=sd.AV,u=nd.qi,g=id.WK,f=td.xE,m=td.US,b=nu,x=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Pu,[((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",Tu,(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)(f,{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"])):"channelName"===t.type?((0,s.uX)(),(0,s.Wv)(d,{key:1,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:!r.currentUploadChannel||0===r.currentChannelList.length,placeholder:"请先选择上传渠道",clearable:"",style:{width:"100%"}},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.currentChannelList,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled"])):"boolean"===t.type?((0,s.uX)(),(0,s.Wv)(u,{key:2,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:3,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.bF)(b,{onClick:r.saveSettings},null,8,["onClick"])])),[[x,o.loading]])}var Eu=i(457),Lu={components:{FloatingSaveButton:nu},data(){return{settings:{config:[]},loading:!1,availableChannels:{}}},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},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const i=this.availableChannels[t]||[];i.some(t=>t.name===e.value)||(e.value="")}}}},methods:{saveSettings(){(0,Ut.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))},async fetchAvailableChannels(){try{const t=await Eu.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Ut.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 Iu=(0,c.A)(Lu,[["render",Du],["__scopeId","data-v-7b8c65e5"]]);var Vu=Iu;const Ou={class:"others-settings"},Ru={class:"first-settings"},Wu={class:"first-title"},Bu={class:"first-title"},zu={class:"first-title"},Nu={class:"first-title"},Uu={class:"first-title"};function $u(t,e,i,n,a,o){const r=(0,s.g2)("font-awesome-icon"),l=p.R7,h=nd.qi,c=td.xE,d=td.US,u=id.WK,g=sd.P9,f=sd.AV,m=nu,b=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Ou,[(0,s.Lk)("div",Ru,[(0,s.Lk)("h3",Wu,[e[13]||(e[13]=(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",Bu,[e[14]||(e[14]=(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[15]||(e[15]=(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",zu,[e[16]||(e[16]=(0,s.eW)("访客图库 ",-1)),(0,s.bF)(l,{content:"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)",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.publicBrowse,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.publicBrowse.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>a.settings.publicBrowse.enabled=t),disabled:a.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"publicBrowse.allowedDir"},{label:(0,s.k6)(()=>[e[18]||(e[18]=(0,s.Lk)("span",null,"开放目录",-1)),(0,s.bF)(l,{placement:"right","raw-content":""},{content:(0,s.k6)(()=>[...e[17]||(e[17]=[(0,s.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"}},[(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},[(0,s.Lk)("b",null,"允许公开浏览的目录,多个目录用逗号分隔")]),(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},"示例:wallpaper,photos,album"),(0,s.Lk)("p",{style:{margin:"0 0 8px 0",color:"#909399"}},"支持子目录:2026/lucky,2026/rich"),(0,s.Lk)("p",{style:{margin:"0",color:"#67c23a"}},"访问链接:https://你的域名/browse/2026/lucky")],-1)])]),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.publicBrowse.allowedDir,"onUpdate:modelValue":e[4]||(e[4]=t=>a.settings.publicBrowse.allowedDir=t),disabled:a.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Nu,[e[19]||(e[19]=(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[5]||(e[5]=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[6]||(e[6]=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[7]||(e[7]=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",Uu,[e[20]||(e[20]=(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[8]||(e[8]=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[9]||(e[9]=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[10]||(e[10]=t=>a.settings.webDAV.password=t),disabled:a.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"上传渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(f,{modelValue:a.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>a.settings.webDAV.uploadChannel=t),disabled:a.settings.webDAV.fixed,placeholder:"默认渠道",clearable:""},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"Telegram",value:"telegram"}),(0,s.bF)(g,{label:"Cloudflare R2",value:"cfr2"}),(0,s.bF)(g,{label:"S3",value:"s3"}),(0,s.bF)(g,{label:"Discord",value:"discord"}),(0,s.bF)(g,{label:"HuggingFace",value:"huggingface"})]),_:1},8,["modelValue","disabled"])]),_:1}),a.settings.webDAV.uploadChannel&&o.webdavChannelList.length>1?((0,s.uX)(),(0,s.Wv)(c,{key:0,label:"指定渠道名"},{default:(0,s.k6)(()=>[(0,s.bF)(f,{modelValue:a.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>a.settings.webDAV.channelName=t),disabled:a.settings.webDAV.fixed,placeholder:"自动选择",clearable:""},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.webdavChannelList,t=>((0,s.uX)(),(0,s.Wv)(g,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled"])]),_:1})):(0,s.Q3)("",!0)]),_:1},8,["model"])]),(0,s.bF)(m,{onClick:o.saveSettings},null,8,["onClick"])])),[[b,a.loading]])}var ju={components:{FloatingSaveButton:nu},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!1}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Ut.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))},async fetchAvailableChannels(){try{const t=await(0,Ut.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Ut.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const Hu=(0,c.A)(ju,[["render",$u],["__scopeId","data-v-0c6af1f8"]]);var Xu=Hu,qu={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:f.A,SysConfigTabs:u,SysCogStatus:Gc,SysCogUpload:Jd,SysCogSecurity:Au,SysCogPage:Vu,SysCogOthers:Xu},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return Gc;case"upload":return Jd;case"security":return Au;case"page":return Vu;case"others":return Xu;default:return Gc}}},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 Ku=(0,c.A)(qu,[["render",y],["__scopeId","data-v-4cdf1dc2"]]);var Yu=Ku},2893:function(t,e,i){i(5331)},3565:function(t,e,i){i(5331)},4752:function(t,e,i){i(5331),i(8736),i(8785)},5616:function(t,e,i){i(5331),i(7197)},5802:function(t,e,i){i(5331),i(8736),i(213),i(5970)}}]); -//# sourceMappingURL=157.4b1645b7.js.map \ No newline at end of file +class fa{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],a=e.duration;n.forEach(s=>s({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(i-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Xi.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 ma=new fa;const ba="transparent",xa={boolean(t,e,i){return i>.5?e:t},color(t,e,i){const s=as(t||ba),n=s.valid&&as(e||ba);return n&&n.valid?n.mix(s,i).hexString():e},number(t,e,i){return t+(e-t)*i}};class ya{constructor(t,e,i,s){const n=e[i];s=Qs([t.to,s,n,t.from]);const a=Qs([t.from,n,s]);this._active=!0,this._fn=t.fn||xa[t.type||typeof a],this._easing=ss[t.easing]||ss.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=Qs([t.to,e,s,t.from]),this._from=Qs([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(!ze(n))return;const a={};for(const t of e)a[t]=n[t];(Be(n.properties)&&n.properties||[s]).forEach(t=>{t!==s&&i.has(t)||i.set(t,a)})})}_animateOptions(t,e){const i=e.options,s=ka(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&va(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 ya(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?(ma.add(this._chart,i),!0):void 0}}function va(t,e){const i=[],s=Object.keys(e);for(let n=0;n0||!i&&e<0)return n.index}return null}function Ia(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=Ta(a,o,s),d=e.length;let u;for(let g=0;gi[t].axis===e).shift()}function Oa(t,e){return Js(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Ra(t,e,i){return Js(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}function Wa(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 Ba=t=>"reset"===t||"none"===t,za=(t,e)=>e?t:Object.assign({},t),Na=(t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Sa(i,!0),values:null};class Ua{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=Pa(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&&Wa(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=$e(i.xAxisID,Va(t,"x")),a=e.yAxisID=$e(i.yAxisID,Va(t,"y")),o=e.rAxisID=$e(i.rAxisID,Va(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&&Wa(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(ze(e)){const t=this._cachedMeta;this._data=Aa(e,t)}else if(i!==e){if(i){ji(i,this);const t=this._cachedMeta;Wa(t),t._parsed=[]}e&&Object.isExtensible(e)&&$i(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=Pa(e.vScale,e),e.stack!==i.stack&&(s=!0,Wa(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&(Ia(this,e._parsed),e._stacked=Pa(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=Be(s[t])?this.parseArrayData(i,s,t,e):ze(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),p=l.resolveNamedOptions(d,u,g,c);return p.$shared&&(p.$shared=r,n[a]=Object.freeze(za(p,r))),p}_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 _a(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||Ba(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){Ba(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ba(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=$a(e,t.type);let s,n,a,o,r=e._length;const l=()=>{32767!==a&&-32768!==a&&(oi(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 Ka(t,e,i,s){return Be(t)?qa(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Ya(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 Ja(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(We(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[$e("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;dIi(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),p=(t,e,s)=>Ii(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),f=g(0,h,d),m=g(fi,c,u),b=p(ci,h,d),x=p(ci+fi,c,u);s=(f-b)/2,n=(m-x)/2,a=-(f+b)/2,o=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:a,offsetY:o}}(0,jt.A)(ao,"id","bubble"),(0,jt.A)(ao,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,jt.A)(ao,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class ro extends Ua{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(ze(i[t])){const{key:t="value"}=this._parsing;o=e=>+ni(i[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?di*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=gs(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")}),(0,jt.A)(ro,"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 lo extends Ua{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}=Ji(e,s,a);this._drawStart=o,this._drawCount=r,Zi(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:p}=this.options,f=Ci(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=We(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])>f,p&&(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()}}(0,jt.A)(lo,"id","line"),(0,jt.A)(lo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,jt.A)(lo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class ho extends Ua{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=gs(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return yn.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*ci;let u,g=d;const p=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}}(0,jt.A)(ho,"id","polarArea"),(0,jt.A)(ho,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,jt.A)(ho,"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 co extends ro{}(0,jt.A)(co,"id","pie"),(0,jt.A)(co,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class uo extends Ua{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 yn.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,f&&(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}}(0,jt.A)(go,"id","scatter"),(0,jt.A)(go,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,jt.A)(go,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function po(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class fo{static override(t){Object.assign(fo.prototype,t)}constructor(t){(0,jt.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return po()}parse(){return po()}format(){return po()}add(){return po()}diff(){return po()}startOf(){return po()}endOf(){return po()}}var mo={_date:fo};function bo(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?zi:Bi;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=>!We(t[e.axis]));s.lo-=Math.max(0,a);const o=i.slice(s.hi).findIndex(t=>!We(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 xo(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 Fo={evaluateInteractionItems:xo,modes:{index(t,e,i,s){const n=Bn(e,t),a=i.axis||"x",o=i.includeInvisible||!1,r=i.intersect?_o(t,n,a,s,o):wo(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=Bn(e,t),a=i.axis||"xy",o=i.includeInvisible||!1;let r=i.intersect?_o(t,n,a,s,o):wo(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 Ao(t,e){return t.filter(t=>-1===So.indexOf(t.pos)&&t.box.axis===e)}function Po(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 To(t){const e=[];let i,s,n,a,o,r;for(i=0,s=(t||[]).length;it.box.fullSize),!0),s=Po(Mo(e,"left"),!0),n=Po(Mo(e,"right")),a=Po(Mo(e,"top"),!0),o=Po(Mo(e,"bottom")),r=Ao(e,"x"),l=Ao(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 Io(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function Vo(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 Oo(t,e,i,s){const{pos:n,box:a}=i,o=t.maxPadding;if(!ze(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&&Vo(o,a.getPadding());const r=Math.max(0,e.outerWidth-Io(o,t,"left","right")),l=Math.max(0,e.outerHeight-Io(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 Ro(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 Wo(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 Bo(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);Vo(u,Ks(s));const g=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),p=Eo(l.concat(h),d);Bo(r.fullSize,g,d,p),Bo(l,g,d,p),Bo(h,g,d,p)&&Bo(l,g,d,p),Ro(g),No(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,No(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},qe(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 $o{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 $o{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Ho="$chartjs",Xo={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},qo=t=>null===t||""===t;function Ko(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[Ho]={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",qo(n)){const e=Hn(t,"width");void 0!==e&&(t.width=e)}if(qo(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Hn(t,"height");void 0!==e&&(t.height=e)}return t}const Yo=!!jn&&{passive:!0};function Qo(t,e,i){t&&t.addEventListener(e,i,Yo)}function Go(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,Yo)}function Jo(t,e){const i=Xo[t.type]||t.type,{x:s,y:n}=Bn(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}function Zo(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function tr(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Zo(i.addedNodes,s),e=e&&!Zo(i.removedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}function er(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Zo(i.removedNodes,s),e=e&&!Zo(i.addedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}const ir=new Map;let sr=0;function nr(){const t=window.devicePixelRatio;t!==sr&&(sr=t,ir.forEach((e,i)=>{i.currentDevicePixelRatio!==t&&e()}))}function ar(t,e){ir.size||window.addEventListener("resize",nr),ir.set(t,e)}function or(t){ir.delete(t),ir.size||window.removeEventListener("resize",nr)}function rr(t,e,i){const s=t.canvas,n=s&&Dn(s);if(!n)return;const a=qi((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),ar(t,a),o}function lr(t,e,i){i&&i.disconnect(),"resize"===e&&or(t)}function hr(t,e,i){const s=t.canvas,n=qi(e=>{null!==t.ctx&&i(Jo(e,t))},t);return Qo(s,e,n),n}class cr extends $o{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(Ko(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[Ho])return!1;const i=e[Ho].initial;["height","width"].forEach(t=>{const s=i[t];We(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[Ho],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:tr,detach:er,resize:rr},a=n[e]||hr;s[e]=a(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;const n={attach:lr,detach:lr,resize:lr},a=n[e]||Go;a(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Un(t,e,i,s)}isAttached(t){const e=t&&Dn(t);return!(!e||!e.isConnected)}}function dr(t){return!Tn()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?jo:cr}class ur{constructor(){(0,jt.A)(this,"x",void 0),(0,jt.A)(this,"y",void 0),(0,jt.A)(this,"active",!1),(0,jt.A)(this,"options",void 0),(0,jt.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return Ci(this.x)&&Ci(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 gr(t,e){const i=t.options.ticks,s=pr(t),n=Math.min(i.maxTicksLimit||s,s),a=i.major.enabled?mr(e):[],o=a.length,r=a[0],l=a[o-1],h=[];if(o>n)return br(e,h,a,o/n),h;const c=fr(a,e,n);if(o>0){let t,i;const s=o>1?Math.round((l-r)/(o-1)):null;for(xr(e,h,c,We(s)?0:r-s,r),t=0,i=o-1;tn)return t}return Math.max(n,1)}function mr(t){const e=[];let i,s;for(i=0,s=t.length;i"left"===t?"right":"right"===t?"left":t,vr=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,kr=(t,e)=>Math.min(e||t,t);function wr(t,e){const i=[],s=t.length/e,n=t.length;let a=0;for(;ao+r)))return h}function Fr(t,e){qe(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:Ue(i,Ue(s,i)),max:Ue(s,Ue(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(){Xe(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=Gs(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=Vi(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=Ai(Math.min(Math.asin(Vi((h.highest.height+6)/a,-1,1)),Math.asin(Vi(o/r,-1,1))-Math.asin(Vi(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){Xe(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Xe(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(){Xe(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 Oi(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()),p=g.display?g.width:0,f=p/2,m=function(t){return Ms(i,t,p)};let b,x,y,_,v,k,w,C,F,S,M,A;if("top"===a)b=m(this.bottom),k=this.bottom-d,C=b-f,S=m(t.top)+f,A=t.bottom;else if("bottom"===a)b=m(this.top),S=t.top,A=m(t.bottom)-f,k=b+f,C=this.top+d;else if("left"===a)b=m(this.right),v=this.right-d,w=b-f,F=m(t.left)+f,M=t.right;else if("right"===a)b=m(this.left),F=t.left,M=m(t.right)-f,v=b+f,w=this.left+d;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(ze(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}S=t.top,A=t.bottom,k=b+f,C=k+d}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(ze(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}v=b-f,w=v-d,F=t.left,M=t.right}const P=$e(s.ticks.maxTicksLimit,c),T=Math.max(1,Math.ceil(c/P));for(x=0;x0&&(a-=s/2);break}d={left:a,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}f.push({label:y,font:C,textOffset:M,options:{rotation:p,color:i,strokeColor:r,strokeWidth:h,textAlign:u,textBaseline:A,translation:[_,v],backdrop:d}})}return f}_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(".");ws.route(a,n,l,r)})}function Or(t){return"id"in t&&"defaults"in t}class Rr{constructor(){this.controllers=new Lr(Ua,"datasets",!0),this.elements=new Lr(ur,"elements"),this.plugins=new Lr(Object,"plugins"),this.scales=new Lr(Er,"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):qe(e,e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)})})}_exec(t,e,i){const s=ai(t);Xe(i["before"+s],[],i),e[t](i),Xe(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 zr(t){const e={},i=[],s=Object.keys(Wr.plugins.items);for(let a=0;a1&&qr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Qr(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function Gr(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 Qr(t,"x",i[0])||Qr(t,"y",i[0])}return{}}function Jr(t,e){const i=xs[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(!ze(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=Yr(e,o,Gr(e,t),ws.scales[o.type]),l=Xr(r,n),h=i.scales||{};a[e]=Ze(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=xs[n]||{},l=r.scales||{};Object.keys(l).forEach(t=>{const e=Hr(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Ze(a[n],[{axis:e},s[n],l[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Ze(e,[ws.scales[e.type],ws.scale])}),a}function Zr(t){const e=t.options||(t.options={});e.plugins=$e(e.plugins,{}),e.scales=Jr(t,e)}function tl(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function el(t){return t=t||{},t.data=tl(t.data),Zr(t),t}const il=new Map,sl=new Set;function nl(t,e){let i=il.get(t);return i||(i=e(),il.set(t,i),sl.add(i)),i}const al=(t,e,i)=>{const s=ni(e,i);void 0!==s&&t.add(s)};class ol{constructor(t){this._config=el(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=tl(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(),Zr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return nl(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return nl(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return nl(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,i=this.type;return nl(`${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=>al(r,t,e))),e.forEach(t=>al(r,s,t)),e.forEach(t=>al(r,xs[n]||{},t)),e.forEach(t=>al(r,ws,t)),e.forEach(t=>al(r,ys,t))});const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),sl.has(e)&&a.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,xs[e]||{},ws.datasets[e]||{},{type:e},ws,ys]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=rl(this._resolverCache,t,s);let r=a;if(hl(a,e)){n.$shared=!1,i=ri(i)?i():i;const e=this.createResolver(t,i,o);r=tn(a,i,e)}for(const l of e)n[l]=r[l];return n}createResolver(t,e,i=[""],s){const{resolver:n}=rl(this._resolverCache,t,i);return ze(e)?tn(n,e,void 0,s):n}}function rl(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=Zs(e,i);a={resolver:t,subPrefixes:i.filter(t=>!t.toLowerCase().includes("hover"))},s.set(n,a)}return a}const ll=t=>ze(t)&&Object.getOwnPropertyNames(t).some(e=>ri(t[e]));function hl(t,e){const{isScriptable:i,isIndexable:s}=en(t);for(const n of e){const e=i(n),a=s(n),o=(a||e)&&t[n];if(e&&(ri(o)||ll(o))||a&&Be(o))return!0}return!1}var cl="4.5.1";const dl=["top","bottom","left","right","chartArea"];function ul(t,e){return"top"===t||"bottom"===t||-1===dl.indexOf(t)&&"x"===e}function gl(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function pl(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Xe(i&&i.onComplete,[t],e)}function fl(t){const e=t.chart,i=e.options.animation;Xe(i&&i.onProgress,[t],e)}function ml(t){return Tn()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const bl={},xl=t=>{const e=ml(t);return Object.values(bl).filter(t=>t.canvas===e).pop()};function yl(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 _l(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}class vl{static register(...t){Wr.add(...t),kl()}static unregister(...t){Wr.remove(...t),kl()}constructor(t,e){const i=this.config=new ol(e),s=ml(t),n=xl(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||dr(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=Re(),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 Br,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Ki(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],bl[this.id]=this,o&&r?(ma.listen(this,"complete",pl),ma.listen(this,"progress",fl),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 We(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 Wr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():$n(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return As(this.canvas,this.ctx),this}stop(){return ma.stop(this),this}resize(t,e){ma.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,$n(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),Xe(i.onResize,[this,a],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};qe(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=Yr(t,i),n="r"===s,a="x"===s;return{options:i,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),qe(n,e=>{const n=e.options,a=n.id,o=Yr(a,n),r=$e(n.type,e.dtype);void 0!==n.position&&ul(n.position,o)===ul(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=Wr.getScale(r);l=new t({id:a,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)}),qe(s,(t,e)=>{t||delete i[e]}),qe(i,t=>{Uo.configure(this,t,t.options),Uo.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(gl("z","_idx"));const{_active:o,_lastEvent:r}=this;r?this._eventHandler(r,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){qe(this.scales,t=>{Uo.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);li(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;yl(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;Uo.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],qe(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=pa(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",i)&&(s&&Es(e,s),t.controller.draw(),s&&Ls(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Ds(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Fo.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=Js(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);oi(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(),ma.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)};qe(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(){qe(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},qe(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=!Ke(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=hi(t),l=_l(t,this._lastEvent,i,r);i&&(this._lastEvent=null,Xe(n.onHover,[t,o,this],this),r&&Xe(n.onClick,[t,o,this],this));const h=!Ke(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 kl(){return qe(vl.instances,t=>t._plugins.invalidate())}function wl(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-ci/2,s+ci/2,!0);else if("bevel"===c){const o=2*e*e,r=-o*Math.cos(i+ci/2)+n,l=-o*Math.sin(i+ci/2)+a,h=o*Math.cos(s+ci/2)+n,c=o*Math.sin(s+ci/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 Cl(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+fi,s-fi),t.closePath(),t.clip()}function Fl(t){return Hs(t,["outerStart","outerEnd","innerStart","innerEnd"])}function Sl(t,e,i,s){const n=Fl(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 Vi(t,0,Math.min(a,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Vi(n.innerStart,0,o),innerEnd:Vi(n.innerEnd,0,o)}}function Ml(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Al(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 p=n-l;if(s){const t=c>0?c-s:0,e=d>0?d-s:0,i=(t+e)/2,n=0!==i?p*i/(i+s):p;g=(p-n)/2}const f=Math.max(.001,p*d-i/ci)/d,m=(p-f)/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,C=d-_,F=b+y/w,S=x-_/C,M=u+v,A=u+k,P=b+v/M,T=x-k/A;if(t.beginPath(),a){const e=(F+S)/2;if(t.arc(o,r,d,F,e),t.arc(o,r,d,e,S),_>0){const e=Ml(C,S,o,r);t.arc(e.x,e.y,_,S,x+fi)}const i=Ml(A,x,o,r);if(t.lineTo(i.x,i.y),k>0){const e=Ml(A,T,o,r);t.arc(e.x,e.y,k,x+fi,T+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(M,P,o,r);t.arc(e.x,e.y,v,P+Math.PI,b-fi)}const n=Ml(w,b,o,r);if(t.lineTo(n.x,n.y),y>0){const e=Ml(w,F,o,r);t.arc(e.x,e.y,y,b-fi,F)}}else{t.moveTo(o,r);const e=Math.cos(F)*d+o,i=Math.sin(F)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+o,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Pl(t,e,i,s,n){const{fullCircles:a,startAngle:o,circumference:r}=e;let l=e.endAngle;if(a){Al(t,e,i,s,l,n);for(let e=0;e=ci&&0===g&&"miter"!==c&&wl(t,e,f),a||(Al(t,e,i,s,f,n),t.stroke())}(0,jt.A)(vl,"defaults",ws),(0,jt.A)(vl,"instances",bl),(0,jt.A)(vl,"overrides",xs),(0,jt.A)(vl,"registry",Wr),(0,jt.A)(vl,"version",cl),(0,jt.A)(vl,"getChart",xl);class Dl extends ur{constructor(t){super(),(0,jt.A)(this,"circumference",void 0),(0,jt.A)(this,"endAngle",void 0),(0,jt.A)(this,"fullCircles",void 0),(0,jt.A)(this,"innerRadius",void 0),(0,jt.A)(this,"outerRadius",void 0),(0,jt.A)(this,"pixelMargin",void 0),(0,jt.A)(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}=Ti(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=$e(c,r-o),g=Ii(n,o,r)&&o!==r,p=u>=di||g,f=Ri(a,l+d,h+d);return p&&f}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>di?Math.floor(i/di):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(ci,i||0)),l=s*r;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,Pl(t,this,l,n,a),Tl(t,this,l,n,a),t.restore()}}function El(t,e,i=e){t.lineCap=$e(i.borderCapStyle,e.borderCapStyle),t.setLineDash($e(i.borderDash,e.borderDash)),t.lineDashOffset=$e(i.borderDashOffset,e.borderDashOffset),t.lineJoin=$e(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=$e(i.borderWidth,e.borderWidth),t.strokeStyle=$e(i.borderColor,e.borderColor)}function Ll(t,e,i){t.lineTo(i.x,i.y)}function Il(t){return t.stepped?Is:t.tension||"monotone"===t.cubicInterpolationMode?Vs:Ll}function Vl(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!==p&&(t.lineTo(m,p),t.lineTo(m,g),t.lineTo(m,f))};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?(ip&&(p=i),m=(b*m+e)/++b):(y(),t.lineTo(e,i),u=s,b=0,g=p=i),f=i}y()}function Wl(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?Rl:Ol}function Bl(t){return t.stepped?qn:t.tension||"monotone"===t.cubicInterpolationMode?Kn:Xn}function zl(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),El(t,e.options),t.stroke(n)}function Nl(t,e,i,s){const{segments:n,options:a}=e,o=Wl(e);for(const r of n)El(t,a,r.style),t.beginPath(),o(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(0,jt.A)(Dl,"id","arc"),(0,jt.A)(Dl,"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}),(0,jt.A)(Dl,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,jt.A)(Dl,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Ul="function"===typeof Path2D;function $l(t,e,i,s){Ul&&!e.options.segment?zl(t,e,i,s):Nl(t,e,i,s)}class jl extends ur{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;Pn(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=ra(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=na(this,{property:e,start:s,end:s});if(!a.length)return;const o=[],r=Bl(i);let l,h;for(l=0,h=a.length;l"borderDash"!==t&&"fill"!==t});class Xl extends ur{constructor(t){super(),(0,jt.A)(this,"parsed",void 0),(0,jt.A)(this,"skip",void 0),(0,jt.A)(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)}},nh=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class ah extends ur{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=Xe(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=Ys(i.font),n=s.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:r}=sh(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 p=i+e/2+n.measureText(t.text).width;(0===g||l[l.length-1]+p+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:p,height:s},l[l.length-1]+=p+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,p=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=oh(i,e,n,t,s);a>0&&u+m+2*o>h&&(c+=d+o,l.push({width:d,height:u}),g+=d+o,p++,d=u=0),r[a]={left:g,top:u,col:p,width:f,height:m},d=Math.max(d,f),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=Gn(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Qi(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,o=Qi(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=Qi(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,o=Qi(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;Es(t,this),this._draw(),Ls(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:a}=t,o=ws.color,r=Gn(t.rtl,this.left,this.width),l=Ys(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:p,itemHeight:f}=sh(a,c),m=function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=$e(i.lineWidth,1);if(s.fillStyle=$e(i.fillStyle,o),s.lineCap=$e(i.lineCap,"butt"),s.lineDashOffset=$e(i.lineDashOffset,0),s.lineJoin=$e(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=$e(i.strokeStyle,o),s.setLineDash($e(i.lineDash,[])),a.usePointStyle){const o={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2),h=e+d;Ts(s,o,l,h,a.pointStyleWidth&&g)}else{const a=e+Math.max((c-p)/2,0),o=r.leftForLtr(t,g),l=qs(i.borderRadius);s.beginPath(),Object.values(l).some(t=>0!==t)?zs(s,{x:o,y:a,w:g,h:p,radius:l}):s.rect(o,a,g,p),s.fill(),0!==n&&s.stroke()}s.restore()},b=function(t,e,i){Bs(s,i.text,t,e+f/2,l,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})},x=this.isHorizontal(),y=this._computeTitleHeight();u=x?{x:Qi(n,this.left+h,this.right-i[0]),y:this.top+h+y,line:0}:{x:this.left+h,y:Qi(n,this.top+y+h,this.bottom-e[0].height),line:0},Jn(this.ctx,t.textDirection);const _=f+h;this.legendItems.forEach((o,c)=>{s.strokeStyle=o.fontColor,s.fillStyle=o.fontColor;const p=s.measureText(o.text).width,f=r.textAlign(o.textAlign||(o.textAlign=a.textAlign)),v=g+d+p;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=Qi(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=Qi(n,this.top+y+h,this.bottom-e[u.line].height));const C=r.x(k);if(m(C,w,o),k=Gi(f,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+=hh(o,t)+h}else u.y+=_}),Zn(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Ys(e.font),s=Ks(e.padding);if(!e.display)return;const n=Gn(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=Qi(t.align,c,this.right-d);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);h=l+Qi(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Qi(o,c,c+d);a.textAlign=n.textAlign(Yi(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=i.string,Bs(a,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Ys(t.font),i=Ks(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Ri(t,this.left,this.right)&&Ri(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 lh(t,e,i){let s=t;return"string"!==typeof e.text&&(s=hh(e,i)),s}function hh(t,e){const i=t.text?t.text.length:0;return e*i}function ch(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var dh={id:"legend",_element:ah,start(t,e,i){const s=t.legend=new ah({ctx:t.ctx,options:i,chart:t});Uo.configure(t,s,i),Uo.addBox(t,s)},stop(t){Uo.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;Uo.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=Ks(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 uh={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 fh(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 mh(t,e){const i=t.chart.ctx,{body:s,footer:n,title:a}=t,{boxWidth:o,boxHeight:r}=e,l=Ys(e.bodyFont),h=Ys(e.titleFont),c=Ys(e.footerFont),d=a.length,u=n.length,g=s.length,p=Ks(e.padding);let f=p.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&&(f+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(r,l.lineHeight):l.lineHeight;f+=g*t+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}u&&(f+=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,qe(t.title,y),i.font=l.string,qe(t.beforeBody.concat(t.afterBody),y),x=e.displayColors?o+2+e.boxPadding:0,qe(s,t=>{qe(t.before,y),qe(t.lines,y),qe(t.after,y)}),x=0,i.font=c.string,qe(t.footer,y),i.restore(),m+=p.width,{width:m,height:f}}function bh(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}function xh(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 yh(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"),xh(h,t,e,i)&&(h="center"),h}function _h(t,e,i){const s=i.yAlign||e.yAlign||bh(t,i);return{xAlign:i.xAlign||e.xAlign||yh(t,e,i,s),yAlign:s}}function vh(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}function kh(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}function wh(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}=qs(o);let p=vh(e,r);const f=kh(e,l,h);return"center"===l?"left"===r?p+=h:"right"===r&&(p-=h):"left"===r?p-=Math.max(c,u)+n:"right"===r&&(p+=Math.max(d,g)+n),{x:Vi(p,0,s.width-e.width),y:Vi(f,0,s.height-e.height)}}function Ch(t,e,i){const s=Ks(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Fh(t){return gh([],ph(t))}function Sh(t,e,i){return Js(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 Ah={beforeTitle:Oe,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);gh(e.before,ph(Ph(n,"beforeLabel",this,t))),gh(e.lines,Ph(n,"label",this,t)),gh(e.after,ph(Ph(n,"afterLabel",this,t))),s.push(e)}),s}getAfterBody(t,e){return Fh(Ph(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Ph(i,"beforeFooter",this,t),n=Ph(i,"footer",this,t),a=Ph(i,"afterFooter",this,t);let o=[];return o=gh(o,ph(s)),o=gh(o,ph(n)),o=gh(o,ph(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))),qe(l,e=>{const i=Mh(t.callbacks,e);s.push(Ph(i,"labelColor",this,e)),n.push(Ph(i,"labelPointStyle",this,e)),a.push(Ph(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=uh[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=mh(this,i),o=Object.assign({},t,e),r=_h(this.chart,i,o),l=wh(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}=qs(o),{x:d,y:u}=t,{width:g,height:p}=e;let f,m,b,x,y,_;return"center"===n?(y=u+p/2,"left"===s?(f=d,m=f-a,x=y+a,_=y-a):(f=d+g,m=f+a,x=y-a,_=y+a),b=f):(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,f=m-a,b=m+a):(x=u+p,y=x+a,f=m+a,b=m-a),_=x),{x1:f,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=Gn(i.rtl,this.x,this.width);for(t.x=Ch(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",a=Ys(i.titleFont),o=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,r=0;r0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,zs(t,{x:e,y:g,w:l,h:r,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),zs(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=Ys(i.bodyFont);let d=c.lineHeight,u=0;const g=Gn(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+u),t.y+d/2),t.y+=d+n},f=g.textAlign(a);let m,b,x,y,_,v,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=Ch(this,f,i),e.fillStyle=i.bodyColor,qe(this.beforeBody,p),u=o&&"right"!==f?"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=uh[t.position].call(this,this._active,this._eventPosition);if(!i)return;const a=this._size=mh(this,t),o=Object.assign({},i,this._size),r=_h(e,t,o),l=wh(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=Ks(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),Jn(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Zn(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=!Ke(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||!Ke(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=uh[n.position].call(this,t,e);return!1!==a&&(i!==a.x||s!==a.y)}}(0,jt.A)(Th,"positioners",uh);var Dh={id:"tooltip",_element:Th,positioners:uh,afterInit(t,e,i){i&&(t.tooltip=new Th({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:Ah},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 Eh=(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 Eh(t,e,i,s);const a=t.lastIndexOf(e);return n!==a?i:n}const Ih=(t,e)=>null===t?null:Vi(Math.round(t),0,e);function Vh(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 Rh(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,p=c-1,{min:f,max:m}=e,b=!We(o),x=!We(r),y=!We(h),_=(m-f)/(d+1);let v,k,w,C,F=vi((m-f)/p/g)*g;if(Fp&&(F=vi(C*F/p/g)*g),We(l)||(v=Math.pow(10,l),F=Math.ceil(F*v)/v),"ticks"===n?(k=Math.floor(f/F)*F,w=Math.ceil(m/F)*F):(k=f,w=m),b&&x&&a&&Fi((r-o)/a,F/1e3)?(C=Math.round(Math.min((r-o)/F,c)),F=(r-o)/C,k=o,w=r):y?(k=b?o:k,w=x?r:w,C=h-1,F=(w-k)/C):(C=(w-k)/F,C=_i(C,Math.round(C),F/1e3)?Math.round(C):Math.ceil(C));const S=Math.max(Pi(F),Pi(k));v=Math.pow(10,We(l)?S:l),k=Math.round(k*v)/v,w=Math.round(w*v)/v;let M=0;for(b&&(u&&k!==o?(i.push({value:o}),kr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&_i(i[i.length-1].value,r,Wh(r,_,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}function Wh(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)}(0,jt.A)(Oh,"id","category"),(0,jt.A)(Oh,"defaults",{ticks:{callback:Vh}});class Bh extends Er{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 We(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=yi(s),e=yi(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=Rh(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 gs(t,this.chart.options.locale,this.options.ticks.format)}}class zh extends Bh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ne(t)?t:0,this.max=Ne(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}}(0,jt.A)(zh,"id","linear"),(0,jt.A)(zh,"defaults",{ticks:{callback:ms.formatters.numeric}});const Nh=t=>Math.floor(xi(t)),Uh=(t,e)=>Math.pow(10,Nh(t)+e);function $h(t){const e=t/Math.pow(10,Nh(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 Hh(t,e){const i=e-t;let s=Nh(i);while(jh(t,e,s)>10)s++;while(jh(t,e,s)<10)s--;return Math.min(s,Nh(t))}function Xh(t,{min:e,max:i}){e=Ue(t.min,e);const s=[],n=Nh(e);let a=Hh(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=Ue(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=Ue(t.max,u);return s.push({value:g,major:$h(g),significand:d}),s}class qh extends Er{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Bh.prototype.parse.apply(this,[t,e]);if(0!==i)return Ne(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ne(t)?Math.max(0,t):null,this.max=Ne(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ne(this._userMin)&&(this.min=t===Uh(this.min,0)?Uh(this.min,-1):Uh(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(Uh(i,-1)),a(Uh(s,1)))),i<=0&&n(Uh(s,-1)),s<=0&&a(Uh(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},i=Xh(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":gs(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=xi(t),this._valueRange=xi(this.max)-xi(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(xi(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function Kh(t){const e=t.ticks;if(e.display&&t.display){const t=Ks(e.backdropPadding);return $e(e.font&&e.font.size,ws.font.size)+t.height}return 0}function Yh(t,e,i){return i=Be(i)?i:[i],{w:Ss(t,e.string,i),h:i.length*e.lineHeight}}function Qh(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 Gh(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?ci/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 Zh(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(Ai(Li(l.angle+fi))),c=nc(l.y,r.h,h),d=ic(h),u=sc(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 tc(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:a}=t,o=Ds({x:i,y:s},e)||Ds({x:i,y:a},e)||Ds({x:n,y:s},e)||Ds({x:n,y:a},e);return!o}function ec(t,e,i){const s=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:r}=a.pointLabels,l={extra:Kh(a)/2,additionalAngle:o?ci/n:0};let h;for(let c=0;c270||i<90)&&(t-=e),t}function ac(t,e,i){const{left:s,top:n,right:a,bottom:o}=i,{backdropColor:r}=e;if(!We(r)){const i=qs(e.borderRadius),l=Ks(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(),zs(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function oc(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));ac(i,a,e);const o=Ys(a.font),{x:r,y:l,textAlign:h}=e;Bs(i,t._pointLabels[n],r,l+o.lineHeight/2,o,{color:a.color,textAlign:h,textBaseline:"middle"})}}function rc(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,di);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let a=1;a{const i=Xe(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?Gh(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=di/(this._pointLabels.length||1),i=this.options.startAngle||0;return Li(t*e+Mi(i))}getDistanceFromCenterForValue(t){if(We(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(We(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);lc(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=Ys(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=Ks(r.backdropPadding);t.fillRect(-a/2-e.left,-n-l.size/2-e.top,a+e.width,l.size+e.height)}Bs(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,jt.A)(cc,"id","radialLinear"),(0,jt.A)(cc,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ms.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,jt.A)(cc,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,jt.A)(cc,"descriptors",{angleLines:{_fallback:"grid"}});const dc={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}},uc=Object.keys(dc);function gc(t,e){return t-e}function pc(t,e){if(We(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)),Ne(o)||(o="string"===typeof s?i.parse(o,s):i.parse(o)),null===o?null:(n&&(o="week"!==n||!Ci(a)&&!0!==a?i.startOf(o,n):i.startOf(o,"isoWeek",a)),+o)}function fc(t,e,i,s){const n=uc.length;for(let a=uc.indexOf(t);a=uc.indexOf(i);a--){const i=uc[a];if(dc[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return uc[i?uc.indexOf(i):0]}function bc(t){for(let e=uc.indexOf(t)+1,i=uc.length;e=e?i[s]:i[n];t[a]=!0}}else t[e]=!0}function yc(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 _c(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=Vi(s,0,a),n=Vi(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||fc(n.minUnit,e,i,this._getLabelCapacity(e)),o=$e(s.ticks.stepSize,1),r="week"===a&&n.isoWeekday,l=Ci(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 Xe(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}=Bi(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}=Bi(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}(0,jt.A)(vc,"id","time"),(0,jt.A)(vc,"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 wc extends vc{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=kc(e,this.min),this._tableRange=kc(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(kc(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return kc(this._table,i*this._tableRange+this._minPos,!0)}}(0,jt.A)(wc,"id","timeseries"),(0,jt.A)(wc,"defaults",vc.defaults);var Cc=i(144);const Fc={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},...Fc,...Sc},Ac="2"===s.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Pc(t){return(0,Cc.ju)(t)?(0,Cc.ux)(t):t}function Tc(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Cc.ju)(e)?new Proxy(t,{}):t}function Dc(t,e){const i=t.options;i&&e&&Object.assign(i,e)}function Ec(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 Ic(t,e){const i={labels:[],datasets:[]};return Ec(i,t.labels),Lc(i,t.datasets,e),i}const Vc=(0,s.pM)({props:Mc,setup(t,e){let{expose:i,slots:n}=e;const a=(0,Cc.KR)(null),o=(0,Cc.IJ)(null);i({chart:o});const r=()=>{if(!a.value)return;const{type:e,data:i,options:s,plugins:n,datasetIdKey:r}=t,l=Ic(i,r),h=Tc(l,i);o.value=new vl(a.value,{type:e,data:h,options:{...s},plugins:n})},l=()=>{const e=(0,Cc.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,Cc.ux)(o.value);if(!c)return;let d=!1;if(n){const t=Pc(n),e=Pc(r);t&&t!==e&&(Dc(c,t),d=!0)}if(a){const e=Pc(a.labels),i=Pc(l.labels),s=Pc(a.datasets),n=Pc(l.datasets);e!==i&&(Ec(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 Oc(t,e){return vl.register(e),(0,s.pM)({props:Fc,setup(e,i){let{expose:n}=i;const a=(0,Cc.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,s.h)(Vc,Ac({ref:o},{type:t,...e}))}})}const Rc=Oc("doughnut",ro);i(6573),i(8100),i(7936),i(9577),i(1549),i(9797),i(9631),i(5623),i(4603),i(7566),i(8721);class Wc extends Error{constructor(t,e,i=!1,s=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=i,this.suggestion=s}}const Bc={401:()=>new Wc("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new Wc("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new Wc(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new Wc("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new Wc("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new Wc("操作已取消","ABORTED",!1,"")};function zc(t,e=""){if("AbortError"===t.name)return Bc.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const i=Bc[t.status];return i?i(e):new Wc(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?Bc.NETWORK():new Wc(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class Nc{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let i=null,s=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(i,t);e.push(...a.records),i=a.nextCursor,s+=a.records.length,n++,this.onProgress({phase:"fetching",current:s,batchCount:n,message:`已获取 ${s} 条记录...`})}while(i&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw Bc.ABORT();return e}catch(a){const t=a instanceof Wc?a:zc(a);throw this.onError(t),t}}async fetchBatch(t,e){const i=new URLSearchParams;t&&i.set("cursor",t),e&&i.set("includeValue","true"),i.set("limit",String(this.batchSize));try{const t=await(0,Ut.A)(`/api/manage/batch/list?${i}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const i=await t.json();e=i.error||""}catch{}throw zc(t,e)}const e=await t.json();if(!e.success)throw new Wc(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(s){if(s instanceof Wc)throw s;throw zc(s)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var Uc=Nc;class $c{constructor(t={}){this.chunkSize=t.chunkSize||5e3,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async rebuild(){this.aborted=!1;try{this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new Uc({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new Wc("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new Wc("操作已取消","ABORTED",!1,"");const i=this.splitIntoChunks(e);for(let s=0;s{const i=t.metadata&&t.metadata.TimeStamp||0,s=e.metadata&&e.metadata.TimeStamp||0;return s-i})}splitIntoChunks(t){const e=[];for(let i=0;it.toString(16).padStart(2,"0")).join("")}createHttpError(t,e=""){switch(t){case 401:return new Wc("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new Wc("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new Wc(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new Wc("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new Wc("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new Wc(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var jc=$c;class Hc{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new Uc({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:$t.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const i=await this.fetchSettings();e.data.settings=i,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const s=Object.keys(i).length;return{success:!0,fileCount:t.length,settingsCount:s}}async fetchSettings(){try{const t=await(0,Ut.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),i=new Blob([e],{type:"application/json"}),s=URL.createObjectURL(i),n=document.createElement("a");n.href=s,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(s)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var Xc=Hc;class qc{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new Wc("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:i={}}=t.data,s=Object.entries(e),n=Object.entries(i),a=s.length,o=n.length,r=a+o;let l=0,h=0,c=0,d=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:r});const e=this.splitIntoChunks(s,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var Kc=qc;vl.register(Dl,Dh,dh);var Yc={name:"SysCogStatus",components:{Doughnut:Rc},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:$t.rE,loadErrors:{newest:!1,oldest:!1},channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},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.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[i,s]of Object.entries(t)){const t="Block"===i?"已屏蔽":"正常";e[t]=(e[t]||0)+s}return e},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,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}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const i=t/e,s=i-t;if(s<=0)return"即将完成";const n=Math.ceil(s/1e3);if(n<60)return`约 ${n} 秒`;const a=Math.ceil(n/60);if(a<60)return`约 ${a} 分钟`;const o=Math.floor(a/60),r=a%60;return`约 ${o} 小时 ${r} 分钟`},phaseDescription(){const t={fetching:"正在获取数据",sorting:"正在排序",uploading:"正在上传",finalizing:"正在完成",building:"正在构建备份",downloading:"正在生成下载",restoring_files:"正在恢复文件",restoring_settings:"正在恢复设置",completed:"已完成",retrying:"正在重试"};return t[this.processingPhase]||this.processingPhase}},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,Ut.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(){if(this.isProcessing)this.$message.warning("已有操作正在进行中");else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new jc({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(`索引重建完成!共处理 ${t.totalFiles.toLocaleString()} 个文件`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning("已有操作正在进行中");else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new Xc({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?`,${t.settingsCount} 个设置项`:"";this.$message.success(`备份完成!共备份 ${t.fileCount.toLocaleString()} 个文件${e}`)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},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){if(this.isProcessing)this.$message.warning("已有操作正在进行中");else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const i=await t.text();let s;try{s=JSON.parse(i)}catch(e){throw new Error("备份文件格式无效,请选择有效的 JSON 文件")}this.currentRestoreProcessor=new Kc({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(s);this.$message.success(`恢复完成!已恢复 ${n.restoredFiles} 个文件和 ${n.restoredSettings} 个设置项`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(i){if(console.error("恢复数据失败:",i),"ABORTED"!==i.code){const t=i.suggestion?`${i.message}。${i.suggestion}`:i.message;this.$message.error("恢复数据失败: "+t),this.processingError={message:i.message,suggestion:i.suggestion,recoverable:i.recoverable}}}finally{this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null}}},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)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id,"_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info("正在取消索引重建...")),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info("正在取消备份...")),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info("正在取消恢复..."))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const Qc=(0,c.A)(Yc,[["render",Nt],["__scopeId","data-v-b126e9b2"]]);var Gc=Qc,Jc=i(9869),Zc=(i(415),i(3565),i(9267)),td=(i(5616),i(2006)),ed=i(1418),id=(i(333),i(9623)),sd=(i(6711),i(6018)),nd=(i(6808),i(200),i(5558)),ad=(i(8075),i(2687)),od=(i(8785),i(5130));const rd=["onClick"];function ld(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:i.width})},[(0,s.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>r.toggleDropdown&&r.toggleDropdown(...t))},[(0,s.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!i.modelValue}])},(0,n.v_)(r.displayLabel),3),(0,s.bF)(l,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,s.bF)(od.eB,{name:"dropdown-fade"},{default:(0,s.k6)(()=>[(0,s.bo)((0,s.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,od.D$)(()=>{},["stop"]))},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(i.options,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":i.modelValue===e.value}]),onClick:t=>r.selectOption(e.value)},[(0,s.RG)(t.$slots,"option",{option:e},()=>[e.icon?((0,s.uX)(),(0,s.Wv)(l,{key:0,icon:e.icon,class:"option-icon"},null,8,["icon"])):(0,s.Q3)("",!0),(0,s.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,rd))),128))],512),[[od.aG,o.isOpen]])]),_:3})],6)}var hd={name:"CustomSelect",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:"请选择"},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.placeholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const cd=(0,c.A)(hd,[["render",ld],["__scopeId","data-v-6c59d112"]]);var dd=cd;const ud={class:"upload-settings"},gd={class:"page-header"},pd={class:"first-title"},fd={class:"header-actions"},md={class:"group-header"},bd={class:"group-title"},xd={key:0,class:"load-balance-switch"},yd={key:0,class:"channel-cards"},_d=["onMousemove","onMouseleave"],vd={class:"card-header"},kd={class:"card-title"},wd={class:"channel-name"},Cd={class:"card-body"},Fd={class:"card-info"},Sd={class:"info-item"},Md={class:"info-text"},Ad={key:0,class:"info-item"},Pd={class:"info-text"},Td={key:1,class:"info-item"},Dd=["title"],Ed={class:"info-item"},Ld={class:"info-text"},Id={key:0,class:"info-item"},Vd=["title"],Od={class:"info-item"},Rd={class:"info-text"},Wd={class:"info-item"},Bd={class:"info-text"},zd={class:"info-item"},Nd={class:"info-text"},Ud={key:0,class:"quota-mini"},$d={class:"quota-text"},jd={class:"card-actions"},Hd={key:1,class:"empty-tip"},Xd={class:"form-warning"},qd={class:"quota-label"},Kd={class:"quota-status"};function Yd(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=dd,d=k.S2,u=ad.u,g=nd.qi,f=w.ve,m=sd.P9,b=sd.AV,x=td.xE,y=id.WK,v=ed.lq,C=td.US,F=Zc.kZ,S=Jc.MF,M=Jc.TS,A=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",ud,[(0,s.Lk)("div",gd,[(0,s.Lk)("h3",pd,[e[59]||(e[59]=(0,s.eW)(" 上传渠道管理 ",-1)),(0,s.bF)(h,{content:"管理所有上传渠道的配置,点击卡片查看详情或编辑",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",class:"help-icon"})]),_:1})]),(0,s.Lk)("div",fd,[(0,s.bF)(c,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:r.filterOptions,placeholder:"筛选渠道类型",width:"160px"},null,8,["modelValue","options"]),(0,s.bF)(d,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"plus",style:{"margin-right":"6px"}}),e[60]||(e[60]=(0,s.eW)(" 添加渠道 ",-1))]),_:1})])]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.filteredChannels,t=>((0,s.uX)(),(0,s.CE)("div",{key:t.value,class:"channel-group"},[(0,s.Lk)("div",md,[(0,s.Lk)("div",bd,[(0,s.bF)(l,{icon:r.getChannelIcon(t.value),class:"group-icon"},null,8,["icon"]),(0,s.Lk)("span",null,(0,n.v_)(t.label),1),(0,s.bF)(u,{size:"small",type:"info",class:"channel-count"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getChannelList(t.value).length),1)]),_:2},1024)]),r.hasLoadBalance(t.value)?((0,s.uX)(),(0,s.CE)("div",xd,[e[61]||(e[61]=(0,s.Lk)("span",{class:"switch-label"},"负载均衡",-1)),(0,s.bF)(g,{modelValue:r.getSettings(t.value).loadBalance.enabled,"onUpdate:modelValue":e=>r.getSettings(t.value).loadBalance.enabled=e,size:"small",onChange:r.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,s.Q3)("",!0)]),r.getChannelList(t.value).length>0?((0,s.uX)(),(0,s.CE)("div",yd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.getChannelList(t.value),(i,a)=>((0,s.uX)(),(0,s.CE)("div",{key:i.name||a,class:(0,n.C4)(["channel-card",[t.value,{disabled:!i.enabled,fixed:i.fixed}]]),onMousemove:e=>r.handleCardMouseMove(e,t.value,a),onMouseleave:e=>r.handleCardMouseLeave(t.value,a)},[(0,s.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${t.value}-${a}`},null,512),(0,s.Lk)("div",vd,[(0,s.Lk)("div",kd,[(0,s.Lk)("span",wd,(0,n.v_)(i.name||"未命名渠道"),1),i.fixed?((0,s.uX)(),(0,s.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,s.k6)(()=>[...e[62]||(e[62]=[(0,s.eW)("环境变量",-1)])]),_:1})):(0,s.Q3)("",!0)]),(0,s.bF)(g,{modelValue:i.enabled,"onUpdate:modelValue":t=>i.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,od.D$)(()=>{},["stop"])),onChange:r.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,s.Lk)("div",Cd,[(0,s.Lk)("div",Fd,["telegram"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.Lk)("div",Sd,[(0,s.bF)(l,{icon:"robot",class:"info-icon"}),(0,s.Lk)("span",Md,"Bot: "+(0,n.v_)(r.maskText(i.botToken)),1)]),i.chatId?((0,s.uX)(),(0,s.CE)("div",Ad,[(0,s.bF)(l,{icon:"comments",class:"info-icon"}),(0,s.Lk)("span",Pd,"Channel: "+(0,n.v_)(r.maskText(i.chatId)),1)])):(0,s.Q3)("",!0)],64)):"cfr2"===t.value?((0,s.uX)(),(0,s.CE)("div",Td,[(0,s.bF)(l,{icon:"link",class:"info-icon"}),(0,s.Lk)("span",{class:"info-text",title:i.publicUrl},(0,n.v_)(i.publicUrl||"未设置公开链接"),9,Dd)])):"s3"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:2},[(0,s.Lk)("div",Ed,[(0,s.bF)(l,{icon:"server",class:"info-icon"}),(0,s.Lk)("span",Ld,(0,n.v_)(i.bucketName||"未设置"),1)]),i.endpoint?((0,s.uX)(),(0,s.CE)("div",Id,[(0,s.bF)(l,{icon:"link",class:"info-icon"}),(0,s.Lk)("span",{class:"info-text",title:i.endpoint},(0,n.v_)(i.endpoint),9,Vd)])):(0,s.Q3)("",!0)],64)):"discord"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.Lk)("div",Od,[(0,s.bF)(l,{icon:"robot",class:"info-icon"}),(0,s.Lk)("span",Rd,"Bot: "+(0,n.v_)(r.maskText(i.botToken)),1)]),(0,s.Lk)("div",Wd,[(0,s.bF)(l,{icon:"hashtag",class:"info-icon"}),(0,s.Lk)("span",Bd,"Channel: "+(0,n.v_)(r.maskText(i.channelId)),1)]),i.isNitro?((0,s.uX)(),(0,s.Wv)(u,{key:0,size:"small",type:"success"},{default:(0,s.k6)(()=>[...e[63]||(e[63]=[(0,s.eW)("Nitro",-1)])]),_:1})):(0,s.Q3)("",!0)],64)):"huggingface"===t.value?((0,s.uX)(),(0,s.CE)(s.FK,{key:4},[(0,s.Lk)("div",zd,[(0,s.bF)(l,{icon:"database",class:"info-icon"}),(0,s.Lk)("span",Nd,(0,n.v_)(i.repo||"未设置仓库"),1)]),i.isPrivate?((0,s.uX)(),(0,s.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,s.k6)(()=>[...e[64]||(e[64]=[(0,s.eW)("私有",-1)])]),_:1})):(0,s.Q3)("",!0)],64)):(0,s.Q3)("",!0)]),i.quota?.enabled?((0,s.uX)(),(0,s.CE)("div",Ud,[(0,s.bF)(f,{percentage:r.getQuotaPercentage(i),status:r.getQuotaStatus(i),"stroke-width":6},null,8,["percentage","status"]),(0,s.Lk)("span",$d,(0,n.v_)(r.getQuotaText(i)),1)])):(0,s.Q3)("",!0)]),(0,s.Lk)("div",jd,[(0,s.bF)(d,{text:"",type:"primary",size:"small",onClick:e=>r.openDetailDialog(t.value,a)},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"eye",style:{"margin-right":"4px"}}),e[65]||(e[65]=(0,s.eW)("详情 ",-1))]),_:1},8,["onClick"]),(0,s.bF)(d,{text:"",type:"primary",size:"small",onClick:e=>r.openEditDialog(t.value,a)},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"edit",style:{"margin-right":"4px"}}),e[66]||(e[66]=(0,s.eW)("编辑 ",-1))]),_:1},8,["onClick"]),(0,s.bF)(d,{text:"",type:"danger",size:"small",onClick:e=>r.deleteChannel(t.value,a),disabled:i.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt",style:{"margin-right":"4px"}}),e[67]||(e[67]=(0,s.eW)("删除 ",-1))]),_:1},8,["onClick","disabled"])])],42,_d))),128))])):((0,s.uX)(),(0,s.CE)("div",Hd,[(0,s.bF)(l,{icon:"inbox",class:"empty-icon"}),(0,s.Lk)("span",null,"暂无 "+(0,n.v_)(t.label)+" 渠道",1)]))]))),128)),(0,s.bF)(F,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[26]||(e[26]=t=>o.showAddDialog=t),title:"添加新渠道",class:"channel-dialog","destroy-on-close":"",onClosed:r.resetAddForm},{footer:(0,s.k6)(()=>[(0,s.bF)(d,{onClick:e[25]||(e[25]=t=>o.showAddDialog=!1)},{default:(0,s.k6)(()=>[...e[73]||(e[73]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(d,{type:"primary",onClick:r.confirmAddChannel},{default:(0,s.k6)(()=>[...e[74]||(e[74]=[(0,s.eW)("确认添加",-1)])]),_:1},8,["onClick"])]),default:(0,s.k6)(()=>[(0,s.bF)(C,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:o.addRules},{default:(0,s.k6)(()=>[(0,s.bF)(x,{label:"渠道类型",prop:"type"},{default:(0,s.k6)(()=>[(0,s.bF)(b,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:"请选择渠道类型",style:{width:"100%"},onChange:r.onChannelTypeChange},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.addableChannels,t=>((0,s.uX)(),(0,s.Wv)(m,{key:t.value,label:t.label,value:t.value},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:r.getChannelIcon(t.value),class:"select-option-icon"},null,8,["icon"]),(0,s.eW)(" "+(0,n.v_)(t.label),1)]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","onChange"])]),_:1}),(0,s.bF)(x,{label:"渠道名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:"请输入渠道名称"},null,8,["modelValue"])]),_:1}),"telegram"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:"请输入 Bot Token"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:"请输入 Chat ID"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:"可选,例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1})],64)):"s3"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bF)(x,{label:"Endpoint",prop:"endpoint"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:"例如: https://s3.us-east-005.backblazeb2.com"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"CDN 域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com"},null,8,["modelValue"]),e[68]||(e[68]=(0,s.Lk)("span",{class:"form-tip"},"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本",-1))]),_:1}),(0,s.bF)(x,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:"请输入存储桶名称"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:"默认填写 auto"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:"请输入访问密钥 ID"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:"请输入机密访问密钥"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"路径风格"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"]),e[69]||(e[69]=(0,s.Lk)("span",{class:"form-tip"},"使用 OpenList 时需开启",-1))]),_:1}),(0,s.bF)(x,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1}),o.newChannel.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"停用阈值 (%)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:2},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:"请输入 Bot Token"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:"请输入 Channel ID"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:"可选,例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Nitro 会员"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"]),e[70]||(e[70]=(0,s.Lk)("span",{class:"form-tip"},"会员单文件限制 25MB,否则为 10MB",-1))]),_:1}),(0,s.Lk)("div",Xd,[(0,s.bF)(l,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),e[71]||(e[71]=(0,s.eW)(" Discord 有接口频率限制,不建议将其用作大规模并发场景 ",-1))])],64)):"huggingface"===o.newChannel.type?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.bF)(x,{label:"仓库名",prop:"repo"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:"格式: username/repo-name"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Access Token",prop:"token"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:"请输入 Access Token"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"私有仓库"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"]),e[72]||(e[72]=(0,s.Lk)("span",{class:"form-tip"},"私有仓库限制 100GB",-1))]),_:1})],64)):(0,s.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","onClosed"]),(0,s.bF)(F,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[28]||(e[28]=t=>o.showDetailDialog=t),title:"渠道详情 - "+(o.currentChannel?.name||""),class:"channel-dialog",onClosed:r.resetDetailData},{footer:(0,s.k6)(()=>[(0,s.bF)(d,{onClick:e[27]||(e[27]=t=>o.showDetailDialog=!1)},{default:(0,s.k6)(()=>[...e[77]||(e[77]=[(0,s.eW)("关闭",-1)])]),_:1}),(0,s.bF)(d,{type:"primary",onClick:r.openEditFromDetail},{default:(0,s.k6)(()=>[...e[78]||(e[78]=[(0,s.eW)("编辑",-1)])]),_:1},8,["onClick"])]),default:(0,s.k6)(()=>[(0,s.bF)(M,{column:1,border:""},{default:(0,s.k6)(()=>[(0,s.bF)(S,{label:"渠道名称"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1}),(0,s.bF)(S,{label:"渠道类型"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getChannelTypeLabel(o.currentChannelType)),1)]),_:1}),(0,s.bF)(S,{label:"状态"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.enabled?"已启用":"已禁用"),1)]),_:1},8,["type"])]),_:1}),o.currentChannel?.fixed?((0,s.uX)(),(0,s.Wv)(S,{key:0,label:"配置来源"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{type:"warning"},{default:(0,s.k6)(()=>[...e[75]||(e[75]=[(0,s.eW)("环境变量",-1)])]),_:1})]),_:1})):(0,s.Q3)("",!0),"telegram"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bF)(S,{label:"Bot Token"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.botToken,10)),1)]),_:1}),(0,s.bF)(S,{label:"Chat ID"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.chatId,6)),1)]),_:1}),(0,s.bF)(S,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.proxyUrl||"未设置"),1)]),_:1})],64)):"cfr2"===o.currentChannelType?((0,s.uX)(),(0,s.Wv)(S,{key:2,label:"公开访问链接"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{"model-value":o.currentChannel?.publicUrl||"未设置",readonly:""},null,8,["model-value"])]),_:1})):"s3"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.bF)(S,{label:"Endpoint"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1}),(0,s.bF)(S,{label:"CDN 域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{"model-value":o.currentChannel?.cdnDomain||"未设置",readonly:""},null,8,["model-value"])]),_:1}),(0,s.bF)(S,{label:"存储桶名称"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1}),(0,s.bF)(S,{label:"存储桶区域"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1}),(0,s.bF)(S,{label:"路径风格"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.pathStyle?"是":"否"),1)]),_:1})],64)):"discord"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:4},[(0,s.bF)(S,{label:"Bot Token"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.botToken,10)),1)]),_:1}),(0,s.bF)(S,{label:"Channel ID"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.maskText(o.currentChannel?.channelId,6)),1)]),_:1}),(0,s.bF)(S,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.proxyUrl||"未设置"),1)]),_:1}),(0,s.bF)(S,{label:"Nitro 会员"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.isNitro?"是":"否"),1)]),_:1})],64)):"huggingface"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:5},[(0,s.bF)(S,{label:"仓库名"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1}),(0,s.bF)(S,{label:"私有仓库"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.isPrivate?"是":"否"),1)]),_:1})],64)):(0,s.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:6},[(0,s.bF)(S,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1}),(0,s.bF)(S,{label:"停用阈值"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1}),(0,s.bF)(S,null,{label:(0,s.k6)(()=>[(0,s.Lk)("span",qd,[e[76]||(e[76]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(d,{link:"",type:"primary",onClick:r.refreshQuota,class:"refresh-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Kd,[(0,s.bF)(f,{percentage:r.getQuotaPercentage(o.currentChannel),status:r.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>r.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(r.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,s.bF)(F,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[58]||(e[58]=t=>o.showEditDialog=t),title:"编辑渠道 - "+(o.editChannel?.name||""),class:"channel-dialog","destroy-on-close":"",onClosed:r.resetEditData},{footer:(0,s.k6)(()=>[(0,s.bF)(d,{onClick:e[57]||(e[57]=t=>o.showEditDialog=!1)},{default:(0,s.k6)(()=>[...e[80]||(e[80]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(d,{type:"primary",onClick:r.confirmEditChannel},{default:(0,s.k6)(()=>[...e[81]||(e[81]=[(0,s.eW)("保存修改",-1)])]),_:1},8,["onClick"])]),default:(0,s.k6)(()=>[(0,s.bF)(C,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:o.editRules},{default:(0,s.k6)(()=>[(0,s.bF)(x,{label:"渠道名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editChannel.name=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"启用渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1}),"telegram"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[31]||(e[31]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[32]||(e[32]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[33]||(e[33]=t=>o.editChannel.proxyUrl=t),placeholder:"例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1})],64)):"cfr2"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bF)(x,{label:"公开访问链接"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[34]||(e[34]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[35]||(e[35]=t=>o.editChannel.quota.enabled=t),onChange:e[36]||(e[36]=t=>r.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1}),o.editChannel.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[37]||(e[37]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"停用阈值 (%)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:2},[(0,s.bF)(x,{label:"Endpoint",prop:"endpoint"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"CDN 域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.cdnDomain=t),placeholder:"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com"},null,8,["modelValue"]),e[79]||(e[79]=(0,s.Lk)("span",{class:"form-tip"},"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本",-1))]),_:1}),(0,s.bF)(x,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"路径风格"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[45]||(e[45]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"容量限制"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.enabled=t),onChange:e[47]||(e[47]=t=>r.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1}),o.editChannel.quota?.enabled?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.bF)(x,{label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"停用阈值 (%)"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:3},[(0,s.bF)(x,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"代理域名"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.proxyUrl=t),placeholder:"例如: your-proxy.example.com"},null,8,["modelValue"])]),_:1}),(0,s.bF)(x,{label:"Nitro 会员"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1})],64)):"huggingface"===o.currentChannelType?((0,s.uX)(),(0,s.CE)(s.FK,{key:4},[(0,s.bF)(x,{label:"仓库名",prop:"repo"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"Access Token",prop:"token"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(x,{label:"私有仓库"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[56]||(e[56]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):(0,s.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[A,o.loading]])}var Qd={components:{CustomSelect:dd},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1},addRules:{type:[{required:!0,message:"请选择渠道类型",trigger:"change"}],name:[{required:!0,message:"请输入渠道名称",trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:"渠道名称只能包含中英文、数字、下划线和横线",trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",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"}],repo:[{required:!0,message:"请输入仓库名",trigger:"blur"}],token:[{required:!0,message:"请输入 Access Token",trigger:"blur"}]},editRules:{name:[{required:!0,message:"请输入渠道名称",trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:"渠道名称只能包含中英文、数字、下划线和横线",trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",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"}],repo:[{required:!0,message:"请输入仓库名",trigger:"blur"}],token:[{required:!0,message:"请输入 Access Token",trigger:"blur"}]},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){const t={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot"};return[{value:"",label:"全部类型"},...this.channels.map(e=>({value:e.value,label:e.label,icon:t[e.value]||"server"}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels}},methods:{handleCardMouseMove(t,e,i){const s=t.currentTarget,n=s.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,r=`glow-${e}-${i}`,l=this.$refs[r];l&&l[0]&&(l[0].style.opacity="1",l[0].style.left=`${a}px`,l[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const i=`glow-${t}-${e}`,s=this.$refs[i];s&&s[0]&&(s[0].style.opacity="0")},getChannelIcon(t){const e={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot"};return e[t]||"server"},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):"未设置"},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const i=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(i)),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:i}=this.newChannel,s=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env"];if(n.includes(i))return void this.$message.warning("该名称为系统保留名称,请使用其他名称");const a=s.channels.some(t=>t.name===i);if(a)return void this.$message.warning("该类型下已存在同名渠道,请使用其他名称");let o={id:s.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};"telegram"===e?Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl}):"s3"===e?Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}}):"discord"===e?Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro}):"huggingface"===e&&Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate}),s.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),i=this.editChannel.name,s=this.currentChannelIndex,n=this.editChannel.fixed;if(!n){const t=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env"];if(t.includes(i))return void this.$message.warning("该名称为系统保留名称,请使用其他名称");const n=e.channels.some((t,e)=>e!==s&&t.name===i);if(n)return void this.$message.warning("该类型下已存在同名渠道,请使用其他名称")}e.channels[this.currentChannelIndex]={...this.editChannel},this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const i=this.getChannelList(t)[e];i.fixed?this.$message.warning("环境变量配置的渠道无法删除"):this.$confirm("确定要删除该渠道吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{const i=this.getSettings(t);i.channels.splice(e,1),i.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings};(0,Ut.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success("设置已保存")})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Ut.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Ut.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,Ut.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,Ut.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,Ut.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:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Gd=(0,c.A)(Qd,[["render",Yd],["__scopeId","data-v-89234e52"]]);var Jd=Gd,Zd=i(850);i(8736);const tu={class:"save-text"};function eu(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":i.loading}]),onClick:e[0]||(e[0]=(...t)=>r.handleClick&&r.handleClick(...t))},[i.loading?((0,s.uX)(),(0,s.Wv)(l,{key:0,icon:"spinner",spin:""})):((0,s.uX)(),(0,s.Wv)(l,{key:1,icon:"save"})),(0,s.Lk)("span",tu,(0,n.v_)(i.loading?"保存中":"保存"),1)],2)}var iu={name:"FloatingSaveButton",props:{loading:{type:Boolean,default:!1}},methods:{handleClick(){this.loading||this.$emit("click")}}};const su=(0,c.A)(iu,[["render",eu],["__scopeId","data-v-26e68e9c"]]);var nu=su,au=i(7138);i(5802),i(4752);const ou={class:"security-settings"},ru={class:"first-settings"},lu={class:"second-title token-title"},hu={class:"token-actions"},cu={class:"token-table-container"},du={class:"table-cell-content"},uu={class:"table-cell-content"},gu={class:"token-display"},pu={class:"table-cell-content"},fu={class:"table-cell-content"},mu={class:"table-cell-content action-buttons"},bu={class:"first-settings"},xu={class:"second-title"},yu={class:"first-settings"},_u={class:"dialog-footer"},vu={class:"dialog-footer"},ku={class:"token-result"},wu={style:{"margin-bottom":"15px",color:"#e6a23c"}},Cu={class:"dialog-footer"};function Fu(t,e,i,a,o,r){const l=id.WK,h=td.xE,c=td.US,d=(0,s.g2)("font-awesome-icon"),u=k.S2,g=au.o8,f=ad.u,m=au.Up,b=p.R7,x=nd.qi,y=sd.P9,v=sd.AV,w=nu,C=Zd.dI,F=Zd.o5,S=Zc.kZ,M=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",ou,[(0,s.Lk)("div",ru,[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)(od.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)(od.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",lu,[e[23]||(e[23]=(0,s.eW)("API Token 管理 ",-1)),(0,s.Lk)("a",hu,[(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",cu,[(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",du,(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",uu,[(0,s.Lk)("span",gu,(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",pu,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.row.permissions,t=>((0,s.uX)(),(0,s.Wv)(f,{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",fu,(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",mu,[(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"])),[[M,o.tokenLoading]])])]),(0,s.Lk)("div",bu,[e[30]||(e[30]=(0,s.Lk)("h3",{class:"first-title"},"上传管理",-1)),(0,s.Lk)("h4",xu,[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",yu,[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.bF)(w,{onClick:r.saveSettings},null,8,["onClick"]),(0,s.bF)(S,{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",_u,[(0,s.bF)(u,{onClick:e[14]||(e[14]=t=>o.showCreateTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[39]||(e[39]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.createToken},{default:(0,s.k6)(()=>[...e[40]||(e[40]=[(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)(F,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(C,{label:"upload"},{default:(0,s.k6)(()=>[...e[36]||(e[36]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(C,{label:"delete"},{default:(0,s.k6)(()=>[...e[37]||(e[37]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(C,{label:"list"},{default:(0,s.k6)(()=>[...e[38]||(e[38]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(S,{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",vu,[(0,s.bF)(u,{onClick:e[18]||(e[18]=t=>o.showEditTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[44]||(e[44]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.updateToken},{default:(0,s.k6)(()=>[...e[45]||(e[45]=[(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)(F,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[17]||(e[17]=t=>o.editingToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(C,{label:"upload"},{default:(0,s.k6)(()=>[...e[41]||(e[41]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(C,{label:"delete"},{default:(0,s.k6)(()=>[...e[42]||(e[42]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(C,{label:"list"},{default:(0,s.k6)(()=>[...e[43]||(e[43]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(S,{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",Cu,[(0,s.bF)(u,{type:"primary",onClick:e[21]||(e[21]=t=>o.showTokenResultDialog=!1)},{default:(0,s.k6)(()=>[...e[48]||(e[48]=[(0,s.eW)("我已保存",-1)])]),_:1})])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",ku,[(0,s.Lk)("p",wu,[(0,s.bF)(d,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),e[46]||(e[46]=(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[47]||(e[47]=[(0,s.eW)("复制",-1)])]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue","width"])])),[[M,o.loading]])}i(1148);var Su={components:{FloatingSaveButton:nu},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,Ut.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,Ut.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,Ut.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,Ut.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,Ut.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,Ut.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 Mu=(0,c.A)(Su,[["render",Fu],["__scopeId","data-v-63b9b06c"]]);var Au=Mu;const Pu={class:"page-settings"},Tu={class:"first-title"};function Du(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=sd.P9,d=sd.AV,u=nd.qi,g=id.WK,f=td.xE,m=td.US,b=nu,x=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Pu,[((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",Tu,(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)(f,{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"])):"channelName"===t.type?((0,s.uX)(),(0,s.Wv)(d,{key:1,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:!r.currentUploadChannel||0===r.currentChannelList.length,placeholder:"请先选择上传渠道",clearable:"",style:{width:"100%"}},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.currentChannelList,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled"])):"boolean"===t.type?((0,s.uX)(),(0,s.Wv)(u,{key:2,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:3,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.bF)(b,{onClick:r.saveSettings},null,8,["onClick"])])),[[x,o.loading]])}var Eu=i(457),Lu={components:{FloatingSaveButton:nu},data(){return{settings:{config:[]},loading:!1,availableChannels:{}}},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},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const i=this.availableChannels[t]||[];i.some(t=>t.name===e.value)||(e.value="")}}}},methods:{saveSettings(){(0,Ut.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))},async fetchAvailableChannels(){try{const t=await Eu.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Ut.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 Iu=(0,c.A)(Lu,[["render",Du],["__scopeId","data-v-7b8c65e5"]]);var Vu=Iu;const Ou={class:"others-settings"},Ru={class:"first-settings"},Wu={class:"first-title"},Bu={class:"first-title"},zu={class:"first-title"},Nu={class:"first-title"},Uu={class:"first-title"};function $u(t,e,i,n,a,o){const r=(0,s.g2)("font-awesome-icon"),l=p.R7,h=nd.qi,c=td.xE,d=td.US,u=id.WK,g=sd.P9,f=sd.AV,m=nu,b=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Ou,[(0,s.Lk)("div",Ru,[(0,s.Lk)("h3",Wu,[e[13]||(e[13]=(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",Bu,[e[14]||(e[14]=(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[15]||(e[15]=(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",zu,[e[16]||(e[16]=(0,s.eW)("访客图库 ",-1)),(0,s.bF)(l,{content:"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)",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.publicBrowse,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.publicBrowse.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>a.settings.publicBrowse.enabled=t),disabled:a.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"publicBrowse.allowedDir"},{label:(0,s.k6)(()=>[e[18]||(e[18]=(0,s.Lk)("span",null,"开放目录",-1)),(0,s.bF)(l,{placement:"right","raw-content":""},{content:(0,s.k6)(()=>[...e[17]||(e[17]=[(0,s.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"}},[(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},[(0,s.Lk)("b",null,"允许公开浏览的目录,多个目录用逗号分隔")]),(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},"示例:wallpaper,photos,album"),(0,s.Lk)("p",{style:{margin:"0 0 8px 0",color:"#909399"}},"支持子目录:2026/lucky,2026/rich"),(0,s.Lk)("p",{style:{margin:"0",color:"#67c23a"}},"访问链接:https://你的域名/browse/2026/lucky")],-1)])]),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.publicBrowse.allowedDir,"onUpdate:modelValue":e[4]||(e[4]=t=>a.settings.publicBrowse.allowedDir=t),disabled:a.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Nu,[e[19]||(e[19]=(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[5]||(e[5]=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[6]||(e[6]=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[7]||(e[7]=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",Uu,[e[20]||(e[20]=(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[8]||(e[8]=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[9]||(e[9]=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[10]||(e[10]=t=>a.settings.webDAV.password=t),disabled:a.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"上传渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(f,{modelValue:a.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>a.settings.webDAV.uploadChannel=t),disabled:a.settings.webDAV.fixed,placeholder:"默认渠道",clearable:""},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"Telegram",value:"telegram"}),(0,s.bF)(g,{label:"Cloudflare R2",value:"cfr2"}),(0,s.bF)(g,{label:"S3",value:"s3"}),(0,s.bF)(g,{label:"Discord",value:"discord"}),(0,s.bF)(g,{label:"HuggingFace",value:"huggingface"})]),_:1},8,["modelValue","disabled"])]),_:1}),a.settings.webDAV.uploadChannel&&o.webdavChannelList.length>1?((0,s.uX)(),(0,s.Wv)(c,{key:0,label:"指定渠道名"},{default:(0,s.k6)(()=>[(0,s.bF)(f,{modelValue:a.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>a.settings.webDAV.channelName=t),disabled:a.settings.webDAV.fixed,placeholder:"自动选择",clearable:""},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.webdavChannelList,t=>((0,s.uX)(),(0,s.Wv)(g,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled"])]),_:1})):(0,s.Q3)("",!0)]),_:1},8,["model"])]),(0,s.bF)(m,{onClick:o.saveSettings},null,8,["onClick"])])),[[b,a.loading]])}var ju={components:{FloatingSaveButton:nu},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!1}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Ut.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))},async fetchAvailableChannels(){try{const t=await(0,Ut.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Ut.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const Hu=(0,c.A)(ju,[["render",$u],["__scopeId","data-v-0c6af1f8"]]);var Xu=Hu,qu={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:f.A,SysConfigTabs:u,SysCogStatus:Gc,SysCogUpload:Jd,SysCogSecurity:Au,SysCogPage:Vu,SysCogOthers:Xu},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return Gc;case"upload":return Jd;case"security":return Au;case"page":return Vu;case"others":return Xu;default:return Gc}}},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 Ku=(0,c.A)(qu,[["render",y],["__scopeId","data-v-4cdf1dc2"]]);var Yu=Ku},2893:function(t,e,i){i(5331)},3565:function(t,e,i){i(5331)},4752:function(t,e,i){i(5331),i(8736),i(8785)},5616:function(t,e,i){i(5331),i(7197)},5802:function(t,e,i){i(5331),i(8736),i(213),i(5970)}}]); +//# sourceMappingURL=925.2ee8e454.js.map \ No newline at end of file diff --git a/js/925.2ee8e454.js.gz b/js/925.2ee8e454.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..286346b805ae4f565e579a2bfacda02584d0d55c GIT binary patch literal 92555 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