From 5d550faec97b822e4b96ec6e4f23a4470a51f6ed Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Mon, 13 Apr 2026 14:21:29 -0300 Subject: [PATCH] backup: persist restic size telemetry and retention totals --- README.md | 5 +- internal/config/config.go | 6 + internal/server/server.go | 220 +++++++++++++++++- internal/server/server_test.go | 143 ++++++++++++ ...{index-Dq7_oHb5.css => index-B24a4-XK.css} | 2 +- .../server/ui-dist/assets/index-Bl8gBoZ6.js | 40 ---- .../server/ui-dist/assets/index-C9X7C4pD.js | 40 ++++ internal/server/ui-dist/index.html | 4 +- web/src/App.tsx | 2 +- 9 files changed, 406 insertions(+), 56 deletions(-) rename internal/server/ui-dist/assets/{index-Dq7_oHb5.css => index-B24a4-XK.css} (50%) delete mode 100644 internal/server/ui-dist/assets/index-Bl8gBoZ6.js create mode 100644 internal/server/ui-dist/assets/index-C9X7C4pD.js diff --git a/README.md b/README.md index 6c1613f..fbfc6e9 100644 --- a/README.md +++ b/README.md @@ -273,6 +273,7 @@ Environment variables: - `SOTERIA_METRICS_REFRESH_SECONDS` default `300` - `SOTERIA_POLICY_EVAL_SECONDS` default `300` - `SOTERIA_POLICY_SECRET_NAME` default `soteria-policies` +- `SOTERIA_USAGE_SECRET_NAME` default `soteria-backup-usage` (stores persisted restic size estimates) - `SOTERIA_B2_ENABLED` default `false` (auto-enabled if endpoint/secret are set) - `SOTERIA_B2_ENDPOINT` optional S3-compatible endpoint (for B2, usually `https://s3..backblazeb2.com`) - `SOTERIA_B2_REGION` optional region override (auto-inferred for Backblaze endpoint patterns) @@ -321,6 +322,6 @@ The example Service is annotated for Prometheus scraping of `/metrics`. - Longhorn inventory and metrics are based on discovered backup records per PVC. - Inventory `Restore` buttons load source context into the restore planner; restore execution happens from the planner panel. -- Scheduled policy execution currently applies to Longhorn driver. -- Restic backup and restore execution exists, but inventory-style telemetry is currently Longhorn-focused. +- Scheduled backup policies apply to both Longhorn and restic drivers. +- Restic size telemetry is estimated from per-job upload summaries; with shared dedupe repositories those values are per-PVC attributions, not exact physical B2 ownership. - For Atlas production, place Soteria behind an authenticated ingress and trust only proxy-injected auth headers. diff --git a/internal/config/config.go b/internal/config/config.go index 64990ec..c4c2c49 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -21,6 +21,7 @@ const ( defaultPolicyEval = 300 * time.Second defaultBackupMaxAge = 24 * time.Hour defaultPolicySecret = "soteria-policies" + defaultUsageSecret = "soteria-backup-usage" defaultB2ScanInterval = 15 * time.Minute defaultB2ScanTimeout = 2 * time.Minute serviceNamespacePath = "/var/run/secrets/kubernetes.io/serviceaccount/namespace" @@ -49,6 +50,7 @@ type Config struct { MetricsRefreshInterval time.Duration PolicyEvalInterval time.Duration PolicySecretName string + UsageSecretName string BackupMaxAge time.Duration B2Enabled bool B2Endpoint string @@ -102,6 +104,7 @@ func Load() (*Config, error) { cfg.PolicyEvalInterval = defaultPolicyEval cfg.BackupMaxAge = defaultBackupMaxAge cfg.PolicySecretName = getenvDefault("SOTERIA_POLICY_SECRET_NAME", defaultPolicySecret) + cfg.UsageSecretName = getenvDefault("SOTERIA_USAGE_SECRET_NAME", defaultUsageSecret) cfg.B2Enabled = getenvBool("SOTERIA_B2_ENABLED") cfg.B2Endpoint = getenv("SOTERIA_B2_ENDPOINT") cfg.B2Region = getenv("SOTERIA_B2_REGION") @@ -185,6 +188,9 @@ func Load() (*Config, error) { if strings.TrimSpace(cfg.PolicySecretName) == "" { return nil, errors.New("SOTERIA_POLICY_SECRET_NAME must not be empty") } + if strings.TrimSpace(cfg.UsageSecretName) == "" { + return nil, errors.New("SOTERIA_USAGE_SECRET_NAME must not be empty") + } if cfg.BackupMaxAge <= 0 { return nil, errors.New("SOTERIA_BACKUP_MAX_AGE_HOURS must be greater than zero") } diff --git a/internal/server/server.go b/internal/server/server.go index d79235a..6c1f443 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -65,6 +65,8 @@ type Server struct { b2Usage api.B2UsageResponse jobUsage map[string]resticJobUsageCacheEntry jobUsageMu sync.RWMutex + usageMu sync.RWMutex + usageStore map[string]resticPersistedUsageEntry } type authIdentity struct { @@ -80,6 +82,7 @@ const authContextKey ctxKey = "soteria-auth" const ( policySecretKey = "policies.json" + usageSecretKey = "restic-job-usage.json" defaultPolicyHours = 24.0 maxPolicyIntervalHrs = 24 * 365 maxPolicyKeepLast = 1000 @@ -93,6 +96,19 @@ type resticJobUsageCacheEntry struct { CheckedAt time.Time } +type resticPersistedUsageEntry struct { + Bytes float64 `json:"bytes"` + UpdatedAt string `json:"updated_at,omitempty"` +} + +type resticPersistedUsageDocument struct { + Jobs []struct { + Key string `json:"key"` + Bytes float64 `json:"bytes"` + UpdatedAt string `json:"updated_at,omitempty"` + } `json:"jobs"` +} + var ( resticAddedStoredPattern = regexp.MustCompile(`(?mi)added to the (?:repository|repo):[^\n]*\(([^)]+)\s+stored\)`) resticDataAddedPattern = regexp.MustCompile(`(?m)"data_added":\s*([0-9]+)`) @@ -100,13 +116,14 @@ var ( func New(cfg *config.Config, client *k8s.Client, lh *longhorn.Client) *Server { s := &Server{ - cfg: cfg, - client: client, - longhorn: lh, - metrics: newTelemetry(), - ui: newUIRenderer(), - policies: map[string]api.BackupPolicy{}, - jobUsage: map[string]resticJobUsageCacheEntry{}, + cfg: cfg, + client: client, + longhorn: lh, + metrics: newTelemetry(), + ui: newUIRenderer(), + policies: map[string]api.BackupPolicy{}, + jobUsage: map[string]resticJobUsageCacheEntry{}, + usageStore: map[string]resticPersistedUsageEntry{}, } s.handler = http.HandlerFunc(s.route) return s @@ -116,6 +133,9 @@ func (s *Server) Start(ctx context.Context) { if err := s.loadPolicies(ctx); err != nil { log.Printf("policy load failed: %v", err) } + if err := s.loadResticUsage(ctx); err != nil { + log.Printf("restic usage load failed: %v", err) + } s.refreshTelemetry(ctx) s.refreshB2Usage(ctx) @@ -303,11 +323,12 @@ func (s *Server) handleBackups(w http.ResponseWriter, r *http.Request) { writeError(w, http.StatusBadGateway, err.Error()) return } + records := s.buildResticBackupRecords(r.Context(), namespace, jobs, s.cfg.ResticRepository) writeJSON(w, http.StatusOK, api.BackupListResponse{ Namespace: namespace, PVC: pvcName, Volume: volumeName, - Backups: buildResticBackupRecords(jobs, s.cfg.ResticRepository), + Backups: records, }) default: writeError(w, http.StatusBadRequest, "unsupported backup driver") @@ -1060,9 +1081,16 @@ func (s *Server) enrichPVCInventory( } entry.ActiveBackups = active entry.CompletedBackups = len(completed) + sizeSamples := completed + if len(sizeSamples) > 0 { + retained := sizeSamples[0].KeepLast + if retained > 0 && retained < len(sizeSamples) { + sizeSamples = sizeSamples[:retained] + } + } totalStoredBytes := 0.0 storedSamples := 0 - for index, job := range completed { + for index, job := range sizeSamples { if index >= maxUsageSampleJobs { break } @@ -1139,6 +1167,21 @@ func (s *Server) lookupResticStoredBytesForJob(ctx context.Context, namespace, j return cached.Bytes, cached.Known } + if bytes, known := s.lookupPersistedResticUsage(key); known { + entry := resticJobUsageCacheEntry{ + Known: true, + Bytes: bytes, + CheckedAt: time.Now().UTC(), + } + s.jobUsageMu.Lock() + if s.jobUsage == nil { + s.jobUsage = map[string]resticJobUsageCacheEntry{} + } + s.jobUsage[key] = entry + s.jobUsageMu.Unlock() + return bytes, true + } + logBody, err := s.client.ReadBackupJobLog(ctx, namespace, jobName) entry := resticJobUsageCacheEntry{ Known: false, @@ -1149,6 +1192,7 @@ func (s *Server) lookupResticStoredBytesForJob(ctx context.Context, namespace, j if parsedBytes, parsed := parseResticStoredBytes(logBody); parsed { entry.Known = true entry.Bytes = parsedBytes + s.storePersistedResticUsage(ctx, key, parsedBytes) } } @@ -1221,6 +1265,138 @@ func parseHumanByteSize(raw string) (float64, bool) { } } +func (s *Server) loadResticUsage(ctx context.Context) error { + if strings.TrimSpace(s.cfg.UsageSecretName) == "" { + return nil + } + raw, err := s.client.LoadSecretData(ctx, s.cfg.Namespace, s.cfg.UsageSecretName, usageSecretKey) + if err != nil { + return err + } + if len(raw) == 0 { + return nil + } + + var doc resticPersistedUsageDocument + if err := json.Unmarshal(raw, &doc); err != nil { + return fmt.Errorf("decode restic usage document: %w", err) + } + next := map[string]resticPersistedUsageEntry{} + for _, item := range doc.Jobs { + key := strings.TrimSpace(item.Key) + if key == "" || item.Bytes < 0 || math.IsNaN(item.Bytes) || math.IsInf(item.Bytes, 0) { + continue + } + next[key] = resticPersistedUsageEntry{ + Bytes: item.Bytes, + UpdatedAt: strings.TrimSpace(item.UpdatedAt), + } + } + + s.usageMu.Lock() + s.usageStore = next + s.usageMu.Unlock() + return nil +} + +func (s *Server) lookupPersistedResticUsage(key string) (float64, bool) { + s.usageMu.RLock() + defer s.usageMu.RUnlock() + if s.usageStore == nil { + return 0, false + } + entry, ok := s.usageStore[key] + if !ok { + return 0, false + } + if entry.Bytes < 0 || math.IsNaN(entry.Bytes) || math.IsInf(entry.Bytes, 0) { + return 0, false + } + return entry.Bytes, true +} + +func (s *Server) storePersistedResticUsage(ctx context.Context, key string, value float64) { + if key == "" || value < 0 || math.IsNaN(value) || math.IsInf(value, 0) { + return + } + now := time.Now().UTC().Format(time.RFC3339) + changed := false + + s.usageMu.Lock() + if s.usageStore == nil { + s.usageStore = map[string]resticPersistedUsageEntry{} + } + current, exists := s.usageStore[key] + if !exists || current.Bytes != value || strings.TrimSpace(current.UpdatedAt) == "" { + s.usageStore[key] = resticPersistedUsageEntry{ + Bytes: value, + UpdatedAt: now, + } + changed = true + } + s.usageMu.Unlock() + + if !changed { + return + } + if err := s.persistResticUsage(ctx); err != nil { + log.Printf("persist restic usage failed: %v", err) + } +} + +func (s *Server) persistResticUsage(ctx context.Context) error { + if strings.TrimSpace(s.cfg.UsageSecretName) == "" { + return nil + } + s.usageMu.RLock() + entries := make([]struct { + Key string + Value resticPersistedUsageEntry + }, 0, len(s.usageStore)) + for key, value := range s.usageStore { + entries = append(entries, struct { + Key string + Value resticPersistedUsageEntry + }{Key: key, Value: value}) + } + s.usageMu.RUnlock() + + sort.Slice(entries, func(i, j int) bool { + return entries[i].Key < entries[j].Key + }) + + doc := resticPersistedUsageDocument{ + Jobs: make([]struct { + Key string `json:"key"` + Bytes float64 `json:"bytes"` + UpdatedAt string `json:"updated_at,omitempty"` + }, 0, len(entries)), + } + for _, entry := range entries { + if entry.Key == "" || entry.Value.Bytes < 0 || math.IsNaN(entry.Value.Bytes) || math.IsInf(entry.Value.Bytes, 0) { + continue + } + doc.Jobs = append(doc.Jobs, struct { + Key string `json:"key"` + Bytes float64 `json:"bytes"` + UpdatedAt string `json:"updated_at,omitempty"` + }{ + Key: entry.Key, + Bytes: entry.Value.Bytes, + UpdatedAt: strings.TrimSpace(entry.Value.UpdatedAt), + }) + } + + payload, err := json.Marshal(doc) + if err != nil { + return fmt.Errorf("encode restic usage document: %w", err) + } + return s.client.SaveSecretData(ctx, s.cfg.Namespace, s.cfg.UsageSecretName, usageSecretKey, payload, map[string]string{ + "app.kubernetes.io/name": "soteria", + "app.kubernetes.io/component": "usage-store", + }) +} + func (s *Server) refreshTelemetry(ctx context.Context) { refreshCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) defer cancel() @@ -1740,7 +1916,7 @@ func buildBackupRecords(backups []longhorn.Backup) []api.BackupRecord { return records } -func buildResticBackupRecords(jobs []k8s.BackupJobSummary, defaultRepository string) []api.BackupRecord { +func (s *Server) buildResticBackupRecords(ctx context.Context, namespace string, jobs []k8s.BackupJobSummary, defaultRepository string) []api.BackupRecord { records := make([]api.BackupRecord, 0, len(jobs)) latestName := "" for _, job := range jobs { @@ -1756,6 +1932,7 @@ func buildResticBackupRecords(jobs []k8s.BackupJobSummary, defaultRepository str created = ts.UTC().Format(time.RFC3339) } url := "" + size := "" latest := job.Name == latestName if latest && strings.EqualFold(job.State, "Completed") { repository := strings.TrimSpace(job.Repository) @@ -1764,12 +1941,18 @@ func buildResticBackupRecords(jobs []k8s.BackupJobSummary, defaultRepository str } url = encodeResticSelector(repository) } + if strings.EqualFold(job.State, "Completed") { + if bytes, ok := s.lookupResticStoredBytesForJob(ctx, namespace, job.Name); ok { + size = formatBytesIEC(bytes) + } + } records = append(records, api.BackupRecord{ Name: job.Name, SnapshotName: job.Name, Created: created, State: job.State, URL: url, + Size: size, Latest: latest, }) } @@ -1935,6 +2118,23 @@ func parseSizeBytes(raw string) int64 { return 0 } +func formatBytesIEC(value float64) string { + if value <= 0 || math.IsNaN(value) || math.IsInf(value, 0) { + return "0 B" + } + units := []string{"B", "KiB", "MiB", "GiB", "TiB"} + size := value + unit := 0 + for size >= 1024 && unit < len(units)-1 { + size /= 1024 + unit++ + } + if unit == 0 { + return fmt.Sprintf("%.0f %s", size, units[unit]) + } + return fmt.Sprintf("%.2f %s", size, units[unit]) +} + func dedupeDefault(value *bool) bool { if value == nil { return true diff --git a/internal/server/server_test.go b/internal/server/server_test.go index 08fe57d..d2c6d5d 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -420,6 +420,142 @@ func TestResticInventoryUsesCompletedBackupJobs(t *testing.T) { } } +func TestResticInventoryUsesPersistedUsageWhenLogsGone(t *testing.T) { + completedAt := time.Now().UTC().Add(-90 * time.Minute) + jobName := "soteria-backup-data-20260413-010000" + srv := &Server{ + cfg: &config.Config{ + AuthRequired: false, + BackupDriver: "restic", + BackupMaxAge: 24 * time.Hour, + }, + client: &fakeKubeClient{ + pvcs: []k8s.PVCSummary{ + {Namespace: "apps", Name: "data", VolumeName: "pv-apps-data", Phase: "Bound"}, + }, + backupJobs: map[string][]k8s.BackupJobSummary{ + "apps/data": { + { + Name: jobName, + Namespace: "apps", + PVC: "data", + CreatedAt: completedAt.Add(-2 * time.Minute), + CompletionTime: completedAt, + State: "Completed", + }, + }, + }, + }, + longhorn: &fakeLonghornClient{}, + metrics: newTelemetry(), + jobUsage: map[string]resticJobUsageCacheEntry{}, + usageStore: map[string]resticPersistedUsageEntry{ + "apps/" + jobName: { + Bytes: 4096, + UpdatedAt: time.Now().UTC().Format(time.RFC3339), + }, + }, + } + srv.handler = http.HandlerFunc(srv.route) + + req := httptest.NewRequest(http.MethodGet, "/v1/inventory", nil) + res := httptest.NewRecorder() + srv.Handler().ServeHTTP(res, req) + + if res.Code != http.StatusOK { + t.Fatalf("expected 200, got %d: %s", res.Code, res.Body.String()) + } + + var payload api.InventoryResponse + if err := json.Unmarshal(res.Body.Bytes(), &payload); err != nil { + t.Fatalf("decode inventory: %v", err) + } + entry := payload.Namespaces[0].PVCs[0] + if entry.LastBackupSizeBytes != 4096 { + t.Fatalf("expected persisted last backup bytes, got %#v", entry.LastBackupSizeBytes) + } + if entry.TotalBackupSizeBytes != 4096 { + t.Fatalf("expected persisted total backup bytes, got %#v", entry.TotalBackupSizeBytes) + } +} + +func TestResticInventoryKeepLastLimitsTotalStoredSample(t *testing.T) { + now := time.Now().UTC() + srv := &Server{ + cfg: &config.Config{ + AuthRequired: false, + BackupDriver: "restic", + BackupMaxAge: 24 * time.Hour, + }, + client: &fakeKubeClient{ + pvcs: []k8s.PVCSummary{ + {Namespace: "apps", Name: "data", VolumeName: "pv-apps-data", Phase: "Bound"}, + }, + backupJobs: map[string][]k8s.BackupJobSummary{ + "apps/data": { + { + Name: "soteria-backup-data-20260413-030000", + Namespace: "apps", + PVC: "data", + CreatedAt: now.Add(-3 * time.Hour), + CompletionTime: now.Add(-3 * time.Hour), + State: "Completed", + KeepLast: 1, + }, + { + Name: "soteria-backup-data-20260413-020000", + Namespace: "apps", + PVC: "data", + CreatedAt: now.Add(-4 * time.Hour), + CompletionTime: now.Add(-4 * time.Hour), + State: "Completed", + KeepLast: 1, + }, + { + Name: "soteria-backup-data-20260413-010000", + Namespace: "apps", + PVC: "data", + CreatedAt: now.Add(-5 * time.Hour), + CompletionTime: now.Add(-5 * time.Hour), + State: "Completed", + KeepLast: 1, + }, + }, + }, + jobLogs: map[string]string{ + "apps/soteria-backup-data-20260413-030000": `{"data_added": 1200}`, + "apps/soteria-backup-data-20260413-020000": `{"data_added": 800}`, + "apps/soteria-backup-data-20260413-010000": `{"data_added": 600}`, + }, + }, + longhorn: &fakeLonghornClient{}, + metrics: newTelemetry(), + jobUsage: map[string]resticJobUsageCacheEntry{}, + usageStore: map[string]resticPersistedUsageEntry{}, + } + srv.handler = http.HandlerFunc(srv.route) + + req := httptest.NewRequest(http.MethodGet, "/v1/inventory", nil) + res := httptest.NewRecorder() + srv.Handler().ServeHTTP(res, req) + + if res.Code != http.StatusOK { + t.Fatalf("expected 200, got %d: %s", res.Code, res.Body.String()) + } + + var payload api.InventoryResponse + if err := json.Unmarshal(res.Body.Bytes(), &payload); err != nil { + t.Fatalf("decode inventory: %v", err) + } + entry := payload.Namespaces[0].PVCs[0] + if entry.LastBackupSizeBytes != 1200 { + t.Fatalf("expected latest backup size to be sampled, got %#v", entry.LastBackupSizeBytes) + } + if entry.TotalBackupSizeBytes != 1200 { + t.Fatalf("expected keep_last=1 total to reflect retained snapshot only, got %#v", entry.TotalBackupSizeBytes) + } +} + func TestResticInventoryMarksInProgressWhenOnlyActiveJobsExist(t *testing.T) { startedAt := time.Now().UTC().Add(-5 * time.Minute) srv := &Server{ @@ -502,9 +638,13 @@ func TestResticBackupsEndpointReturnsLatestSelector(t *testing.T) { }, }, }, + jobLogs: map[string]string{ + "apps/soteria-backup-data-20260413-010000": `{"data_added": 1200}`, + }, }, longhorn: &fakeLonghornClient{}, metrics: newTelemetry(), + jobUsage: map[string]resticJobUsageCacheEntry{}, } srv.handler = http.HandlerFunc(srv.route) @@ -526,6 +666,9 @@ func TestResticBackupsEndpointReturnsLatestSelector(t *testing.T) { if payload.Backups[0].URL != "latest" || !payload.Backups[0].Latest { t.Fatalf("expected latest restic selector, got %#v", payload.Backups[0]) } + if payload.Backups[0].Size == "" { + t.Fatalf("expected restic backup size metadata, got %#v", payload.Backups[0]) + } } func TestResticRestoreUsesRepositorySelector(t *testing.T) { diff --git a/internal/server/ui-dist/assets/index-Dq7_oHb5.css b/internal/server/ui-dist/assets/index-B24a4-XK.css similarity index 50% rename from internal/server/ui-dist/assets/index-Dq7_oHb5.css rename to internal/server/ui-dist/assets/index-B24a4-XK.css index 6930c36..63e8848 100644 --- a/internal/server/ui-dist/assets/index-Dq7_oHb5.css +++ b/internal/server/ui-dist/assets/index-B24a4-XK.css @@ -1 +1 @@ -:root{color-scheme:dark;--bg: #090d14;--bg-alt: #101726;--card: #131e31;--card-alt: #17263b;--line: #23324d;--text: #e8efff;--muted: #9eb2d8;--accent: #3ea7ff;--accent-soft: #203759;--good: #48c88e;--bad: #ff6a78;--warn: #f1b45a;--shadow: rgba(4, 8, 15, .4)}*{box-sizing:border-box}body{margin:0;font-family:IBM Plex Sans,Segoe UI,sans-serif;color:var(--text);background:radial-gradient(1200px 500px at 20% -20%,#1f3656 0%,transparent 60%),radial-gradient(1000px 700px at 120% 10%,#1f2f4e 0%,transparent 50%),var(--bg)}h1,h2,h3,h4,p{margin:0}button,input,select{font:inherit}.app-shell{min-height:100vh;padding:20px}.topbar{max-width:1780px;margin:0 auto 18px;padding:18px 20px;border:1px solid var(--line);border-radius:16px;background:linear-gradient(150deg,#131e31f5,#0c1421f5);box-shadow:0 16px 34px var(--shadow);display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}.topbar h1{font-size:clamp(1.35rem,1.7vw,1.9rem);letter-spacing:.02em}.subtle{color:var(--muted)}.tiny{font-size:.84rem}.toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.layout{max-width:1780px;margin:0 auto;display:grid;grid-template-columns:minmax(430px,1.5fr) minmax(360px,1fr) minmax(380px,1.05fr);gap:16px;align-items:start}.column{display:grid;gap:16px}.panel{border:1px solid var(--line);border-radius:16px;background:linear-gradient(150deg,#131e31f2,#101726f5);box-shadow:0 12px 30px var(--shadow);padding:14px;display:grid;gap:12px}.scroll-panel{max-height:calc(100vh - 160px);overflow:auto}.panel-header{display:flex;justify-content:space-between;align-items:center;gap:12px}.chip{border-radius:999px;border:1px solid var(--line);padding:4px 10px;font-size:.82rem;background:var(--bg-alt);color:var(--muted);display:inline-flex;align-items:center;white-space:nowrap}.chip.good{border-color:#48c88e99;color:var(--good);background:#48c88e1c}.chip.bad{border-color:#ff6a7899;color:var(--bad);background:#ff6a781f}.chip.warn{border-color:#f1b45a99;color:var(--warn);background:#f1b45a1f}button{border:1px solid transparent;border-radius:10px;padding:7px 12px;cursor:pointer;color:#091220;background:var(--accent);font-weight:600}button.secondary{border-color:var(--line);color:var(--text);background:var(--accent-soft)}button:disabled{opacity:.65;cursor:wait}.actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.error{color:var(--bad);font-weight:600}.namespace-block{border:1px solid rgba(35,50,77,.65);border-radius:14px;padding:10px;display:grid;gap:10px;background:#0c121ea6}.namespace-row{display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap}.namespace-row h3{font-size:1.03rem}.pvc-grid{display:grid;gap:9px}.pvc-card{border:1px solid rgba(35,50,77,.8);border-radius:12px;background:linear-gradient(155deg,#17263beb,#0f1929eb);padding:10px;display:grid;gap:8px}.pvc-title-row{display:flex;justify-content:space-between;gap:10px;align-items:flex-start}.pvc-title-row h4{font-size:.98rem}label{display:grid;gap:6px;font-size:.9rem;color:var(--muted)}input,select{border:1px solid var(--line);border-radius:10px;color:var(--text);background:#090d14cc;padding:8px 10px}.stack{display:grid;gap:10px}pre{margin:0;border-radius:12px;border:1px solid var(--line);background:#060a10fa;color:#dbf0ff;padding:10px;max-height:290px;overflow:auto;font-size:.82rem}.action-panel{min-height:280px}.stat-grid{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr))}.stat{border:1px solid var(--line);border-radius:10px;background:#0d1827db;padding:8px;display:grid;gap:4px}.stat .label{color:var(--muted);font-size:.78rem}.bucket-table-wrap{overflow:auto;max-height:270px;border:1px solid var(--line);border-radius:10px}table{width:100%;border-collapse:collapse;font-size:.85rem}th,td{text-align:left;padding:8px;border-bottom:1px solid rgba(35,50,77,.6);vertical-align:top}th{position:sticky;top:0;background:#0a101cf5}.policy-list{display:grid;gap:8px}.policy-item{border:1px solid rgba(35,50,77,.8);border-radius:11px;background:#0b121fc7;padding:9px;display:grid;gap:7px}.policy-head{display:flex;justify-content:space-between;align-items:center;gap:10px}.checkbox-row{display:flex;align-items:center;gap:8px;color:var(--text)}@media (max-width: 1420px){.layout{grid-template-columns:minmax(420px,1.5fr) minmax(330px,1fr)}.layout>.column:last-child{grid-column:1 / -1;grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 1080px){.app-shell{padding:12px}.layout{grid-template-columns:1fr}.layout>.column:last-child{grid-template-columns:1fr}.scroll-panel{max-height:none}.stat-grid{grid-template-columns:1fr}} +:root{color-scheme:dark;--bg: #090d14;--bg-alt: #101726;--card: #131e31;--card-alt: #17263b;--line: #23324d;--text: #e8efff;--muted: #9eb2d8;--accent: #3ea7ff;--accent-soft: #203759;--good: #48c88e;--bad: #ff6a78;--warn: #f1b45a;--shadow: rgba(4, 8, 15, .4)}*{box-sizing:border-box}body{margin:0;font-family:IBM Plex Sans,Segoe UI,sans-serif;color:var(--text);background:radial-gradient(1200px 500px at 20% -20%,#1f3656 0%,transparent 60%),radial-gradient(1000px 700px at 120% 10%,#1f2f4e 0%,transparent 50%),var(--bg)}h1,h2,h3,h4,p{margin:0}button,input,select{font:inherit}.app-shell{min-height:100vh;padding:20px}.topbar{max-width:1780px;margin:0 auto 18px;padding:18px 20px;border:1px solid var(--line);border-radius:16px;background:linear-gradient(150deg,#131e31f5,#0c1421f5);box-shadow:0 16px 34px var(--shadow);display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}.topbar h1{font-size:clamp(1.35rem,1.7vw,1.9rem);letter-spacing:.02em}.subtle{color:var(--muted)}.tiny{font-size:.84rem}.toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.layout{max-width:1780px;margin:0 auto;display:grid;grid-template-columns:minmax(430px,1.5fr) minmax(360px,1fr) minmax(380px,1.05fr);gap:16px;align-items:start}.column{display:grid;gap:16px}.panel{border:1px solid var(--line);border-radius:16px;background:linear-gradient(150deg,#131e31f2,#101726f5);box-shadow:0 12px 30px var(--shadow);padding:14px;display:grid;gap:12px}.scroll-panel{max-height:calc(100vh - 160px);overflow:auto}.panel-header{display:flex;justify-content:space-between;align-items:center;gap:12px}.chip{border-radius:999px;border:1px solid var(--line);padding:4px 10px;font-size:.82rem;background:var(--bg-alt);color:var(--muted);display:inline-flex;align-items:center;white-space:nowrap}.chip.good{border-color:#48c88e99;color:var(--good);background:#48c88e1c}.chip.bad{border-color:#ff6a7899;color:var(--bad);background:#ff6a781f}.chip.warn{border-color:#f1b45a99;color:var(--warn);background:#f1b45a1f}button{border:1px solid transparent;border-radius:10px;padding:7px 12px;cursor:pointer;color:#091220;background:var(--accent);font-weight:600}button.secondary{border-color:var(--line);color:var(--text);background:var(--accent-soft)}button:disabled{opacity:.65;cursor:wait}.actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.error{color:var(--bad);font-weight:600}.namespace-block{border:1px solid rgba(35,50,77,.65);border-radius:14px;padding:10px;display:grid;gap:10px;background:#0c121ea6}.namespace-row{display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap}.namespace-row h3{font-size:1.03rem}.pvc-grid{display:grid;gap:9px}.pvc-card{border:1px solid rgba(35,50,77,.8);border-radius:12px;background:linear-gradient(155deg,#17263beb,#0f1929eb);padding:10px;display:grid;gap:8px}.backup-progress{border:1px solid rgba(35,50,77,.7);border-radius:10px;background:#090e18b8;padding:8px;display:grid;gap:7px}.progress-header{display:flex;justify-content:space-between;align-items:center;gap:8px}.progress-track{border-radius:999px;border:1px solid var(--line);overflow:hidden;height:9px;background:#0d1827f2}.progress-fill{height:100%;border-radius:999px;transition:width .24s ease}.progress-fill.good{background:linear-gradient(90deg,#48c88eb8,#5beda4e6)}.progress-fill.warn{background:linear-gradient(90deg,#f1b45ab3,#ffce80e6)}.progress-fill.bad{background:linear-gradient(90deg,#ff6a78b8,#ff8594e6)}.progress-fill.active{background-size:20px 20px;background-image:linear-gradient(-45deg,rgba(255,255,255,.08) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.08) 50%,rgba(255,255,255,.08) 75%,transparent 75%,transparent);animation:progress-shift 1s linear infinite}@keyframes progress-shift{0%{background-position:0 0}to{background-position:20px 0}}.pvc-title-row{display:flex;justify-content:space-between;gap:10px;align-items:flex-start}.pvc-title-row h4{font-size:.98rem}label{display:grid;gap:6px;font-size:.9rem;color:var(--muted)}input,select{border:1px solid var(--line);border-radius:10px;color:var(--text);background:#090d14cc;padding:8px 10px}.stack{display:grid;gap:10px}pre{margin:0;border-radius:12px;border:1px solid var(--line);background:#060a10fa;color:#dbf0ff;padding:10px;max-height:290px;overflow:auto;font-size:.82rem}.action-panel{min-height:280px}.stat-grid{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr))}.stat{border:1px solid var(--line);border-radius:10px;background:#0d1827db;padding:8px;display:grid;gap:4px}.stat .label{color:var(--muted);font-size:.78rem}.bucket-table-wrap{overflow:auto;max-height:270px;border:1px solid var(--line);border-radius:10px}table{width:100%;border-collapse:collapse;font-size:.85rem}th,td{text-align:left;padding:8px;border-bottom:1px solid rgba(35,50,77,.6);vertical-align:top}th{position:sticky;top:0;background:#0a101cf5}.policy-list{display:grid;gap:8px}.policy-item{border:1px solid rgba(35,50,77,.8);border-radius:11px;background:#0b121fc7;padding:9px;display:grid;gap:7px}.policy-head{display:flex;justify-content:space-between;align-items:center;gap:10px}.checkbox-row{display:flex;align-items:center;gap:8px;color:var(--text)}@media (max-width: 1420px){.layout{grid-template-columns:minmax(420px,1.5fr) minmax(330px,1fr)}.layout>.column:last-child{grid-column:1 / -1;grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 1080px){.app-shell{padding:12px}.layout{grid-template-columns:1fr}.layout>.column:last-child{grid-template-columns:1fr}.scroll-panel{max-height:none}.stat-grid{grid-template-columns:1fr}} diff --git a/internal/server/ui-dist/assets/index-Bl8gBoZ6.js b/internal/server/ui-dist/assets/index-Bl8gBoZ6.js deleted file mode 100644 index f38dc40..0000000 --- a/internal/server/ui-dist/assets/index-Bl8gBoZ6.js +++ /dev/null @@ -1,40 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const u of o.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&r(u)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();function Nc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var us={exports:{}},pl={},is={exports:{}},M={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var ar=Symbol.for("react.element"),Pc=Symbol.for("react.portal"),jc=Symbol.for("react.fragment"),zc=Symbol.for("react.strict_mode"),Tc=Symbol.for("react.profiler"),Lc=Symbol.for("react.provider"),Rc=Symbol.for("react.context"),Oc=Symbol.for("react.forward_ref"),Mc=Symbol.for("react.suspense"),Dc=Symbol.for("react.memo"),Ic=Symbol.for("react.lazy"),Gu=Symbol.iterator;function Fc(e){return e===null||typeof e!="object"?null:(e=Gu&&e[Gu]||e["@@iterator"],typeof e=="function"?e:null)}var ss={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},as=Object.assign,cs={};function kn(e,t,n){this.props=e,this.context=t,this.refs=cs,this.updater=n||ss}kn.prototype.isReactComponent={};kn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};kn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function fs(){}fs.prototype=kn.prototype;function Jo(e,t,n){this.props=e,this.context=t,this.refs=cs,this.updater=n||ss}var qo=Jo.prototype=new fs;qo.constructor=Jo;as(qo,kn.prototype);qo.isPureReactComponent=!0;var Zu=Array.isArray,ds=Object.prototype.hasOwnProperty,bo={current:null},ps={key:!0,ref:!0,__self:!0,__source:!0};function ms(e,t,n){var r,l={},o=null,u=null;if(t!=null)for(r in t.ref!==void 0&&(u=t.ref),t.key!==void 0&&(o=""+t.key),t)ds.call(t,r)&&!ps.hasOwnProperty(r)&&(l[r]=t[r]);var i=arguments.length-2;if(i===1)l.children=n;else if(1>>1,G=C[A];if(0>>1;Al(Z,R))Oel(J,Z)?(C[A]=J,C[Oe]=R,A=Oe):(C[A]=Z,C[b]=R,A=b);else if(Oel(J,R))C[A]=J,C[Oe]=R,A=Oe;else break e}}return T}function l(C,T){var R=C.sortIndex-T.sortIndex;return R!==0?R:C.id-T.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var u=Date,i=u.now();e.unstable_now=function(){return u.now()-i}}var s=[],c=[],y=1,v=null,m=3,k=!1,S=!1,x=!1,L=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,a=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(C){for(var T=n(c);T!==null;){if(T.callback===null)r(c);else if(T.startTime<=C)r(c),T.sortIndex=T.expirationTime,t(s,T);else break;T=n(c)}}function g(C){if(x=!1,d(C),!S)if(n(s)!==null)S=!0,Ht(E);else{var T=n(c);T!==null&&Wt(g,T.startTime-C)}}function E(C,T){S=!1,x&&(x=!1,f(j),j=-1),k=!0;var R=m;try{for(d(T),v=n(s);v!==null&&(!(v.expirationTime>T)||C&&!he());){var A=v.callback;if(typeof A=="function"){v.callback=null,m=v.priorityLevel;var G=A(v.expirationTime<=T);T=e.unstable_now(),typeof G=="function"?v.callback=G:v===n(s)&&r(s),d(T)}else r(s);v=n(s)}if(v!==null)var Pt=!0;else{var b=n(c);b!==null&&Wt(g,b.startTime-T),Pt=!1}return Pt}finally{v=null,m=R,k=!1}}var N=!1,P=null,j=-1,V=5,O=-1;function he(){return!(e.unstable_now()-OC||125A?(C.sortIndex=R,t(c,C),n(s)===null&&C===n(c)&&(x?(f(j),j=-1):x=!0,Wt(g,R-A))):(C.sortIndex=G,t(s,C),S||k||(S=!0,Ht(E))),C},e.unstable_shouldYield=he,e.unstable_wrapCallback=function(C){var T=m;return function(){var R=m;m=T;try{return C.apply(this,arguments)}finally{m=R}}}})(ws);gs.exports=ws;var Gc=gs.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Zc=F,Ce=Gc;function w(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),lo=Object.prototype.hasOwnProperty,Jc=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,qu={},bu={};function qc(e){return lo.call(bu,e)?!0:lo.call(qu,e)?!1:Jc.test(e)?bu[e]=!0:(qu[e]=!0,!1)}function bc(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function ef(e,t,n,r){if(t===null||typeof t>"u"||bc(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function me(e,t,n,r,l,o,u){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=u}var ue={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ue[e]=new me(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ue[t]=new me(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ue[e]=new me(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ue[e]=new me(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ue[e]=new me(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ue[e]=new me(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ue[e]=new me(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ue[e]=new me(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ue[e]=new me(e,5,!1,e.toLowerCase(),null,!1,!1)});var tu=/[\-:]([a-z])/g;function nu(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(tu,nu);ue[t]=new me(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(tu,nu);ue[t]=new me(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(tu,nu);ue[t]=new me(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ue[e]=new me(e,1,!1,e.toLowerCase(),null,!1,!1)});ue.xlinkHref=new me("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ue[e]=new me(e,1,!1,e.toLowerCase(),null,!0,!0)});function ru(e,t,n,r){var l=ue.hasOwnProperty(t)?ue[t]:null;(l!==null?l.type!==0:r||!(2i||l[u]!==o[i]){var s=` -`+l[u].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=u&&0<=i);break}}}finally{Ol=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?On(e):""}function tf(e){switch(e.tag){case 5:return On(e.type);case 16:return On("Lazy");case 13:return On("Suspense");case 19:return On("SuspenseList");case 0:case 2:case 15:return e=Ml(e.type,!1),e;case 11:return e=Ml(e.type.render,!1),e;case 1:return e=Ml(e.type,!0),e;default:return""}}function so(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Gt:return"Fragment";case Xt:return"Portal";case oo:return"Profiler";case lu:return"StrictMode";case uo:return"Suspense";case io:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case xs:return(e.displayName||"Context")+".Consumer";case Ss:return(e._context.displayName||"Context")+".Provider";case ou:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case uu:return t=e.displayName||null,t!==null?t:so(e.type)||"Memo";case it:t=e._payload,e=e._init;try{return so(e(t))}catch{}}return null}function nf(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return so(t);case 8:return t===lu?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function St(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Cs(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function rf(e){var t=Cs(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(u){r=""+u,o.call(this,u)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(u){r=""+u},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function vr(e){e._valueTracker||(e._valueTracker=rf(e))}function _s(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Cs(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Hr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ao(e,t){var n=t.checked;return K({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ti(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=St(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ns(e,t){t=t.checked,t!=null&&ru(e,"checked",t,!1)}function co(e,t){Ns(e,t);var n=St(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?fo(e,t.type,n):t.hasOwnProperty("defaultValue")&&fo(e,t.type,St(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ni(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function fo(e,t,n){(t!=="number"||Hr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Mn=Array.isArray;function un(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=yr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Yn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Fn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},lf=["Webkit","ms","Moz","O"];Object.keys(Fn).forEach(function(e){lf.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Fn[t]=Fn[e]})});function Ts(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Fn.hasOwnProperty(e)&&Fn[e]?(""+t).trim():t+"px"}function Ls(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Ts(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var of=K({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ho(e,t){if(t){if(of[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(w(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(w(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(w(61))}if(t.style!=null&&typeof t.style!="object")throw Error(w(62))}}function vo(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var yo=null;function iu(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var go=null,sn=null,an=null;function oi(e){if(e=dr(e)){if(typeof go!="function")throw Error(w(280));var t=e.stateNode;t&&(t=gl(t),go(e.stateNode,e.type,t))}}function Rs(e){sn?an?an.push(e):an=[e]:sn=e}function Os(){if(sn){var e=sn,t=an;if(an=sn=null,oi(e),t)for(e=0;e>>=0,e===0?32:31-(yf(e)/gf|0)|0}var gr=64,wr=4194304;function Dn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Yr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,u=n&268435455;if(u!==0){var i=u&~l;i!==0?r=Dn(i):(o&=u,o!==0&&(r=Dn(o)))}else u=n&~l,u!==0?r=Dn(u):o!==0&&(r=Dn(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function cr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-$e(t),e[t]=n}function xf(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Bn),mi=" ",hi=!1;function bs(e,t){switch(e){case"keyup":return Zf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ea(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Zt=!1;function qf(e,t){switch(e){case"compositionend":return ea(t);case"keypress":return t.which!==32?null:(hi=!0,mi);case"textInput":return e=t.data,e===mi&&hi?null:e;default:return null}}function bf(e,t){if(Zt)return e==="compositionend"||!hu&&bs(e,t)?(e=Js(),Mr=du=ft=null,Zt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=wi(n)}}function la(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?la(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function oa(){for(var e=window,t=Hr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Hr(e.document)}return t}function vu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function sd(e){var t=oa(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&la(n.ownerDocument.documentElement,n)){if(r!==null&&vu(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=ki(n,o);var u=ki(n,r);l&&u&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==u.node||e.focusOffset!==u.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(u.node,u.offset)):(t.setEnd(u.node,u.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Jt=null,Co=null,Vn=null,_o=!1;function Si(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;_o||Jt==null||Jt!==Hr(r)||(r=Jt,"selectionStart"in r&&vu(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Vn&&bn(Vn,r)||(Vn=r,r=Zr(Co,"onSelect"),0en||(e.current=Lo[en],Lo[en]=null,en--)}function U(e,t){en++,Lo[en]=e.current,e.current=t}var xt={},ce=Ct(xt),ge=Ct(!1),It=xt;function mn(e,t){var n=e.type.contextTypes;if(!n)return xt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function we(e){return e=e.childContextTypes,e!=null}function qr(){$(ge),$(ce)}function ji(e,t,n){if(ce.current!==xt)throw Error(w(168));U(ce,t),U(ge,n)}function ma(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(w(108,nf(e)||"Unknown",l));return K({},n,r)}function br(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||xt,It=ce.current,U(ce,e),U(ge,ge.current),!0}function zi(e,t,n){var r=e.stateNode;if(!r)throw Error(w(169));n?(e=ma(e,t,It),r.__reactInternalMemoizedMergedChildContext=e,$(ge),$(ce),U(ce,e)):$(ge),U(ge,n)}var Ge=null,wl=!1,Xl=!1;function ha(e){Ge===null?Ge=[e]:Ge.push(e)}function kd(e){wl=!0,ha(e)}function _t(){if(!Xl&&Ge!==null){Xl=!0;var e=0,t=I;try{var n=Ge;for(I=1;e>=u,l-=u,Ze=1<<32-$e(t)+l|n<j?(V=P,P=null):V=P.sibling;var O=m(f,P,d[j],g);if(O===null){P===null&&(P=V);break}e&&P&&O.alternate===null&&t(f,P),a=o(O,a,j),N===null?E=O:N.sibling=O,N=O,P=V}if(j===d.length)return n(f,P),H&&zt(f,j),E;if(P===null){for(;jj?(V=P,P=null):V=P.sibling;var he=m(f,P,O.value,g);if(he===null){P===null&&(P=V);break}e&&P&&he.alternate===null&&t(f,P),a=o(he,a,j),N===null?E=he:N.sibling=he,N=he,P=V}if(O.done)return n(f,P),H&&zt(f,j),E;if(P===null){for(;!O.done;j++,O=d.next())O=v(f,O.value,g),O!==null&&(a=o(O,a,j),N===null?E=O:N.sibling=O,N=O);return H&&zt(f,j),E}for(P=r(f,P);!O.done;j++,O=d.next())O=k(P,f,j,O.value,g),O!==null&&(e&&O.alternate!==null&&P.delete(O.key===null?j:O.key),a=o(O,a,j),N===null?E=O:N.sibling=O,N=O);return e&&P.forEach(function(lt){return t(f,lt)}),H&&zt(f,j),E}function L(f,a,d,g){if(typeof d=="object"&&d!==null&&d.type===Gt&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case hr:e:{for(var E=d.key,N=a;N!==null;){if(N.key===E){if(E=d.type,E===Gt){if(N.tag===7){n(f,N.sibling),a=l(N,d.props.children),a.return=f,f=a;break e}}else if(N.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===it&&Ri(E)===N.type){n(f,N.sibling),a=l(N,d.props),a.ref=zn(f,N,d),a.return=f,f=a;break e}n(f,N);break}else t(f,N);N=N.sibling}d.type===Gt?(a=Dt(d.props.children,f.mode,g,d.key),a.return=f,f=a):(g=Ar(d.type,d.key,d.props,null,f.mode,g),g.ref=zn(f,a,d),g.return=f,f=g)}return u(f);case Xt:e:{for(N=d.key;a!==null;){if(a.key===N)if(a.tag===4&&a.stateNode.containerInfo===d.containerInfo&&a.stateNode.implementation===d.implementation){n(f,a.sibling),a=l(a,d.children||[]),a.return=f,f=a;break e}else{n(f,a);break}else t(f,a);a=a.sibling}a=no(d,f.mode,g),a.return=f,f=a}return u(f);case it:return N=d._init,L(f,a,N(d._payload),g)}if(Mn(d))return S(f,a,d,g);if(Cn(d))return x(f,a,d,g);Nr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,a!==null&&a.tag===6?(n(f,a.sibling),a=l(a,d),a.return=f,f=a):(n(f,a),a=to(d,f.mode,g),a.return=f,f=a),u(f)):n(f,a)}return L}var vn=wa(!0),ka=wa(!1),nl=Ct(null),rl=null,rn=null,ku=null;function Su(){ku=rn=rl=null}function xu(e){var t=nl.current;$(nl),e._currentValue=t}function Mo(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function fn(e,t){rl=e,ku=rn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ye=!0),e.firstContext=null)}function Le(e){var t=e._currentValue;if(ku!==e)if(e={context:e,memoizedValue:t,next:null},rn===null){if(rl===null)throw Error(w(308));rn=e,rl.dependencies={lanes:0,firstContext:e}}else rn=rn.next=e;return t}var Rt=null;function Eu(e){Rt===null?Rt=[e]:Rt.push(e)}function Sa(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Eu(t)):(n.next=l.next,l.next=n),t.interleaved=n,tt(e,r)}function tt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var st=!1;function Cu(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function xa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function qe(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function yt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,D&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,tt(e,n)}return l=r.interleaved,l===null?(t.next=t,Eu(r)):(t.next=l.next,l.next=t),r.interleaved=t,tt(e,n)}function Ir(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,au(e,n)}}function Oi(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var u={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};o===null?l=o=u:o=o.next=u,n=n.next}while(n!==null);o===null?l=o=t:o=o.next=t}else l=o=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:o,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function ll(e,t,n,r){var l=e.updateQueue;st=!1;var o=l.firstBaseUpdate,u=l.lastBaseUpdate,i=l.shared.pending;if(i!==null){l.shared.pending=null;var s=i,c=s.next;s.next=null,u===null?o=c:u.next=c,u=s;var y=e.alternate;y!==null&&(y=y.updateQueue,i=y.lastBaseUpdate,i!==u&&(i===null?y.firstBaseUpdate=c:i.next=c,y.lastBaseUpdate=s))}if(o!==null){var v=l.baseState;u=0,y=c=s=null,i=o;do{var m=i.lane,k=i.eventTime;if((r&m)===m){y!==null&&(y=y.next={eventTime:k,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var S=e,x=i;switch(m=t,k=n,x.tag){case 1:if(S=x.payload,typeof S=="function"){v=S.call(k,v,m);break e}v=S;break e;case 3:S.flags=S.flags&-65537|128;case 0:if(S=x.payload,m=typeof S=="function"?S.call(k,v,m):S,m==null)break e;v=K({},v,m);break e;case 2:st=!0}}i.callback!==null&&i.lane!==0&&(e.flags|=64,m=l.effects,m===null?l.effects=[i]:m.push(i))}else k={eventTime:k,lane:m,tag:i.tag,payload:i.payload,callback:i.callback,next:null},y===null?(c=y=k,s=v):y=y.next=k,u|=m;if(i=i.next,i===null){if(i=l.shared.pending,i===null)break;m=i,i=m.next,m.next=null,l.lastBaseUpdate=m,l.shared.pending=null}}while(!0);if(y===null&&(s=v),l.baseState=s,l.firstBaseUpdate=c,l.lastBaseUpdate=y,t=l.shared.interleaved,t!==null){l=t;do u|=l.lane,l=l.next;while(l!==t)}else o===null&&(l.shared.lanes=0);Bt|=u,e.lanes=u,e.memoizedState=v}}function Mi(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Zl.transition;Zl.transition={};try{e(!1),t()}finally{I=n,Zl.transition=r}}function Ba(){return Re().memoizedState}function Cd(e,t,n){var r=wt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},$a(e))Va(t,n);else if(n=Sa(e,t,n,r),n!==null){var l=de();Ve(n,e,r,l),Aa(n,t,r)}}function _d(e,t,n){var r=wt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if($a(e))Va(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var u=t.lastRenderedState,i=o(u,n);if(l.hasEagerState=!0,l.eagerState=i,Ae(i,u)){var s=t.interleaved;s===null?(l.next=l,Eu(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=Sa(e,t,l,r),n!==null&&(l=de(),Ve(n,e,r,l),Aa(n,t,r))}}function $a(e){var t=e.alternate;return e===Q||t!==null&&t===Q}function Va(e,t){An=ul=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Aa(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,au(e,n)}}var il={readContext:Le,useCallback:ie,useContext:ie,useEffect:ie,useImperativeHandle:ie,useInsertionEffect:ie,useLayoutEffect:ie,useMemo:ie,useReducer:ie,useRef:ie,useState:ie,useDebugValue:ie,useDeferredValue:ie,useTransition:ie,useMutableSource:ie,useSyncExternalStore:ie,useId:ie,unstable_isNewReconciler:!1},Nd={readContext:Le,useCallback:function(e,t){return We().memoizedState=[e,t===void 0?null:t],e},useContext:Le,useEffect:Ii,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Ur(4194308,4,Ma.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ur(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ur(4,2,e,t)},useMemo:function(e,t){var n=We();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=We();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Cd.bind(null,Q,e),[r.memoizedState,e]},useRef:function(e){var t=We();return e={current:e},t.memoizedState=e},useState:Di,useDebugValue:Ru,useDeferredValue:function(e){return We().memoizedState=e},useTransition:function(){var e=Di(!1),t=e[0];return e=Ed.bind(null,e[1]),We().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Q,l=We();if(H){if(n===void 0)throw Error(w(407));n=n()}else{if(n=t(),re===null)throw Error(w(349));Ut&30||Na(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,Ii(ja.bind(null,r,o,e),[e]),r.flags|=2048,ir(9,Pa.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=We(),t=re.identifierPrefix;if(H){var n=Je,r=Ze;n=(r&~(1<<32-$e(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=or++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),n==="select"&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[Qe]=t,e[nr]=r,qa(e,t,!1,!1),t.stateNode=e;e:{switch(u=vo(n,r),n){case"dialog":B("cancel",e),B("close",e),l=r;break;case"iframe":case"object":case"embed":B("load",e),l=r;break;case"video":case"audio":for(l=0;lwn&&(t.flags|=128,r=!0,Tn(o,!1),t.lanes=4194304)}else{if(!r)if(e=ol(u),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Tn(o,!0),o.tail===null&&o.tailMode==="hidden"&&!u.alternate&&!H)return se(t),null}else 2*X()-o.renderingStartTime>wn&&n!==1073741824&&(t.flags|=128,r=!0,Tn(o,!1),t.lanes=4194304);o.isBackwards?(u.sibling=t.child,t.child=u):(n=o.last,n!==null?n.sibling=u:t.child=u,o.last=u)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=X(),t.sibling=null,n=W.current,U(W,r?n&1|2:n&1),t):(se(t),null);case 22:case 23:return Uu(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Se&1073741824&&(se(t),t.subtreeFlags&6&&(t.flags|=8192)):se(t),null;case 24:return null;case 25:return null}throw Error(w(156,t.tag))}function Md(e,t){switch(gu(t),t.tag){case 1:return we(t.type)&&qr(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return yn(),$(ge),$(ce),Pu(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Nu(t),null;case 13:if($(W),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(w(340));hn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return $(W),null;case 4:return yn(),null;case 10:return xu(t.type._context),null;case 22:case 23:return Uu(),null;case 24:return null;default:return null}}var jr=!1,ae=!1,Dd=typeof WeakSet=="function"?WeakSet:Set,_=null;function ln(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Y(e,t,r)}else n.current=null}function Ho(e,t,n){try{n()}catch(r){Y(e,t,r)}}var Yi=!1;function Id(e,t){if(No=Xr,e=oa(),vu(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var u=0,i=-1,s=-1,c=0,y=0,v=e,m=null;t:for(;;){for(var k;v!==n||l!==0&&v.nodeType!==3||(i=u+l),v!==o||r!==0&&v.nodeType!==3||(s=u+r),v.nodeType===3&&(u+=v.nodeValue.length),(k=v.firstChild)!==null;)m=v,v=k;for(;;){if(v===e)break t;if(m===n&&++c===l&&(i=u),m===o&&++y===r&&(s=u),(k=v.nextSibling)!==null)break;v=m,m=v.parentNode}v=k}n=i===-1||s===-1?null:{start:i,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(Po={focusedElem:e,selectionRange:n},Xr=!1,_=t;_!==null;)if(t=_,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,_=e;else for(;_!==null;){t=_;try{var S=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(S!==null){var x=S.memoizedProps,L=S.memoizedState,f=t.stateNode,a=f.getSnapshotBeforeUpdate(t.elementType===t.type?x:Fe(t.type,x),L);f.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(w(163))}}catch(g){Y(t,t.return,g)}if(e=t.sibling,e!==null){e.return=t.return,_=e;break}_=t.return}return S=Yi,Yi=!1,S}function Hn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&Ho(t,n,o)}l=l.next}while(l!==r)}}function xl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Wo(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function tc(e){var t=e.alternate;t!==null&&(e.alternate=null,tc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Qe],delete t[nr],delete t[To],delete t[gd],delete t[wd])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function nc(e){return e.tag===5||e.tag===3||e.tag===4}function Xi(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||nc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qo(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Jr));else if(r!==4&&(e=e.child,e!==null))for(Qo(e,t,n),e=e.sibling;e!==null;)Qo(e,t,n),e=e.sibling}function Ko(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Ko(e,t,n),e=e.sibling;e!==null;)Ko(e,t,n),e=e.sibling}var le=null,Ue=!1;function ut(e,t,n){for(n=n.child;n!==null;)rc(e,t,n),n=n.sibling}function rc(e,t,n){if(Ke&&typeof Ke.onCommitFiberUnmount=="function")try{Ke.onCommitFiberUnmount(ml,n)}catch{}switch(n.tag){case 5:ae||ln(n,t);case 6:var r=le,l=Ue;le=null,ut(e,t,n),le=r,Ue=l,le!==null&&(Ue?(e=le,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):le.removeChild(n.stateNode));break;case 18:le!==null&&(Ue?(e=le,n=n.stateNode,e.nodeType===8?Yl(e.parentNode,n):e.nodeType===1&&Yl(e,n),Jn(e)):Yl(le,n.stateNode));break;case 4:r=le,l=Ue,le=n.stateNode.containerInfo,Ue=!0,ut(e,t,n),le=r,Ue=l;break;case 0:case 11:case 14:case 15:if(!ae&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,u=o.destroy;o=o.tag,u!==void 0&&(o&2||o&4)&&Ho(n,t,u),l=l.next}while(l!==r)}ut(e,t,n);break;case 1:if(!ae&&(ln(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(i){Y(n,t,i)}ut(e,t,n);break;case 21:ut(e,t,n);break;case 22:n.mode&1?(ae=(r=ae)||n.memoizedState!==null,ut(e,t,n),ae=r):ut(e,t,n);break;default:ut(e,t,n)}}function Gi(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Dd),t.forEach(function(r){var l=Qd.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function De(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=u),r&=~o}if(r=l,r=X()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Ud(r/1960))-r,10e?16:e,dt===null)var r=!1;else{if(e=dt,dt=null,cl=0,D&6)throw Error(w(331));var l=D;for(D|=4,_=e.current;_!==null;){var o=_,u=o.child;if(_.flags&16){var i=o.deletions;if(i!==null){for(var s=0;sX()-Iu?Mt(e,0):Du|=n),ke(e,t)}function fc(e,t){t===0&&(e.mode&1?(t=wr,wr<<=1,!(wr&130023424)&&(wr=4194304)):t=1);var n=de();e=tt(e,t),e!==null&&(cr(e,t,n),ke(e,n))}function Wd(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),fc(e,n)}function Qd(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(w(314))}r!==null&&r.delete(t),fc(e,n)}var dc;dc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ge.current)ye=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ye=!1,Rd(e,t,n);ye=!!(e.flags&131072)}else ye=!1,H&&t.flags&1048576&&va(t,tl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Br(e,t),e=t.pendingProps;var l=mn(t,ce.current);fn(t,n),l=zu(null,t,r,e,l,n);var o=Tu();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,we(r)?(o=!0,br(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Cu(t),l.updater=Sl,t.stateNode=l,l._reactInternals=t,Io(t,r,e,n),t=Bo(null,t,r,!0,o,n)):(t.tag=0,H&&o&&yu(t),fe(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Br(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Yd(r),e=Fe(r,e),l){case 0:t=Uo(null,t,r,e,n);break e;case 1:t=Wi(null,t,r,e,n);break e;case 11:t=Ai(null,t,r,e,n);break e;case 14:t=Hi(null,t,r,Fe(r.type,e),n);break e}throw Error(w(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),Uo(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),Wi(e,t,r,l,n);case 3:e:{if(Ga(t),e===null)throw Error(w(387));r=t.pendingProps,o=t.memoizedState,l=o.element,xa(e,t),ll(t,r,null,n);var u=t.memoizedState;if(r=u.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:u.cache,pendingSuspenseBoundaries:u.pendingSuspenseBoundaries,transitions:u.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=gn(Error(w(423)),t),t=Qi(e,t,r,n,l);break e}else if(r!==l){l=gn(Error(w(424)),t),t=Qi(e,t,r,n,l);break e}else for(xe=vt(t.stateNode.containerInfo.firstChild),Ee=t,H=!0,Be=null,n=ka(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(hn(),r===l){t=nt(e,t,n);break e}fe(e,t,r,n)}t=t.child}return t;case 5:return Ea(t),e===null&&Oo(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,u=l.children,jo(r,l)?u=null:o!==null&&jo(r,o)&&(t.flags|=32),Xa(e,t),fe(e,t,u,n),t.child;case 6:return e===null&&Oo(t),null;case 13:return Za(e,t,n);case 4:return _u(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=vn(t,null,r,n):fe(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),Ai(e,t,r,l,n);case 7:return fe(e,t,t.pendingProps,n),t.child;case 8:return fe(e,t,t.pendingProps.children,n),t.child;case 12:return fe(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,u=l.value,U(nl,r._currentValue),r._currentValue=u,o!==null)if(Ae(o.value,u)){if(o.children===l.children&&!ge.current){t=nt(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var i=o.dependencies;if(i!==null){u=o.child;for(var s=i.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=qe(-1,n&-n),s.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var y=c.pending;y===null?s.next=s:(s.next=y.next,y.next=s),c.pending=s}}o.lanes|=n,s=o.alternate,s!==null&&(s.lanes|=n),Mo(o.return,n,t),i.lanes|=n;break}s=s.next}}else if(o.tag===10)u=o.type===t.type?null:o.child;else if(o.tag===18){if(u=o.return,u===null)throw Error(w(341));u.lanes|=n,i=u.alternate,i!==null&&(i.lanes|=n),Mo(u,n,t),u=o.sibling}else u=o.child;if(u!==null)u.return=o;else for(u=o;u!==null;){if(u===t){u=null;break}if(o=u.sibling,o!==null){o.return=u.return,u=o;break}u=u.return}o=u}fe(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,fn(t,n),l=Le(l),r=r(l),t.flags|=1,fe(e,t,r,n),t.child;case 14:return r=t.type,l=Fe(r,t.pendingProps),l=Fe(r.type,l),Hi(e,t,r,l,n);case 15:return Ka(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),Br(e,t),t.tag=1,we(r)?(e=!0,br(t)):e=!1,fn(t,n),Ha(t,r,l),Io(t,r,l,n),Bo(null,t,r,!0,e,n);case 19:return Ja(e,t,n);case 22:return Ya(e,t,n)}throw Error(w(156,t.tag))};function pc(e,t){return $s(e,t)}function Kd(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ze(e,t,n,r){return new Kd(e,t,n,r)}function $u(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Yd(e){if(typeof e=="function")return $u(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ou)return 11;if(e===uu)return 14}return 2}function kt(e,t){var n=e.alternate;return n===null?(n=ze(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ar(e,t,n,r,l,o){var u=2;if(r=e,typeof e=="function")$u(e)&&(u=1);else if(typeof e=="string")u=5;else e:switch(e){case Gt:return Dt(n.children,l,o,t);case lu:u=8,l|=8;break;case oo:return e=ze(12,n,t,l|2),e.elementType=oo,e.lanes=o,e;case uo:return e=ze(13,n,t,l),e.elementType=uo,e.lanes=o,e;case io:return e=ze(19,n,t,l),e.elementType=io,e.lanes=o,e;case Es:return Cl(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ss:u=10;break e;case xs:u=9;break e;case ou:u=11;break e;case uu:u=14;break e;case it:u=16,r=null;break e}throw Error(w(130,e==null?e:typeof e,""))}return t=ze(u,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function Dt(e,t,n,r){return e=ze(7,e,r,t),e.lanes=n,e}function Cl(e,t,n,r){return e=ze(22,e,r,t),e.elementType=Es,e.lanes=n,e.stateNode={isHidden:!1},e}function to(e,t,n){return e=ze(6,e,null,t),e.lanes=n,e}function no(e,t,n){return t=ze(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Xd(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Il(0),this.expirationTimes=Il(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Il(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Vu(e,t,n,r,l,o,u,i,s){return e=new Xd(e,t,n,i,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=ze(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Cu(o),e}function Gd(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(yc)}catch(e){console.error(e)}}yc(),ys.exports=_e;var ep=ys.exports,rs=ep;ro.createRoot=rs.createRoot,ro.hydrateRoot=rs.hydrateRoot;const ls={enabled:!1,available:!1,total_objects:0,total_bytes:0,recent_objects_24h:0,recent_bytes_24h:0,buckets:[]};async function Ie(e,t){const n=await fetch(e,t),r=await n.text();let l={};if(r.trim()!=="")try{l=JSON.parse(r)}catch{l={error:r}}if(!n.ok){const o=typeof l=="object"&&l!==null&&"error"in l?String(l.error):`${n.status} ${n.statusText}`;throw new Error(o)}return l}function Yt(e){if(!e||e<=0)return"0 B";const t=["B","KiB","MiB","GiB","TiB"];let n=e,r=0;for(;n>=1024&&rString(l).padStart(2,"0"),r=[t.getUTCFullYear(),n(t.getUTCMonth()+1),n(t.getUTCDate()),n(t.getUTCHours()),n(t.getUTCMinutes())].join("");return`restore-${e}-${r}`.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,63).replace(/-+$/g,"")}function os(){const e=new Date,t=r=>String(r).padStart(2,"0");return`restore-${[e.getUTCFullYear(),t(e.getUTCMonth()+1),t(e.getUTCDate()),t(e.getUTCHours()),t(e.getUTCMinutes())].join("")}-`}function np(){const[e,t]=F.useState(null),[n,r]=F.useState(""),[l,o]=F.useState(null),[u,i]=F.useState(""),[s,c]=F.useState([]),[y,v]=F.useState(""),[m,k]=F.useState(ls),[S,x]=F.useState(""),[L,f]=F.useState({kind:"none"}),[a,d]=F.useState(""),[g,E]=F.useState(""),[N,P]=F.useState(""),[j,V]=F.useState(""),[O,he]=F.useState(os()),[lt,ot]=F.useState(""),[Nt,En]=F.useState(""),[Ht,Wt]=F.useState(""),[C,T]=F.useState(24),[R,A]=F.useState(!0),[G,Pt]=F.useState("No action yet."),[b,Z]=F.useState(!1),Oe=F.useMemo(()=>l?l.namespaces.map(h=>h.name):[],[l]),J=h=>{if(typeof h=="string"){Pt(h);return}Pt(JSON.stringify(h,null,2))},gc=async()=>{try{const h=await Ie("/v1/whoami");t(h),r("")}catch(h){t(null),r(h instanceof Error?h.message:"failed to load auth")}},jt=async()=>{try{const h=await Ie("/v1/inventory");o(h),i(""),!Nt&&h.namespaces.length>0&&En(h.namespaces[0].name)}catch(h){o(null),i(h instanceof Error?h.message:"failed to load inventory")}},zl=async()=>{try{const h=await Ie("/v1/policies");c(h.policies||[]),v("")}catch(h){c([]),v(h instanceof Error?h.message:"failed to load policies")}},Qt=async()=>{try{const h=await Ie("/v1/b2");k(h),x("")}catch(h){k(ls),x(h instanceof Error?h.message:"failed to load B2 usage")}},Qu=async()=>{Z(!0);try{await Promise.all([gc(),jt(),zl(),Qt()])}finally{Z(!1)}};F.useEffect(()=>{Qu()},[]);const wc=async(h,z)=>{Z(!0);try{const Me=await Ie("/v1/backup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:h,pvc:z,dry_run:!1})});J(Me),await Promise.all([jt(),Qt()])}catch(Me){J({error:Me instanceof Error?Me.message:"backup request failed",namespace:h,pvc:z})}finally{Z(!1)}},kc=async h=>{Z(!0);try{const z=await Ie("/v1/backup/namespace",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:h,dry_run:!1})});J(z),await Promise.all([jt(),Qt()])}catch(z){J({error:z instanceof Error?z.message:"namespace backup failed",namespace:h})}finally{Z(!1)}},Sc=async(h,z)=>{Z(!0);try{const Me=await Ie(`/v1/backups?namespace=${encodeURIComponent(h)}&pvc=${encodeURIComponent(z)}`),Tl=Me.backups.filter(Xu=>Xu.state==="Completed"&&Xu.url);f({kind:"pvc",namespace:h,pvc:z,volume:Me.volume,backups:Tl}),d(h),E(tp(z)),P(Tl.length>0?String(Tl[0].url):""),J(Me)}catch(Me){J({error:Me instanceof Error?Me.message:"failed to load backups",namespace:h,pvc:z})}finally{Z(!1)}},xc=h=>{f({kind:"namespace",namespace:h}),V(h),he(os()),ot(""),J(`Namespace restore planner loaded for ${h}.`)},Ku=async h=>{if(L.kind==="pvc"){Z(!0);try{const z=await Ie("/v1/restores",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:L.namespace,pvc:L.pvc,backup_url:N,target_namespace:a,target_pvc:g,dry_run:h})});J(z),await Promise.all([jt(),Qt()])}catch(z){J({error:z instanceof Error?z.message:"restore failed",namespace:L.namespace,pvc:L.pvc,target_namespace:a,target_pvc:g,dry_run:h})}finally{Z(!1)}}},Yu=async h=>{if(L.kind==="namespace"){Z(!0);try{const z=await Ie("/v1/restores/namespace",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:L.namespace,target_namespace:j,target_prefix:O,snapshot:lt,dry_run:h})});J(z),await Promise.all([jt(),Qt()])}catch(z){J({error:z instanceof Error?z.message:"namespace restore failed",namespace:L.namespace,target_namespace:j,target_prefix:O,dry_run:h})}finally{Z(!1)}}},Ec=async()=>{Z(!0);try{const h=await Ie("/v1/policies",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:Nt,pvc:Ht,interval_hours:C,enabled:R})});J(h),await Promise.all([zl(),jt()])}catch(h){J({error:h instanceof Error?h.message:"policy save failed"})}finally{Z(!1)}},Cc=async h=>{Z(!0);try{const z=await Ie(`/v1/policies/${encodeURIComponent(h)}`,{method:"DELETE"});J(z),await Promise.all([zl(),jt()])}catch(z){J({error:z instanceof Error?z.message:"policy delete failed",policy_id:h})}finally{Z(!1)}},_c=e?`${e.user||e.email||"authenticated"} (${(e.groups||[]).join(", ")||"no groups"})`:n||"anonymous";return p.jsxs("div",{className:"app-shell",children:[p.jsxs("header",{className:"topbar",children:[p.jsxs("div",{children:[p.jsx("h1",{children:"Soteria Backup Console"}),p.jsx("p",{className:"subtle",children:"Dark-mode React UI for backup drills, policy control, and B2 consumption visibility."})]}),p.jsxs("div",{className:"toolbar",children:[p.jsx("span",{className:`chip ${e?"good":"warn"}`,children:_c}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Qu(),disabled:b,children:b?"Refreshing...":"Refresh"})]})]}),p.jsxs("main",{className:"layout",children:[p.jsxs("section",{className:"panel scroll-panel",children:[p.jsxs("div",{className:"panel-header",children:[p.jsx("h2",{children:"PVC Inventory"}),p.jsx("span",{className:"subtle",children:l!=null&&l.generated_at?`Updated ${Rn(l.generated_at)}`:"No inventory yet"})]}),u&&p.jsx("p",{className:"error",children:u}),!l&&!u&&p.jsx("p",{className:"subtle",children:"Loading inventory..."}),l==null?void 0:l.namespaces.map(h=>p.jsxs("article",{className:"namespace-block",children:[p.jsxs("div",{className:"namespace-row",children:[p.jsx("h3",{children:h.name}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",className:"secondary",onClick:()=>void kc(h.name),disabled:b,children:"Backup namespace"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>xc(h.name),children:"Restore namespace"})]})]}),p.jsx("div",{className:"pvc-grid",children:h.pvcs.map(z=>p.jsxs("article",{className:"pvc-card",children:[p.jsxs("div",{className:"pvc-title-row",children:[p.jsxs("div",{children:[p.jsx("h4",{children:z.pvc}),p.jsxs("p",{className:"subtle tiny",children:[z.volume||"unknown volume"," | ",z.storage_class||"no class"," | ",z.capacity||"unknown size"]})]}),p.jsx("span",{className:`chip ${z.healthy?"good":"bad"}`,children:z.healthy?"Healthy":z.health_reason||"Needs attention"})]}),p.jsxs("p",{className:"subtle tiny",children:["Last backup: ",z.last_backup_at?`${Rn(z.last_backup_at)} (${(z.last_backup_age_hours||0).toFixed(1)}h ago)`:"never"]}),p.jsxs("p",{className:"subtle tiny",children:["Backups: ",z.completed_backups,"/",z.backup_count," completed | Latest size: ",Yt(z.last_backup_size_bytes)," | Total stored: ",Yt(z.total_backup_size_bytes)]}),z.error&&p.jsx("p",{className:"error tiny",children:z.error}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",onClick:()=>void wc(z.namespace,z.pvc),disabled:b,children:"Backup now"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Sc(z.namespace,z.pvc),children:"Restore"})]})]},`${z.namespace}/${z.pvc}`))})]},h.name))]}),p.jsxs("section",{className:"column",children:[p.jsxs("section",{className:"panel",children:[p.jsx("h2",{children:"Restore Planner"}),p.jsx("p",{className:"subtle tiny",children:"Inventory restore buttons preload this panel. This is where restore dry-runs and execution happen."}),L.kind==="none"&&p.jsx("p",{className:"subtle",children:"Choose Restore on a PVC or namespace to begin."}),L.kind==="pvc"&&p.jsxs("div",{className:"stack",children:[p.jsxs("p",{className:"subtle tiny",children:[p.jsx("strong",{children:"Source:"})," ",L.namespace,"/",L.pvc," (",L.volume,")"]}),p.jsxs("label",{children:["Backup snapshot",p.jsxs("select",{value:N,onChange:h=>P(h.target.value),children:[L.backups.length===0&&p.jsx("option",{value:"",children:"No completed backups"}),L.backups.map(h=>p.jsxs("option",{value:h.url||"",children:[h.name," | ",h.created||"unknown time"," | ",h.size||"size n/a"]},h.url||h.name))]})]}),p.jsxs("label",{children:["Target namespace",p.jsx("select",{value:a,onChange:h=>d(h.target.value),children:Oe.map(h=>p.jsx("option",{value:h,children:h},h))})]}),p.jsxs("label",{children:["Target PVC",p.jsx("input",{value:g,onChange:h=>E(h.target.value)})]}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",onClick:()=>void Ku(!1),disabled:b||!N,children:"Create restore PVC"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Ku(!0),disabled:b||!N,children:"Dry run"})]})]}),L.kind==="namespace"&&p.jsxs("div",{className:"stack",children:[p.jsxs("p",{className:"subtle tiny",children:[p.jsx("strong",{children:"Source namespace:"})," ",L.namespace]}),p.jsxs("label",{children:["Target namespace",p.jsx("select",{value:j,onChange:h=>V(h.target.value),children:Oe.map(h=>p.jsx("option",{value:h,children:h},h))})]}),p.jsxs("label",{children:["Target PVC prefix",p.jsx("input",{value:O,onChange:h=>he(h.target.value)})]}),p.jsxs("label",{children:["Snapshot hint (optional)",p.jsx("input",{value:lt,onChange:h=>ot(h.target.value),placeholder:"blank = latest completed"})]}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",onClick:()=>void Yu(!1),disabled:b,children:"Create restore PVCs"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Yu(!0),disabled:b,children:"Dry run"})]})]})]}),p.jsxs("section",{className:"panel action-panel",children:[p.jsx("h2",{children:"Last Action"}),p.jsx("pre",{children:G})]})]}),p.jsxs("section",{className:"column",children:[p.jsxs("section",{className:"panel",children:[p.jsxs("div",{className:"panel-header",children:[p.jsx("h2",{children:"B2 Consumption"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Qt(),disabled:b,children:"Refresh B2"})]}),S&&p.jsx("p",{className:"error",children:S}),!S&&!m.enabled&&p.jsx("p",{className:"subtle",children:"B2 monitoring is disabled in Soteria config."}),!S&&m.enabled&&!m.available&&p.jsx("p",{className:"error",children:m.error||"B2 usage currently unavailable."}),m.enabled&&p.jsxs("div",{className:"stack",children:[p.jsxs("p",{className:"subtle tiny",children:["Endpoint: ",m.endpoint||"n/a"," | Region: ",m.region||"n/a"]}),p.jsxs("p",{className:"subtle tiny",children:["Last scan: ",Rn(m.scanned_at)," | Duration: ",m.scan_duration_ms||0,"ms"]}),p.jsxs("div",{className:"stat-grid",children:[p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Stored bytes"}),p.jsx("strong",{children:Yt(m.total_bytes)})]}),p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Objects"}),p.jsx("strong",{children:m.total_objects})]}),p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Recent bytes (24h)"}),p.jsx("strong",{children:Yt(m.recent_bytes_24h)})]}),p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Recent objects (24h)"}),p.jsx("strong",{children:m.recent_objects_24h})]})]}),p.jsx("p",{className:"subtle tiny",children:"Recent 24h values are object-change bandwidth proxy from bucket scans. B2 egress billing totals are not exposed by S3 object listing."}),p.jsx("div",{className:"bucket-table-wrap",children:p.jsxs("table",{children:[p.jsx("thead",{children:p.jsxs("tr",{children:[p.jsx("th",{children:"Bucket"}),p.jsx("th",{children:"Objects"}),p.jsx("th",{children:"Stored"}),p.jsx("th",{children:"Recent 24h"})]})}),p.jsx("tbody",{children:(m.buckets||[]).map(h=>p.jsxs("tr",{children:[p.jsxs("td",{children:[p.jsx("div",{children:h.name}),p.jsxs("div",{className:"subtle tiny",children:["Last object: ",Rn(h.last_modified_at)]})]}),p.jsx("td",{children:h.object_count}),p.jsx("td",{children:Yt(h.total_bytes)}),p.jsx("td",{children:Yt(h.recent_bytes_24h)})]},h.name))})]})})]})]}),p.jsxs("section",{className:"panel scroll-panel",children:[p.jsx("h2",{children:"Backup Policies"}),p.jsxs("div",{className:"stack",children:[p.jsxs("label",{children:["Namespace",p.jsx("select",{value:Nt,onChange:h=>En(h.target.value),children:Oe.map(h=>p.jsx("option",{value:h,children:h},h))})]}),p.jsxs("label",{children:["PVC (optional)",p.jsx("input",{value:Ht,onChange:h=>Wt(h.target.value),placeholder:"blank means all PVCs in namespace"})]}),p.jsxs("label",{children:["Interval hours",p.jsx("input",{type:"number",min:1,value:C,onChange:h=>T(Math.max(1,Number(h.target.value||1)))})]}),p.jsxs("label",{className:"checkbox-row",children:[p.jsx("input",{type:"checkbox",checked:R,onChange:h=>A(h.target.checked)}),"Enabled"]}),p.jsx("button",{type:"button",onClick:()=>void Ec(),disabled:b||!Nt,children:"Save policy"})]}),y&&p.jsx("p",{className:"error",children:y}),!y&&s.length===0&&p.jsx("p",{className:"subtle",children:"No policies yet."}),p.jsx("div",{className:"policy-list",children:s.map(h=>p.jsxs("article",{className:"policy-item",children:[p.jsxs("div",{className:"policy-head",children:[p.jsxs("strong",{children:[h.namespace,"/",h.pvc||"*"]}),p.jsx("span",{className:`chip ${h.enabled?"good":"bad"}`,children:h.enabled?"Enabled":"Disabled"})]}),p.jsxs("p",{className:"subtle tiny",children:["Every ",h.interval_hours,"h | Updated ",Rn(h.updated_at||h.created_at)]}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",className:"secondary",onClick:()=>{En(h.namespace),Wt(h.pvc||""),T(h.interval_hours),A(h.enabled)},children:"Load"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Cc(h.id),disabled:b,children:"Delete"})]})]},h.id))})]})]})]})]})}ro.createRoot(document.getElementById("root")).render(p.jsx(Ac.StrictMode,{children:p.jsx(np,{})})); diff --git a/internal/server/ui-dist/assets/index-C9X7C4pD.js b/internal/server/ui-dist/assets/index-C9X7C4pD.js new file mode 100644 index 0000000..28cc949 --- /dev/null +++ b/internal/server/ui-dist/assets/index-C9X7C4pD.js @@ -0,0 +1,40 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();function Wc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ms={exports:{}},wl={},vs={exports:{}},O={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var hr=Symbol.for("react.element"),Qc=Symbol.for("react.portal"),Kc=Symbol.for("react.fragment"),Yc=Symbol.for("react.strict_mode"),Xc=Symbol.for("react.profiler"),Gc=Symbol.for("react.provider"),Zc=Symbol.for("react.context"),Jc=Symbol.for("react.forward_ref"),qc=Symbol.for("react.suspense"),bc=Symbol.for("react.memo"),ef=Symbol.for("react.lazy"),lu=Symbol.iterator;function tf(e){return e===null||typeof e!="object"?null:(e=lu&&e[lu]||e["@@iterator"],typeof e=="function"?e:null)}var ys={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},gs=Object.assign,ws={};function Cn(e,t,n){this.props=e,this.context=t,this.refs=ws,this.updater=n||ys}Cn.prototype.isReactComponent={};Cn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Cn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function ks(){}ks.prototype=Cn.prototype;function oi(e,t,n){this.props=e,this.context=t,this.refs=ws,this.updater=n||ys}var ii=oi.prototype=new ks;ii.constructor=oi;gs(ii,Cn.prototype);ii.isPureReactComponent=!0;var ou=Array.isArray,Ss=Object.prototype.hasOwnProperty,ui={current:null},xs={key:!0,ref:!0,__self:!0,__source:!0};function _s(e,t,n){var r,l={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)Ss.call(t,r)&&!xs.hasOwnProperty(r)&&(l[r]=t[r]);var u=arguments.length-2;if(u===1)l.children=n;else if(1>>1,X=C[A];if(0>>1;Al(Yt,L))Hel(Rt,Yt)?(C[A]=Rt,C[He]=L,A=He):(C[A]=Yt,C[Ae]=L,A=Ae);else if(Hel(Rt,L))C[A]=Rt,C[He]=L,A=He;else break e}}return T}function l(C,T){var L=C.sortIndex-T.sortIndex;return L!==0?L:C.id-T.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,u=i.now();e.unstable_now=function(){return i.now()-u}}var s=[],c=[],y=1,v=null,h=3,k=!1,x=!1,_=!1,F=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,a=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(C){for(var T=n(c);T!==null;){if(T.callback===null)r(c);else if(T.startTime<=C)r(c),T.sortIndex=T.expirationTime,t(s,T);else break;T=n(c)}}function g(C){if(_=!1,d(C),!x)if(n(s)!==null)x=!0,Je(E);else{var T=n(c);T!==null&&at(g,T.startTime-C)}}function E(C,T){x=!1,_&&(_=!1,f(z),z=-1),k=!0;var L=h;try{for(d(T),v=n(s);v!==null&&(!(v.expirationTime>T)||C&&!me());){var A=v.callback;if(typeof A=="function"){v.callback=null,h=v.priorityLevel;var X=A(v.expirationTime<=T);T=e.unstable_now(),typeof X=="function"?v.callback=X:v===n(s)&&r(s),d(T)}else r(s);v=n(s)}if(v!==null)var Lt=!0;else{var Ae=n(c);Ae!==null&&at(g,Ae.startTime-T),Lt=!1}return Lt}finally{v=null,h=L,k=!1}}var j=!1,P=null,z=-1,V=5,R=-1;function me(){return!(e.unstable_now()-RC||125A?(C.sortIndex=L,t(c,C),n(s)===null&&C===n(c)&&(_?(f(z),z=-1):_=!0,at(g,L-A))):(C.sortIndex=X,t(s,C),x||k||(x=!0,Je(E))),C},e.unstable_shouldYield=me,e.unstable_wrapCallback=function(C){var T=h;return function(){var L=h;h=T;try{return C.apply(this,arguments)}finally{h=L}}}})(Ps);js.exports=Ps;var hf=js.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var mf=M,Ee=hf;function w(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),po=Object.prototype.hasOwnProperty,vf=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,uu={},su={};function yf(e){return po.call(su,e)?!0:po.call(uu,e)?!1:vf.test(e)?su[e]=!0:(uu[e]=!0,!1)}function gf(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function wf(e,t,n,r){if(t===null||typeof t>"u"||gf(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function he(e,t,n,r,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var le={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){le[e]=new he(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];le[t]=new he(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){le[e]=new he(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){le[e]=new he(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){le[e]=new he(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){le[e]=new he(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){le[e]=new he(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){le[e]=new he(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){le[e]=new he(e,5,!1,e.toLowerCase(),null,!1,!1)});var ai=/[\-:]([a-z])/g;function ci(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ai,ci);le[t]=new he(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ai,ci);le[t]=new he(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ai,ci);le[t]=new he(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){le[e]=new he(e,1,!1,e.toLowerCase(),null,!1,!1)});le.xlinkHref=new he("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){le[e]=new he(e,1,!1,e.toLowerCase(),null,!0,!0)});function fi(e,t,n,r){var l=le.hasOwnProperty(t)?le[t]:null;(l!==null?l.type!==0:r||!(2u||l[i]!==o[u]){var s=` +`+l[i].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=i&&0<=u);break}}}finally{Vl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Un(e):""}function kf(e){switch(e.tag){case 5:return Un(e.type);case 16:return Un("Lazy");case 13:return Un("Suspense");case 19:return Un("SuspenseList");case 0:case 2:case 15:return e=Al(e.type,!1),e;case 11:return e=Al(e.type.render,!1),e;case 1:return e=Al(e.type,!0),e;default:return""}}function yo(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case en:return"Fragment";case bt:return"Portal";case ho:return"Profiler";case di:return"StrictMode";case mo:return"Suspense";case vo:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Ls:return(e.displayName||"Context")+".Consumer";case Ts:return(e._context.displayName||"Context")+".Provider";case pi:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case hi:return t=e.displayName||null,t!==null?t:yo(e.type)||"Memo";case dt:t=e._payload,e=e._init;try{return yo(e(t))}catch{}}return null}function Sf(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return yo(t);case 8:return t===di?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Nt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Os(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function xf(e){var t=Os(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function xr(e){e._valueTracker||(e._valueTracker=xf(e))}function Ms(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Os(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Gr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function go(e,t){var n=t.checked;return K({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function cu(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Nt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ds(e,t){t=t.checked,t!=null&&fi(e,"checked",t,!1)}function wo(e,t){Ds(e,t);var n=Nt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ko(e,t.type,n):t.hasOwnProperty("defaultValue")&&ko(e,t.type,Nt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function fu(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function ko(e,t,n){(t!=="number"||Gr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Bn=Array.isArray;function dn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=_r.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function qn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var An={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},_f=["Webkit","ms","Moz","O"];Object.keys(An).forEach(function(e){_f.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),An[t]=An[e]})});function Bs(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||An.hasOwnProperty(e)&&An[e]?(""+t).trim():t+"px"}function $s(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Bs(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Ef=K({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function _o(e,t){if(t){if(Ef[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(w(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(w(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(w(61))}if(t.style!=null&&typeof t.style!="object")throw Error(w(62))}}function Eo(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Co=null;function mi(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var No=null,pn=null,hn=null;function hu(e){if(e=yr(e)){if(typeof No!="function")throw Error(w(280));var t=e.stateNode;t&&(t=El(t),No(e.stateNode,e.type,t))}}function Vs(e){pn?hn?hn.push(e):hn=[e]:pn=e}function As(){if(pn){var e=pn,t=hn;if(hn=pn=null,hu(e),t)for(e=0;e>>=0,e===0?32:31-(Df(e)/If|0)|0}var Er=64,Cr=4194304;function $n(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function br(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var u=i&~l;u!==0?r=$n(u):(o&=i,o!==0&&(r=$n(o)))}else i=n&~l,i!==0?r=$n(i):o!==0&&(r=$n(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function mr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Be(t),e[t]=n}function $f(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Wn),_u=" ",Eu=!1;function sa(e,t){switch(e){case"keyup":return hd.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function aa(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var tn=!1;function vd(e,t){switch(e){case"compositionend":return aa(t);case"keypress":return t.which!==32?null:(Eu=!0,_u);case"textInput":return e=t.data,e===_u&&Eu?null:e;default:return null}}function yd(e,t){if(tn)return e==="compositionend"||!_i&&sa(e,t)?(e=ia(),$r=ki=vt=null,tn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Pu(n)}}function pa(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?pa(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ha(){for(var e=window,t=Gr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Gr(e.document)}return t}function Ei(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Nd(e){var t=ha(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&pa(n.ownerDocument.documentElement,n)){if(r!==null&&Ei(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=zu(n,o);var i=zu(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,nn=null,Ro=null,Kn=null,Oo=!1;function Tu(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Oo||nn==null||nn!==Gr(r)||(r=nn,"selectionStart"in r&&Ei(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Kn&&lr(Kn,r)||(Kn=r,r=nl(Ro,"onSelect"),0on||(e.current=Bo[on],Bo[on]=null,on--)}function U(e,t){on++,Bo[on]=e.current,e.current=t}var jt={},ae=zt(jt),ge=zt(!1),$t=jt;function wn(e,t){var n=e.type.contextTypes;if(!n)return jt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function we(e){return e=e.childContextTypes,e!=null}function ll(){$(ge),$(ae)}function Fu(e,t,n){if(ae.current!==jt)throw Error(w(168));U(ae,t),U(ge,n)}function _a(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(w(108,Sf(e)||"Unknown",l));return K({},n,r)}function ol(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||jt,$t=ae.current,U(ae,e),U(ge,ge.current),!0}function Uu(e,t,n){var r=e.stateNode;if(!r)throw Error(w(169));n?(e=_a(e,t,$t),r.__reactInternalMemoizedMergedChildContext=e,$(ge),$(ae),U(ae,e)):$(ge),U(ge,n)}var be=null,Cl=!1,no=!1;function Ea(e){be===null?be=[e]:be.push(e)}function Ud(e){Cl=!0,Ea(e)}function Tt(){if(!no&&be!==null){no=!0;var e=0,t=I;try{var n=be;for(I=1;e>=i,l-=i,et=1<<32-Be(t)+l|n<z?(V=P,P=null):V=P.sibling;var R=h(f,P,d[z],g);if(R===null){P===null&&(P=V);break}e&&P&&R.alternate===null&&t(f,P),a=o(R,a,z),j===null?E=R:j.sibling=R,j=R,P=V}if(z===d.length)return n(f,P),H&&Ot(f,z),E;if(P===null){for(;zz?(V=P,P=null):V=P.sibling;var me=h(f,P,R.value,g);if(me===null){P===null&&(P=V);break}e&&P&&me.alternate===null&&t(f,P),a=o(me,a,z),j===null?E=me:j.sibling=me,j=me,P=V}if(R.done)return n(f,P),H&&Ot(f,z),E;if(P===null){for(;!R.done;z++,R=d.next())R=v(f,R.value,g),R!==null&&(a=o(R,a,z),j===null?E=R:j.sibling=R,j=R);return H&&Ot(f,z),E}for(P=r(f,P);!R.done;z++,R=d.next())R=k(P,f,z,R.value,g),R!==null&&(e&&R.alternate!==null&&P.delete(R.key===null?z:R.key),a=o(R,a,z),j===null?E=R:j.sibling=R,j=R);return e&&P.forEach(function(Ze){return t(f,Ze)}),H&&Ot(f,z),E}function F(f,a,d,g){if(typeof d=="object"&&d!==null&&d.type===en&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case Sr:e:{for(var E=d.key,j=a;j!==null;){if(j.key===E){if(E=d.type,E===en){if(j.tag===7){n(f,j.sibling),a=l(j,d.props.children),a.return=f,f=a;break e}}else if(j.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===dt&&Vu(E)===j.type){n(f,j.sibling),a=l(j,d.props),a.ref=Dn(f,j,d),a.return=f,f=a;break e}n(f,j);break}else t(f,j);j=j.sibling}d.type===en?(a=Bt(d.props.children,f.mode,g,d.key),a.return=f,f=a):(g=Xr(d.type,d.key,d.props,null,f.mode,g),g.ref=Dn(f,a,d),g.return=f,f=g)}return i(f);case bt:e:{for(j=d.key;a!==null;){if(a.key===j)if(a.tag===4&&a.stateNode.containerInfo===d.containerInfo&&a.stateNode.implementation===d.implementation){n(f,a.sibling),a=l(a,d.children||[]),a.return=f,f=a;break e}else{n(f,a);break}else t(f,a);a=a.sibling}a=co(d,f.mode,g),a.return=f,f=a}return i(f);case dt:return j=d._init,F(f,a,j(d._payload),g)}if(Bn(d))return x(f,a,d,g);if(Tn(d))return _(f,a,d,g);Rr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,a!==null&&a.tag===6?(n(f,a.sibling),a=l(a,d),a.return=f,f=a):(n(f,a),a=ao(d,f.mode,g),a.return=f,f=a),i(f)):n(f,a)}return F}var Sn=Pa(!0),za=Pa(!1),sl=zt(null),al=null,an=null,Pi=null;function zi(){Pi=an=al=null}function Ti(e){var t=sl.current;$(sl),e._currentValue=t}function Ao(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function vn(e,t){al=e,Pi=an=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ye=!0),e.firstContext=null)}function Re(e){var t=e._currentValue;if(Pi!==e)if(e={context:e,memoizedValue:t,next:null},an===null){if(al===null)throw Error(w(308));an=e,al.dependencies={lanes:0,firstContext:e}}else an=an.next=e;return t}var It=null;function Li(e){It===null?It=[e]:It.push(e)}function Ta(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Li(t)):(n.next=l.next,l.next=n),t.interleaved=n,ot(e,r)}function ot(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var pt=!1;function Ri(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function La(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function nt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function xt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,D&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,ot(e,n)}return l=r.interleaved,l===null?(t.next=t,Li(r)):(t.next=l.next,l.next=t),r.interleaved=t,ot(e,n)}function Ar(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,yi(e,n)}}function Au(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};o===null?l=o=i:o=o.next=i,n=n.next}while(n!==null);o===null?l=o=t:o=o.next=t}else l=o=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:o,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function cl(e,t,n,r){var l=e.updateQueue;pt=!1;var o=l.firstBaseUpdate,i=l.lastBaseUpdate,u=l.shared.pending;if(u!==null){l.shared.pending=null;var s=u,c=s.next;s.next=null,i===null?o=c:i.next=c,i=s;var y=e.alternate;y!==null&&(y=y.updateQueue,u=y.lastBaseUpdate,u!==i&&(u===null?y.firstBaseUpdate=c:u.next=c,y.lastBaseUpdate=s))}if(o!==null){var v=l.baseState;i=0,y=c=s=null,u=o;do{var h=u.lane,k=u.eventTime;if((r&h)===h){y!==null&&(y=y.next={eventTime:k,lane:0,tag:u.tag,payload:u.payload,callback:u.callback,next:null});e:{var x=e,_=u;switch(h=t,k=n,_.tag){case 1:if(x=_.payload,typeof x=="function"){v=x.call(k,v,h);break e}v=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=_.payload,h=typeof x=="function"?x.call(k,v,h):x,h==null)break e;v=K({},v,h);break e;case 2:pt=!0}}u.callback!==null&&u.lane!==0&&(e.flags|=64,h=l.effects,h===null?l.effects=[u]:h.push(u))}else k={eventTime:k,lane:h,tag:u.tag,payload:u.payload,callback:u.callback,next:null},y===null?(c=y=k,s=v):y=y.next=k,i|=h;if(u=u.next,u===null){if(u=l.shared.pending,u===null)break;h=u,u=h.next,h.next=null,l.lastBaseUpdate=h,l.shared.pending=null}}while(!0);if(y===null&&(s=v),l.baseState=s,l.firstBaseUpdate=c,l.lastBaseUpdate=y,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else o===null&&(l.shared.lanes=0);Ht|=i,e.lanes=i,e.memoizedState=v}}function Hu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=lo.transition;lo.transition={};try{e(!1),t()}finally{I=n,lo.transition=r}}function Xa(){return Oe().memoizedState}function Ad(e,t,n){var r=Et(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ga(e))Za(t,n);else if(n=Ta(e,t,n,r),n!==null){var l=de();$e(n,e,r,l),Ja(n,t,r)}}function Hd(e,t,n){var r=Et(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ga(e))Za(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,u=o(i,n);if(l.hasEagerState=!0,l.eagerState=u,Ve(u,i)){var s=t.interleaved;s===null?(l.next=l,Li(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=Ta(e,t,l,r),n!==null&&(l=de(),$e(n,e,r,l),Ja(n,t,r))}}function Ga(e){var t=e.alternate;return e===Q||t!==null&&t===Q}function Za(e,t){Yn=dl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ja(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,yi(e,n)}}var pl={readContext:Re,useCallback:ie,useContext:ie,useEffect:ie,useImperativeHandle:ie,useInsertionEffect:ie,useLayoutEffect:ie,useMemo:ie,useReducer:ie,useRef:ie,useState:ie,useDebugValue:ie,useDeferredValue:ie,useTransition:ie,useMutableSource:ie,useSyncExternalStore:ie,useId:ie,unstable_isNewReconciler:!1},Wd={readContext:Re,useCallback:function(e,t){return Ke().memoizedState=[e,t===void 0?null:t],e},useContext:Re,useEffect:Qu,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Wr(4194308,4,Ha.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Wr(4194308,4,e,t)},useInsertionEffect:function(e,t){return Wr(4,2,e,t)},useMemo:function(e,t){var n=Ke();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ke();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Ad.bind(null,Q,e),[r.memoizedState,e]},useRef:function(e){var t=Ke();return e={current:e},t.memoizedState=e},useState:Wu,useDebugValue:$i,useDeferredValue:function(e){return Ke().memoizedState=e},useTransition:function(){var e=Wu(!1),t=e[0];return e=Vd.bind(null,e[1]),Ke().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Q,l=Ke();if(H){if(n===void 0)throw Error(w(407));n=n()}else{if(n=t(),te===null)throw Error(w(349));At&30||Da(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,Qu(Fa.bind(null,r,o,e),[e]),r.flags|=2048,dr(9,Ia.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Ke(),t=te.identifierPrefix;if(H){var n=tt,r=et;n=(r&~(1<<32-Be(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=cr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Ye]=t,e[ur]=r,uc(e,t,!1,!1),t.stateNode=e;e:{switch(i=Eo(n,r),n){case"dialog":B("cancel",e),B("close",e),l=r;break;case"iframe":case"object":case"embed":B("load",e),l=r;break;case"video":case"audio":for(l=0;lEn&&(t.flags|=128,r=!0,In(o,!1),t.lanes=4194304)}else{if(!r)if(e=fl(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),In(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!H)return ue(t),null}else 2*G()-o.renderingStartTime>En&&n!==1073741824&&(t.flags|=128,r=!0,In(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=G(),t.sibling=null,n=W.current,U(W,r?n&1|2:n&1),t):(ue(t),null);case 22:case 23:return Ki(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Se&1073741824&&(ue(t),t.subtreeFlags&6&&(t.flags|=8192)):ue(t),null;case 24:return null;case 25:return null}throw Error(w(156,t.tag))}function qd(e,t){switch(Ni(t),t.tag){case 1:return we(t.type)&&ll(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xn(),$(ge),$(ae),Di(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Mi(t),null;case 13:if($(W),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(w(340));kn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return $(W),null;case 4:return xn(),null;case 10:return Ti(t.type._context),null;case 22:case 23:return Ki(),null;case 24:return null;default:return null}}var Mr=!1,se=!1,bd=typeof WeakSet=="function"?WeakSet:Set,N=null;function cn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Y(e,t,r)}else n.current=null}function Jo(e,t,n){try{n()}catch(r){Y(e,t,r)}}var ns=!1;function ep(e,t){if(Mo=el,e=ha(),Ei(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,u=-1,s=-1,c=0,y=0,v=e,h=null;t:for(;;){for(var k;v!==n||l!==0&&v.nodeType!==3||(u=i+l),v!==o||r!==0&&v.nodeType!==3||(s=i+r),v.nodeType===3&&(i+=v.nodeValue.length),(k=v.firstChild)!==null;)h=v,v=k;for(;;){if(v===e)break t;if(h===n&&++c===l&&(u=i),h===o&&++y===r&&(s=i),(k=v.nextSibling)!==null)break;v=h,h=v.parentNode}v=k}n=u===-1||s===-1?null:{start:u,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(Do={focusedElem:e,selectionRange:n},el=!1,N=t;N!==null;)if(t=N,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,N=e;else for(;N!==null;){t=N;try{var x=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var _=x.memoizedProps,F=x.memoizedState,f=t.stateNode,a=f.getSnapshotBeforeUpdate(t.elementType===t.type?_:Ie(t.type,_),F);f.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(w(163))}}catch(g){Y(t,t.return,g)}if(e=t.sibling,e!==null){e.return=t.return,N=e;break}N=t.return}return x=ns,ns=!1,x}function Xn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&Jo(t,n,o)}l=l.next}while(l!==r)}}function Pl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function qo(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function cc(e){var t=e.alternate;t!==null&&(e.alternate=null,cc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ye],delete t[ur],delete t[Uo],delete t[Id],delete t[Fd])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function fc(e){return e.tag===5||e.tag===3||e.tag===4}function rs(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||fc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function bo(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=rl));else if(r!==4&&(e=e.child,e!==null))for(bo(e,t,n),e=e.sibling;e!==null;)bo(e,t,n),e=e.sibling}function ei(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ei(e,t,n),e=e.sibling;e!==null;)ei(e,t,n),e=e.sibling}var ne=null,Fe=!1;function ft(e,t,n){for(n=n.child;n!==null;)dc(e,t,n),n=n.sibling}function dc(e,t,n){if(Xe&&typeof Xe.onCommitFiberUnmount=="function")try{Xe.onCommitFiberUnmount(kl,n)}catch{}switch(n.tag){case 5:se||cn(n,t);case 6:var r=ne,l=Fe;ne=null,ft(e,t,n),ne=r,Fe=l,ne!==null&&(Fe?(e=ne,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):ne.removeChild(n.stateNode));break;case 18:ne!==null&&(Fe?(e=ne,n=n.stateNode,e.nodeType===8?to(e.parentNode,n):e.nodeType===1&&to(e,n),nr(e)):to(ne,n.stateNode));break;case 4:r=ne,l=Fe,ne=n.stateNode.containerInfo,Fe=!0,ft(e,t,n),ne=r,Fe=l;break;case 0:case 11:case 14:case 15:if(!se&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&Jo(n,t,i),l=l.next}while(l!==r)}ft(e,t,n);break;case 1:if(!se&&(cn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(u){Y(n,t,u)}ft(e,t,n);break;case 21:ft(e,t,n);break;case 22:n.mode&1?(se=(r=se)||n.memoizedState!==null,ft(e,t,n),se=r):ft(e,t,n);break;default:ft(e,t,n)}}function ls(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new bd),t.forEach(function(r){var l=ap.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Me(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~o}if(r=l,r=G()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*np(r/1960))-r,10e?16:e,yt===null)var r=!1;else{if(e=yt,yt=null,vl=0,D&6)throw Error(w(331));var l=D;for(D|=4,N=e.current;N!==null;){var o=N,i=o.child;if(N.flags&16){var u=o.deletions;if(u!==null){for(var s=0;sG()-Wi?Ut(e,0):Hi|=n),ke(e,t)}function kc(e,t){t===0&&(e.mode&1?(t=Cr,Cr<<=1,!(Cr&130023424)&&(Cr=4194304)):t=1);var n=de();e=ot(e,t),e!==null&&(mr(e,t,n),ke(e,n))}function sp(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),kc(e,n)}function ap(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(w(314))}r!==null&&r.delete(t),kc(e,n)}var Sc;Sc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ge.current)ye=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ye=!1,Zd(e,t,n);ye=!!(e.flags&131072)}else ye=!1,H&&t.flags&1048576&&Ca(t,ul,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Qr(e,t),e=t.pendingProps;var l=wn(t,ae.current);vn(t,n),l=Fi(null,t,r,e,l,n);var o=Ui();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,we(r)?(o=!0,ol(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Ri(t),l.updater=jl,t.stateNode=l,l._reactInternals=t,Wo(t,r,e,n),t=Yo(null,t,r,!0,o,n)):(t.tag=0,H&&o&&Ci(t),fe(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Qr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=fp(r),e=Ie(r,e),l){case 0:t=Ko(null,t,r,e,n);break e;case 1:t=bu(null,t,r,e,n);break e;case 11:t=Ju(null,t,r,e,n);break e;case 14:t=qu(null,t,r,Ie(r.type,e),n);break e}throw Error(w(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ie(r,l),Ko(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ie(r,l),bu(e,t,r,l,n);case 3:e:{if(lc(t),e===null)throw Error(w(387));r=t.pendingProps,o=t.memoizedState,l=o.element,La(e,t),cl(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=_n(Error(w(423)),t),t=es(e,t,r,n,l);break e}else if(r!==l){l=_n(Error(w(424)),t),t=es(e,t,r,n,l);break e}else for(xe=St(t.stateNode.containerInfo.firstChild),_e=t,H=!0,Ue=null,n=za(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(kn(),r===l){t=it(e,t,n);break e}fe(e,t,r,n)}t=t.child}return t;case 5:return Ra(t),e===null&&Vo(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,Io(r,l)?i=null:o!==null&&Io(r,o)&&(t.flags|=32),rc(e,t),fe(e,t,i,n),t.child;case 6:return e===null&&Vo(t),null;case 13:return oc(e,t,n);case 4:return Oi(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Sn(t,null,r,n):fe(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ie(r,l),Ju(e,t,r,l,n);case 7:return fe(e,t,t.pendingProps,n),t.child;case 8:return fe(e,t,t.pendingProps.children,n),t.child;case 12:return fe(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,U(sl,r._currentValue),r._currentValue=i,o!==null)if(Ve(o.value,i)){if(o.children===l.children&&!ge.current){t=it(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var u=o.dependencies;if(u!==null){i=o.child;for(var s=u.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=nt(-1,n&-n),s.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var y=c.pending;y===null?s.next=s:(s.next=y.next,y.next=s),c.pending=s}}o.lanes|=n,s=o.alternate,s!==null&&(s.lanes|=n),Ao(o.return,n,t),u.lanes|=n;break}s=s.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(w(341));i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),Ao(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}fe(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,vn(t,n),l=Re(l),r=r(l),t.flags|=1,fe(e,t,r,n),t.child;case 14:return r=t.type,l=Ie(r,t.pendingProps),l=Ie(r.type,l),qu(e,t,r,l,n);case 15:return tc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ie(r,l),Qr(e,t),t.tag=1,we(r)?(e=!0,ol(t)):e=!1,vn(t,n),qa(t,r,l),Wo(t,r,l,n),Yo(null,t,r,!0,e,n);case 19:return ic(e,t,n);case 22:return nc(e,t,n)}throw Error(w(156,t.tag))};function xc(e,t){return Gs(e,t)}function cp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Te(e,t,n,r){return new cp(e,t,n,r)}function Xi(e){return e=e.prototype,!(!e||!e.isReactComponent)}function fp(e){if(typeof e=="function")return Xi(e)?1:0;if(e!=null){if(e=e.$$typeof,e===pi)return 11;if(e===hi)return 14}return 2}function Ct(e,t){var n=e.alternate;return n===null?(n=Te(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Xr(e,t,n,r,l,o){var i=2;if(r=e,typeof e=="function")Xi(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case en:return Bt(n.children,l,o,t);case di:i=8,l|=8;break;case ho:return e=Te(12,n,t,l|2),e.elementType=ho,e.lanes=o,e;case mo:return e=Te(13,n,t,l),e.elementType=mo,e.lanes=o,e;case vo:return e=Te(19,n,t,l),e.elementType=vo,e.lanes=o,e;case Rs:return Tl(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ts:i=10;break e;case Ls:i=9;break e;case pi:i=11;break e;case hi:i=14;break e;case dt:i=16,r=null;break e}throw Error(w(130,e==null?e:typeof e,""))}return t=Te(i,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function Bt(e,t,n,r){return e=Te(7,e,r,t),e.lanes=n,e}function Tl(e,t,n,r){return e=Te(22,e,r,t),e.elementType=Rs,e.lanes=n,e.stateNode={isHidden:!1},e}function ao(e,t,n){return e=Te(6,e,null,t),e.lanes=n,e}function co(e,t,n){return t=Te(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function dp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Wl(0),this.expirationTimes=Wl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Wl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Gi(e,t,n,r,l,o,i,u,s){return e=new dp(e,t,n,u,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Te(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ri(o),e}function pp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Nc)}catch(e){console.error(e)}}Nc(),Ns.exports=Ce;var gp=Ns.exports,ds=gp;fo.createRoot=ds.createRoot,fo.hydrateRoot=ds.hydrateRoot;const ps={enabled:!1,available:!1,total_objects:0,total_bytes:0,recent_objects_24h:0,recent_bytes_24h:0,buckets:[]};function wp(e){const t=e.trim().slice(0,512).toLowerCase();return t.startsWith("\s*([^<]+)\s*<\/title>/i);return((n=t==null?void 0:t[1])==null?void 0:n.trim())||""}function Sp(e){var n;const t=e.match(/Request ID:\s*([0-9a-f-]+)/i);return((n=t==null?void 0:t[1])==null?void 0:n.trim())||""}function xp(e){return new Promise(t=>{window.setTimeout(t,e)})}async function De(e,t){const n=await fetch(e,t),r=await n.text();let l={};if(r.trim()!=="")try{l=JSON.parse(r)}catch{l={error:r}}if(!n.ok){let o=typeof l=="object"&&l!==null&&"error"in l?String(l.error):`${n.status} ${n.statusText}`;if(wp(r)){const i=kp(r),u=Sp(r);o=`upstream gateway error (${n.status}${i?` ${i}`:""})`,u&&(o=`${o}; request id ${u}`)}throw new Error(o)}return l}function Jt(e){if(e==null||Number.isNaN(e))return"n/a";if(e<=0)return"0 B";const t=["B","KiB","MiB","GiB","TiB"];let n=e,r=0;for(;n>=1024&&rString(l).padStart(2,"0"),r=[t.getUTCFullYear(),n(t.getUTCMonth()+1),n(t.getUTCDate()),n(t.getUTCHours()),n(t.getUTCMinutes())].join("");return`restore-${e}-${r}`.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,63).replace(/-+$/g,"")}function hs(){const e=new Date,t=r=>String(r).padStart(2,"0");return`restore-${[e.getUTCFullYear(),t(e.getUTCMonth()+1),t(e.getUTCDate()),t(e.getUTCHours()),t(e.getUTCMinutes())].join("")}-`}function Np(){const[e,t]=M.useState(null),[n,r]=M.useState(""),[l,o]=M.useState(null),[i,u]=M.useState(""),[s,c]=M.useState([]),[y,v]=M.useState(""),[h,k]=M.useState(ps),[x,_]=M.useState(""),[F,f]=M.useState(!1),[a,d]=M.useState({kind:"none"}),[g,E]=M.useState(""),[j,P]=M.useState(""),[z,V]=M.useState(""),[R,me]=M.useState(""),[Ze,st]=M.useState(hs()),[Pn,wr]=M.useState(""),[Je,at]=M.useState(""),[C,T]=M.useState(""),[L,A]=M.useState(24),[X,Lt]=M.useState(!0),[Ae,Yt]=M.useState(!0),[He,Rt]=M.useState(0),[Dl,jc]=M.useState(!0),[Il,Pc]=M.useState(0),[zc,bi]=M.useState("No action yet."),[We,oe]=M.useState(!1),zn=M.useMemo(()=>{if(!l)return 0;let m=0;for(const S of l.namespaces)for(const Z of S.pvcs)m+=Z.active_backups||0;return m},[l]),Fl=M.useMemo(()=>l?l.namespaces.map(m=>m.name):[],[l]),ce=m=>{if(typeof m=="string"){bi(m);return}bi(JSON.stringify(m,null,2))},Tc=async()=>{try{const m=await De("/v1/whoami");t(m),r("")}catch(m){t(null),r(m instanceof Error?m.message:"failed to load auth")}},ct=async()=>{const m=async()=>De("/v1/inventory");try{const S=await m();o(S),u(""),!Je&&S.namespaces.length>0&&at(S.namespaces[0].name)}catch(S){let Z=S instanceof Error?S.message:"failed to load inventory";if(Z.includes("upstream gateway error"))try{await xp(1e3);const je=await m();o(je),u(""),!Je&&je.namespaces.length>0&&at(je.namespaces[0].name);return}catch(je){Z=je instanceof Error?je.message:Z}u(Z)}},Ul=async()=>{try{const m=await De("/v1/policies");c(m.policies||[]),v("")}catch(m){c([]),v(m instanceof Error?m.message:"failed to load policies")}},Xt=async(m=!1)=>{try{const S=await De(m?"/v1/b2?refresh=1":"/v1/b2");k(S),_("")}catch(S){k(ps),_(S instanceof Error?S.message:"failed to load B2 usage")}},Lc=async()=>{f(!0);try{await Xt(!0)}finally{f(!1)}},eu=async()=>{oe(!0);try{await Promise.all([Tc(),ct(),Ul(),Xt()])}finally{oe(!1)}};M.useEffect(()=>{eu()},[]),M.useEffect(()=>{if(zn<=0)return;const m=window.setInterval(()=>{ct()},8e3);return()=>{window.clearInterval(m)}},[zn]);const Rc=async(m,S)=>{oe(!0);try{const Z=await De("/v1/backup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:m,pvc:S,dry_run:!1,dedupe:Dl,keep_last:Il})});ce(Z),await Promise.all([ct(),Xt()])}catch(Z){ce({error:Z instanceof Error?Z.message:"backup request failed",namespace:m,pvc:S})}finally{oe(!1)}},Oc=async m=>{oe(!0);try{const S=await De("/v1/backup/namespace",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:m,dry_run:!1,dedupe:Dl,keep_last:Il})});ce(S),await Promise.all([ct(),Xt()])}catch(S){ce({error:S instanceof Error?S.message:"namespace backup failed",namespace:m})}finally{oe(!1)}},Mc=async(m,S)=>{oe(!0);try{const Z=await De(`/v1/backups?namespace=${encodeURIComponent(m)}&pvc=${encodeURIComponent(S)}`),je=Z.backups.filter(Gt=>Gt.state==="Completed"&&Gt.url);d({kind:"pvc",namespace:m,pvc:S,volume:Z.volume,backups:je}),E(m),P(Cp(S)),V(je.length>0?String(je[0].url):""),ce(Z)}catch(Z){ce({error:Z instanceof Error?Z.message:"failed to load backups",namespace:m,pvc:S})}finally{oe(!1)}},Dc=m=>{d({kind:"namespace",namespace:m}),me(m),st(hs()),wr(""),ce(`Namespace restore planner loaded for ${m}.`)},tu=async m=>{if(a.kind==="pvc"){oe(!0);try{const S=await De("/v1/restores",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:a.namespace,pvc:a.pvc,backup_url:z,target_namespace:g,target_pvc:j,dry_run:m})});ce(S),await Promise.all([ct(),Xt()])}catch(S){ce({error:S instanceof Error?S.message:"restore failed",namespace:a.namespace,pvc:a.pvc,target_namespace:g,target_pvc:j,dry_run:m})}finally{oe(!1)}}},nu=async m=>{if(a.kind==="namespace"){oe(!0);try{const S=await De("/v1/restores/namespace",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:a.namespace,target_namespace:R,target_prefix:Ze,snapshot:Pn,dry_run:m})});ce(S),await Promise.all([ct(),Xt()])}catch(S){ce({error:S instanceof Error?S.message:"namespace restore failed",namespace:a.namespace,target_namespace:R,target_prefix:Ze,dry_run:m})}finally{oe(!1)}}},Ic=async()=>{oe(!0);try{const m=await De("/v1/policies",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({namespace:Je,pvc:C,interval_hours:L,enabled:X,dedupe:Ae,keep_last:He})});ce(m),await Promise.all([Ul(),ct()])}catch(m){ce({error:m instanceof Error?m.message:"policy save failed"})}finally{oe(!1)}},Fc=async m=>{oe(!0);try{const S=await De(`/v1/policies/${encodeURIComponent(m)}`,{method:"DELETE"});ce(S),await Promise.all([Ul(),ct()])}catch(S){ce({error:S instanceof Error?S.message:"policy delete failed",policy_id:m})}finally{oe(!1)}},Uc=e?`${e.user||e.email||"authenticated"} | groups: ${(e.groups||[]).join(", ")||"none"}`:n||"anonymous",Bc=e!=null&&e.allowed_groups&&e.allowed_groups.length>0?`Access requires: ${e.allowed_groups.join(", ")}`:"Access requires: any authenticated user";return p.jsxs("div",{className:"app-shell",children:[p.jsxs("header",{className:"topbar",children:[p.jsxs("div",{children:[p.jsx("h1",{children:"Soteria Backup Console"}),p.jsx("p",{className:"subtle",children:"Dark-mode React UI for backup drills, policy control, and B2 consumption visibility."})]}),p.jsxs("div",{className:"toolbar",children:[p.jsx("span",{className:`chip ${e?"good":"warn"}`,children:Uc}),p.jsx("span",{className:"chip",children:Bc}),zn>0&&p.jsxs("span",{className:"chip warn",children:[zn," backup job",zn===1?"":"s"," active"]}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void eu(),disabled:We,children:We?"Refreshing...":"Refresh"})]})]}),p.jsxs("main",{className:"layout",children:[p.jsxs("section",{className:"panel scroll-panel",children:[p.jsxs("div",{className:"panel-header",children:[p.jsx("h2",{children:"PVC Inventory"}),p.jsx("span",{className:"subtle",children:l!=null&&l.generated_at?`Updated ${qt(l.generated_at)}`:"No inventory yet"})]}),p.jsxs("label",{className:"checkbox-row",children:[p.jsx("input",{type:"checkbox",checked:Dl,onChange:m=>jc(m.target.checked)}),"Dedupe unchanged blocks (default)"]}),p.jsxs("label",{children:["Keep last snapshots per PVC (0 = keep all)",p.jsx("input",{type:"number",min:0,max:1e3,value:Il,onChange:m=>Pc(Math.max(0,Math.min(1e3,Number(m.target.value||0))))})]}),p.jsx("p",{className:"subtle tiny",children:"This setting applies to both `Backup now` and `Backup namespace` actions."}),i&&p.jsx("p",{className:"error",children:i}),!l&&!i&&p.jsx("p",{className:"subtle",children:"Loading inventory..."}),l==null?void 0:l.namespaces.map(m=>p.jsxs("article",{className:"namespace-block",children:[p.jsxs("div",{className:"namespace-row",children:[p.jsx("h3",{children:m.name}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Oc(m.name),disabled:We,children:"Backup namespace"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>Dc(m.name),children:"Restore namespace"})]})]}),p.jsx("div",{className:"pvc-grid",children:m.pvcs.map(S=>{const Z=S.healthy?"good":S.health_reason==="in_progress"?"warn":"bad",je=S.healthy?"Healthy":_p(S.health_reason),Gt=Math.max(0,Math.min(100,Number(S.last_job_progress_pct||0))),ru=Ep(S.last_job_state),$c=!!S.last_job_name||(S.active_backups||0)>0,Vc=Jt(S.last_backup_size_bytes),Ac=Jt(S.total_backup_size_bytes),Hc=S.driver==="restic"&&(S.last_backup_size_bytes===void 0||S.total_backup_size_bytes===void 0);return p.jsxs("article",{className:"pvc-card",children:[p.jsxs("div",{className:"pvc-title-row",children:[p.jsxs("div",{children:[p.jsx("h4",{children:S.pvc}),p.jsxs("p",{className:"subtle tiny",children:[S.volume||"unknown volume"," | ",S.storage_class||"no class"," | ",S.capacity||"unknown size"]})]}),p.jsx("span",{className:`chip ${Z}`,children:je})]}),p.jsxs("p",{className:"subtle tiny",children:["Last backup: ",S.last_backup_at?`${qt(S.last_backup_at)} (${(S.last_backup_age_hours||0).toFixed(1)}h ago)`:"never"]}),p.jsxs("p",{className:"subtle tiny",children:["Backups: ",S.completed_backups,"/",S.backup_count," completed | Latest size: ",Vc," | Total stored: ",Ac]}),Hc&&p.jsx("p",{className:"subtle tiny",children:"Per-PVC storage is estimated from restic upload summaries persisted by Soteria. Older backups created before tracking may show n/a until a new backup runs."}),$c&&p.jsxs("div",{className:"backup-progress",children:[p.jsxs("div",{className:"progress-header",children:[p.jsxs("p",{className:"subtle tiny",children:["Job: ",S.last_job_name||"n/a",S.last_job_started_at?` | Started ${qt(S.last_job_started_at)}`:""]}),p.jsx("span",{className:`chip ${ru}`,children:S.last_job_state||"Unknown"})]}),p.jsx("div",{className:"progress-track",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Gt,children:p.jsx("div",{className:`progress-fill ${ru} ${S.active_backups>0?"active":""}`,style:{width:`${Gt}%`}})}),p.jsxs("p",{className:"subtle tiny",children:["Progress ",Gt,"% | Active jobs: ",S.active_backups||0]})]}),S.error&&p.jsx("p",{className:"error tiny",children:S.error}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",onClick:()=>void Rc(S.namespace,S.pvc),disabled:We,children:"Backup now"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Mc(S.namespace,S.pvc),children:"Restore"})]})]},`${S.namespace}/${S.pvc}`)})})]},m.name))]}),p.jsxs("section",{className:"column",children:[p.jsxs("section",{className:"panel",children:[p.jsx("h2",{children:"Restore Planner"}),p.jsx("p",{className:"subtle tiny",children:"Inventory restore buttons preload this panel. This is where restore dry-runs and execution happen."}),a.kind==="none"&&p.jsx("p",{className:"subtle",children:"Choose Restore on a PVC or namespace to begin."}),a.kind==="pvc"&&p.jsxs("div",{className:"stack",children:[p.jsxs("p",{className:"subtle tiny",children:[p.jsx("strong",{children:"Source:"})," ",a.namespace,"/",a.pvc," (",a.volume,")"]}),p.jsxs("label",{children:["Backup snapshot",p.jsxs("select",{value:z,onChange:m=>V(m.target.value),children:[a.backups.length===0&&p.jsx("option",{value:"",children:"No completed backups"}),a.backups.map(m=>p.jsxs("option",{value:m.url||"",children:[m.name," | ",m.created||"unknown time"," | ",m.size||"size n/a"]},m.url||m.name))]})]}),p.jsxs("label",{children:["Target namespace",p.jsx("select",{value:g,onChange:m=>E(m.target.value),children:Fl.map(m=>p.jsx("option",{value:m,children:m},m))})]}),p.jsxs("label",{children:["Target PVC",p.jsx("input",{value:j,onChange:m=>P(m.target.value)})]}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",onClick:()=>void tu(!1),disabled:We||!z,children:"Create restore PVC"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void tu(!0),disabled:We||!z,children:"Dry run"})]})]}),a.kind==="namespace"&&p.jsxs("div",{className:"stack",children:[p.jsxs("p",{className:"subtle tiny",children:[p.jsx("strong",{children:"Source namespace:"})," ",a.namespace]}),p.jsxs("label",{children:["Target namespace",p.jsx("select",{value:R,onChange:m=>me(m.target.value),children:Fl.map(m=>p.jsx("option",{value:m,children:m},m))})]}),p.jsxs("label",{children:["Target PVC prefix",p.jsx("input",{value:Ze,onChange:m=>st(m.target.value)})]}),p.jsxs("label",{children:["Snapshot hint (optional)",p.jsx("input",{value:Pn,onChange:m=>wr(m.target.value),placeholder:"blank = latest completed"})]}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",onClick:()=>void nu(!1),disabled:We,children:"Create restore PVCs"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void nu(!0),disabled:We,children:"Dry run"})]})]})]}),p.jsxs("section",{className:"panel action-panel",children:[p.jsx("h2",{children:"Last Action"}),p.jsx("pre",{children:zc})]})]}),p.jsxs("section",{className:"column",children:[p.jsxs("section",{className:"panel",children:[p.jsxs("div",{className:"panel-header",children:[p.jsx("h2",{children:"B2 Consumption"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Lc(),disabled:F,children:F?"Refreshing...":"Refresh B2"})]}),x&&p.jsx("p",{className:"error",children:x}),!x&&!h.enabled&&p.jsx("p",{className:"subtle",children:"B2 monitoring is disabled in Soteria config."}),!x&&h.enabled&&!h.available&&p.jsx("p",{className:"error",children:h.error||"B2 usage currently unavailable."}),h.enabled&&p.jsxs("div",{className:"stack",children:[p.jsxs("p",{className:"subtle tiny",children:["Endpoint: ",h.endpoint||"n/a"," | Region: ",h.region||"n/a"]}),p.jsxs("p",{className:"subtle tiny",children:["Last scan: ",qt(h.scanned_at)," | Duration: ",h.scan_duration_ms||0,"ms"]}),p.jsxs("div",{className:"stat-grid",children:[p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Stored bytes"}),p.jsx("strong",{children:Jt(h.total_bytes)})]}),p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Objects"}),p.jsx("strong",{children:h.total_objects})]}),p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Recent bytes (24h)"}),p.jsx("strong",{children:Jt(h.recent_bytes_24h)})]}),p.jsxs("div",{className:"stat",children:[p.jsx("span",{className:"label",children:"Recent objects (24h)"}),p.jsx("strong",{children:h.recent_objects_24h})]})]}),p.jsx("p",{className:"subtle tiny",children:"Recent 24h values are object-change bandwidth proxy from bucket scans. B2 egress billing totals are not exposed by S3 object listing."}),p.jsx("div",{className:"bucket-table-wrap",children:p.jsxs("table",{children:[p.jsx("thead",{children:p.jsxs("tr",{children:[p.jsx("th",{children:"Bucket"}),p.jsx("th",{children:"Objects"}),p.jsx("th",{children:"Stored"}),p.jsx("th",{children:"Recent 24h"})]})}),p.jsx("tbody",{children:(h.buckets||[]).map(m=>p.jsxs("tr",{children:[p.jsxs("td",{children:[p.jsx("div",{children:m.name}),p.jsxs("div",{className:"subtle tiny",children:["Last object: ",qt(m.last_modified_at)]})]}),p.jsx("td",{children:m.object_count}),p.jsx("td",{children:Jt(m.total_bytes)}),p.jsx("td",{children:Jt(m.recent_bytes_24h)})]},m.name))})]})})]})]}),p.jsxs("section",{className:"panel scroll-panel",children:[p.jsx("h2",{children:"Backup Policies"}),p.jsx("p",{className:"subtle tiny",children:"Policy backups create new restic snapshots. `Keep last` controls version retention per PVC: 1 means only newest copy remains after each run. With dedupe on, unchanged blocks are reused in the shared repository. With dedupe off, Soteria isolates each PVC to its own repository path."}),p.jsxs("div",{className:"stack",children:[p.jsxs("label",{children:["Namespace",p.jsx("select",{value:Je,onChange:m=>at(m.target.value),children:Fl.map(m=>p.jsx("option",{value:m,children:m},m))})]}),p.jsxs("label",{children:["PVC (optional)",p.jsx("input",{value:C,onChange:m=>T(m.target.value),placeholder:"blank means all PVCs in namespace"})]}),p.jsxs("label",{children:["Interval hours",p.jsx("input",{type:"number",min:1,value:L,onChange:m=>A(Math.max(1,Number(m.target.value||1)))})]}),p.jsxs("label",{className:"checkbox-row",children:[p.jsx("input",{type:"checkbox",checked:X,onChange:m=>Lt(m.target.checked)}),"Enabled"]}),p.jsxs("label",{className:"checkbox-row",children:[p.jsx("input",{type:"checkbox",checked:Ae,onChange:m=>Yt(m.target.checked)}),"Dedupe unchanged blocks"]}),p.jsxs("label",{children:["Keep last snapshots per PVC (0 = keep all)",p.jsx("input",{type:"number",min:0,max:1e3,value:He,onChange:m=>Rt(Math.max(0,Math.min(1e3,Number(m.target.value||0))))})]}),p.jsx("button",{type:"button",onClick:()=>void Ic(),disabled:We||!Je,children:"Save policy"})]}),y&&p.jsx("p",{className:"error",children:y}),!y&&s.length===0&&p.jsx("p",{className:"subtle",children:"No policies yet."}),p.jsx("div",{className:"policy-list",children:s.map(m=>p.jsxs("article",{className:"policy-item",children:[p.jsxs("div",{className:"policy-head",children:[p.jsxs("strong",{children:[m.namespace,"/",m.pvc||"*"]}),p.jsx("span",{className:`chip ${m.enabled?"good":"bad"}`,children:m.enabled?"Enabled":"Disabled"})]}),p.jsxs("p",{className:"subtle tiny",children:["Every ",m.interval_hours,"h | Dedupe: ",m.dedupe===!1?"off":"on"," | Keep last: ",m.keep_last??0," | Updated ",qt(m.updated_at||m.created_at)]}),p.jsxs("div",{className:"actions",children:[p.jsx("button",{type:"button",className:"secondary",onClick:()=>{at(m.namespace),T(m.pvc||""),A(m.interval_hours),Lt(m.enabled),Yt(m.dedupe!==!1),Rt(m.keep_last??0)},children:"Load"}),p.jsx("button",{type:"button",className:"secondary",onClick:()=>void Fc(m.id),disabled:We,children:"Delete"})]})]},m.id))})]})]})]})]})}fo.createRoot(document.getElementById("root")).render(p.jsx(uf.StrictMode,{children:p.jsx(Np,{})})); diff --git a/internal/server/ui-dist/index.html b/internal/server/ui-dist/index.html index 68a1929..d0bfc5f 100644 --- a/internal/server/ui-dist/index.html +++ b/internal/server/ui-dist/index.html @@ -4,8 +4,8 @@ Soteria Backup Console - - + +
diff --git a/web/src/App.tsx b/web/src/App.tsx index 4b5b2fe..b050aed 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -659,7 +659,7 @@ function App() { Backups: {pvc.completed_backups}/{pvc.backup_count} completed | Latest size: {latestSizeLabel} | Total stored: {totalStoredLabel}

{showResticSizeHint && ( -

Per-PVC upload bytes are estimated from retained restic backup job logs; older jobs outside retention may show n/a.

+

Per-PVC storage is estimated from restic upload summaries persisted by Soteria. Older backups created before tracking may show n/a until a new backup runs.

)} {showProgress && (