@profoundlogic/coderflow-server 0.4.2 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/README.md +1 -1
- package/dist/base-image/entrypoint.sh +2 -1
- package/dist/coder-server.js +1 -1
- package/dist/config.js +1 -1
- package/dist/lib/agent-keepalive.js +1 -1
- package/dist/lib/agent-models.js +1 -1
- package/dist/lib/api-keys.js +1 -1
- package/dist/lib/apiKeys.js +1 -1
- package/dist/lib/app-server-ports.js +1 -1
- package/dist/lib/auto-judge.js +1 -1
- package/dist/lib/automation-service.js +1 -0
- package/dist/lib/basic-auth.js +1 -1
- package/dist/lib/bindings.js +1 -0
- package/dist/lib/build-history.js +1 -1
- package/dist/lib/build-output-service.js +1 -1
- package/dist/lib/build-scheduler.js +1 -1
- package/dist/lib/build-service.js +1 -1
- package/dist/lib/ca-certificates.js +1 -1
- package/dist/lib/claude-oauth-refresh.js +1 -1
- package/dist/lib/cli/build.js +1 -1
- package/dist/lib/cli/config-command.js +1 -1
- package/dist/lib/cli/config.js +1 -1
- package/dist/lib/cli/create-user.js +1 -1
- package/dist/lib/cli/init.js +1 -1
- package/dist/lib/cli/jira.js +1 -1
- package/dist/lib/cli/license.js +1 -1
- package/dist/lib/cli/server-manager.js +1 -1
- package/dist/lib/config-migration.js +1 -1
- package/dist/lib/container-credential-sync.js +1 -1
- package/dist/lib/container-tokens.js +1 -1
- package/dist/lib/data-dir.js +1 -1
- package/dist/lib/deployment-history.js +1 -1
- package/dist/lib/deployment-service.js +1 -1
- package/dist/lib/docker-utils.js +1 -1
- package/dist/lib/email.js +1 -1
- package/dist/lib/emailTemplates.js +1 -1
- package/dist/lib/entitlement.js +1 -1
- package/dist/lib/fetch-utils.js +1 -1
- package/dist/lib/git-askpass.sh +16 -0
- package/dist/lib/git-commit-details-route.js +1 -1
- package/dist/lib/git-history-diff-guardrails.js +1 -1
- package/dist/lib/git-provider-service.js +1 -1
- package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
- package/dist/lib/git-provider-setup/index.js +1 -1
- package/dist/lib/git-provider-setup/setup-factory.js +1 -1
- package/dist/lib/git-provider-setup/setup-interface.js +1 -1
- package/dist/lib/git-providers/azure-devops-provider.js +1 -1
- package/dist/lib/git-providers/github-app-provider.js +1 -1
- package/dist/lib/git-providers/index.js +1 -1
- package/dist/lib/git-providers/provider-factory.js +1 -1
- package/dist/lib/git-providers/provider-interface.js +1 -1
- package/dist/lib/github-urls.js +1 -1
- package/dist/lib/group-objective-linking.js +1 -1
- package/dist/lib/jira-client.js +1 -1
- package/dist/lib/judge-blinding.js +1 -1
- package/dist/lib/logger.js +1 -1
- package/dist/lib/migration-to-scoped-rbac.js +1 -0
- package/dist/lib/model-fetcher.js +1 -1
- package/dist/lib/notifications.js +1 -1
- package/dist/lib/objective-context.js +1 -1
- package/dist/lib/oidc-auth.js +1 -1
- package/dist/lib/oidc-device-flow.js +1 -1
- package/dist/lib/passwordTokens.js +1 -1
- package/dist/lib/permission-resolver.js +1 -0
- package/dist/lib/pin-cascade.js +1 -1
- package/dist/lib/provider-accounts.js +1 -1
- package/dist/lib/provider-oauth.js +1 -1
- package/dist/lib/provider-profile.js +1 -1
- package/dist/lib/provider-token-refresh.js +1 -1
- package/dist/lib/request-url.js +1 -1
- package/dist/lib/rewind.js +1 -1
- package/dist/lib/role-definitions.js +1 -0
- package/dist/lib/roles.js +1 -1
- package/dist/lib/secrets.js +1 -1
- package/dist/lib/setup-repo-git-auth.js +1 -1
- package/dist/lib/state-capture.js +1 -1
- package/dist/lib/static-files.js +1 -1
- package/dist/lib/task-name-format.js +1 -1
- package/dist/lib/task-name-generator.js +1 -1
- package/dist/lib/task-source-metadata.js +1 -0
- package/dist/lib/teams.js +1 -0
- package/dist/lib/user-git-oauth.js +1 -1
- package/dist/lib/user-git-tokens.js +1 -1
- package/dist/lib/users.js +1 -1
- package/dist/middleware/requireAuth.js +1 -1
- package/dist/middleware/requireInit.js +1 -1
- package/dist/middleware/requirePermission.js +1 -1
- package/dist/package-lock.json +211 -21
- package/dist/package.json +3 -1
- package/dist/playwright.config.js +1 -0
- package/dist/routes/apiKeys.js +1 -1
- package/dist/routes/auth-oidc.js +1 -1
- package/dist/routes/auth.js +1 -1
- package/dist/routes/automations.js +1 -0
- package/dist/routes/bindings.js +1 -0
- package/dist/routes/build.js +1 -1
- package/dist/routes/containers.js +1 -1
- package/dist/routes/deploy-task.js +1 -1
- package/dist/routes/environment-management.js +1 -1
- package/dist/routes/environments.js +1 -1
- package/dist/routes/external-skills.js +1 -1
- package/dist/routes/git-credentials.js +1 -1
- package/dist/routes/git-oauth.js +1 -1
- package/dist/routes/git-provider-setup.js +1 -1
- package/dist/routes/health.js +1 -1
- package/dist/routes/jira.js +1 -1
- package/dist/routes/objective-management.js +1 -1
- package/dist/routes/password.js +1 -1
- package/dist/routes/prompt.js +1 -1
- package/dist/routes/provider-auth.js +1 -1
- package/dist/routes/qa.js +1 -1
- package/dist/routes/roles.js +1 -0
- package/dist/routes/settings.js +1 -1
- package/dist/routes/skill-management.js +1 -1
- package/dist/routes/skills.js +1 -1
- package/dist/routes/tasks.js +1 -1
- package/dist/routes/teams.js +1 -0
- package/dist/routes/templates.js +1 -1
- package/dist/routes/test-task.js +1 -1
- package/dist/routes/test.js +1 -1
- package/dist/routes/users.js +1 -1
- package/dist/routes/visualizations.js +1 -1
- package/dist/scripts/create-user.js +1 -1
- package/dist/scripts/migrate-config-to-data-dir.js +1 -1
- package/dist/scripts/migrate-to-scoped-rbac.js +2 -0
- package/dist/start.js +1 -1
- package/dist/start.js.bak +1381 -0
- package/dist/web-ui/public/activity-detail-modal.js +1 -1
- package/dist/web-ui/public/activity-feed.js +1 -1
- package/dist/web-ui/public/activity-formatters.js +1 -1
- package/dist/web-ui/public/agent-event-parser.js +1 -1
- package/dist/web-ui/public/app.js +1 -1
- package/dist/web-ui/public/approve-dialog.js +1 -1
- package/dist/web-ui/public/automation-links.js +1 -0
- package/dist/web-ui/public/automation-schedule.js +1 -0
- package/dist/web-ui/public/comments-widget.js +1 -1
- package/dist/web-ui/public/diff-utils.js +1 -1
- package/dist/web-ui/public/docs/_sidebar.md +1 -0
- package/dist/web-ui/public/docs/admin/automations.md +75 -0
- package/dist/web-ui/public/docs/admin/git-providers.md +10 -5
- package/dist/web-ui/public/docs/admin/installation.md +1 -1
- package/dist/web-ui/public/docs/admin/users-and-roles.md +14 -4
- package/dist/web-ui/public/environments.css +253 -125
- package/dist/web-ui/public/environments.html +366 -2
- package/dist/web-ui/public/environments.js +1 -1
- package/dist/web-ui/public/feedback-widget.css +42 -0
- package/dist/web-ui/public/feedback-widget.js +1 -1
- package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
- package/dist/web-ui/public/git-history.html +15 -0
- package/dist/web-ui/public/git-history.js +1 -1
- package/dist/web-ui/public/git-status.js +1 -1
- package/dist/web-ui/public/index.html +27 -0
- package/dist/web-ui/public/index.js +1 -1
- package/dist/web-ui/public/login.js +1 -1
- package/dist/web-ui/public/markdown-editor.js +1 -1
- package/dist/web-ui/public/markdown-file-editor.js +1 -1
- package/dist/web-ui/public/modal-maximize.js +1 -1
- package/dist/web-ui/public/notifications.js +1 -1
- package/dist/web-ui/public/pr-dialog.js +1 -1
- package/dist/web-ui/public/roles.html +247 -0
- package/dist/web-ui/public/roles.js +1 -0
- package/dist/web-ui/public/server-health.js +1 -1
- package/dist/web-ui/public/settings.html +84 -1
- package/dist/web-ui/public/settings.js +1 -1
- package/dist/web-ui/public/setup-password.js +1 -1
- package/dist/web-ui/public/skills.css +6 -0
- package/dist/web-ui/public/skills.html +35 -0
- package/dist/web-ui/public/skills.js +1 -1
- package/dist/web-ui/public/sse-client.js +1 -1
- package/dist/web-ui/public/sse-shared-worker.js +1 -1
- package/dist/web-ui/public/styles.css +278 -161
- package/dist/web-ui/public/task.html +33 -2
- package/dist/web-ui/public/task.js +1 -1
- package/dist/web-ui/public/teams.html +285 -0
- package/dist/web-ui/public/teams.js +1 -0
- package/dist/web-ui/public/terminal.js +1 -1
- package/dist/web-ui/public/theme.js +1 -1
- package/dist/web-ui/public/users.html +87 -29
- package/dist/web-ui/public/users.js +1 -1
- package/dist/web-ui/public/variant-grouping.js +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Teams · CoderFlow</title>
|
|
7
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
8
|
+
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
|
9
|
+
<link rel="icon" href="/favicon-16.png" type="image/png" sizes="16x16">
|
|
10
|
+
<link rel="icon" href="/favicon.ico">
|
|
11
|
+
<script>
|
|
12
|
+
(() => {
|
|
13
|
+
const key = 'profound-coder-theme';
|
|
14
|
+
try {
|
|
15
|
+
const stored = localStorage.getItem(key);
|
|
16
|
+
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
17
|
+
const theme = stored === 'dark' || stored === 'light' ? stored : (prefersDark ? 'dark' : 'light');
|
|
18
|
+
document.documentElement.dataset.theme = theme;
|
|
19
|
+
document.documentElement.style.colorScheme = theme === 'dark' ? 'dark' : 'light';
|
|
20
|
+
} catch (error) {
|
|
21
|
+
document.documentElement.dataset.theme = 'light';
|
|
22
|
+
}
|
|
23
|
+
})();
|
|
24
|
+
</script>
|
|
25
|
+
<link rel="stylesheet" href="styles.css?v=83">
|
|
26
|
+
<script type="module" src="teams.js"></script>
|
|
27
|
+
<!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
|
|
28
|
+
</head>
|
|
29
|
+
<body>
|
|
30
|
+
<main class="task-detail">
|
|
31
|
+
<div class="task-hero">
|
|
32
|
+
<div class="hero-top">
|
|
33
|
+
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
34
|
+
<a class="breadcrumb-link" href="index.html">
|
|
35
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
36
|
+
<path d="M3 11.5L12 4l9 7.5"></path>
|
|
37
|
+
<path d="M5 10.5V20h5v-5h4v5h5v-9.5"></path>
|
|
38
|
+
</svg>
|
|
39
|
+
<span>Home</span>
|
|
40
|
+
</a>
|
|
41
|
+
<span class="breadcrumb-separator" aria-hidden="true">/</span>
|
|
42
|
+
<span class="breadcrumb-current">Teams</span>
|
|
43
|
+
</nav>
|
|
44
|
+
<span class="task-context">Administration</span>
|
|
45
|
+
<!-- Admin Menu (gear icon) -->
|
|
46
|
+
<div class="admin-menu-container" id="admin-menu-container" hidden>
|
|
47
|
+
<button class="btn-icon-admin" id="admin-menu-btn" title="Admin">
|
|
48
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
49
|
+
<circle cx="12" cy="12" r="3"></circle>
|
|
50
|
+
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
|
51
|
+
</svg>
|
|
52
|
+
</button>
|
|
53
|
+
<div class="dropdown-menu admin-dropdown" id="admin-menu" hidden>
|
|
54
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='users.html'">
|
|
55
|
+
<svg class="option-icon icon-users" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
56
|
+
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
|
|
57
|
+
<circle cx="9" cy="7" r="4"></circle>
|
|
58
|
+
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
|
|
59
|
+
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
|
|
60
|
+
</svg>
|
|
61
|
+
<span class="option-text">Users</span>
|
|
62
|
+
</button>
|
|
63
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='environments.html'">
|
|
64
|
+
<svg class="option-icon icon-environments" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
65
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
66
|
+
<line x1="2" y1="12" x2="22" y2="12"></line>
|
|
67
|
+
<path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>
|
|
68
|
+
</svg>
|
|
69
|
+
<span class="option-text">Environments</span>
|
|
70
|
+
</button>
|
|
71
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='roles.html'">
|
|
72
|
+
<svg class="option-icon icon-roles" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
73
|
+
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
|
|
74
|
+
</svg>
|
|
75
|
+
<span class="option-text">Roles</span>
|
|
76
|
+
</button>
|
|
77
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='skills.html'">
|
|
78
|
+
<svg class="option-icon icon-skills" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
79
|
+
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path>
|
|
80
|
+
</svg>
|
|
81
|
+
<span class="option-text">Skills</span>
|
|
82
|
+
</button>
|
|
83
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='settings.html'">
|
|
84
|
+
<svg class="option-icon icon-server-settings" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
85
|
+
<line x1="4" y1="21" x2="4" y2="14"></line>
|
|
86
|
+
<line x1="4" y1="10" x2="4" y2="3"></line>
|
|
87
|
+
<line x1="12" y1="21" x2="12" y2="12"></line>
|
|
88
|
+
<line x1="12" y1="8" x2="12" y2="3"></line>
|
|
89
|
+
<line x1="20" y1="21" x2="20" y2="16"></line>
|
|
90
|
+
<line x1="20" y1="12" x2="20" y2="3"></line>
|
|
91
|
+
<line x1="1" y1="14" x2="7" y2="14"></line>
|
|
92
|
+
<line x1="9" y1="8" x2="15" y2="8"></line>
|
|
93
|
+
<line x1="17" y1="16" x2="23" y2="16"></line>
|
|
94
|
+
</svg>
|
|
95
|
+
<span class="option-text">Server Settings</span>
|
|
96
|
+
</button>
|
|
97
|
+
<button type="button" class="dropdown-item admin-menu-item" id="server-health-btn">
|
|
98
|
+
<svg class="option-icon icon-health" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
99
|
+
<path d="M22 12h-4l-3 9L9 3l-3 9H2"></path>
|
|
100
|
+
</svg>
|
|
101
|
+
<span class="option-text">Server Health</span>
|
|
102
|
+
</button>
|
|
103
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='git-history.html'">
|
|
104
|
+
<svg class="option-icon icon-git-history" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
105
|
+
<circle cx="6" cy="6" r="2"></circle>
|
|
106
|
+
<circle cx="6" cy="18" r="2"></circle>
|
|
107
|
+
<circle cx="18" cy="12" r="2"></circle>
|
|
108
|
+
<path d="M6 8v8"></path>
|
|
109
|
+
<path d="M6 12h10"></path>
|
|
110
|
+
</svg>
|
|
111
|
+
<span class="option-text">Git History</span>
|
|
112
|
+
</button>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div id="theme-toggle-container"></div>
|
|
116
|
+
</div>
|
|
117
|
+
<div class="status-hero">
|
|
118
|
+
<div class="status-copy">
|
|
119
|
+
<h1>Team Management</h1>
|
|
120
|
+
<p class="task-subtitle">Manage teams and their environment access bindings</p>
|
|
121
|
+
</div>
|
|
122
|
+
<div class="status-actions">
|
|
123
|
+
<button class="btn-primary btn-small" id="create-team-btn" hidden>Create Team</button>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<div id="teams-loading" class="loading">Loading teams…</div>
|
|
129
|
+
<div id="teams-error" class="empty-state" hidden>
|
|
130
|
+
<h3>Failed to load teams</h3>
|
|
131
|
+
<p id="teams-error-message" class="text-muted"></p>
|
|
132
|
+
<button class="btn-primary" id="retry-teams-btn">Try Again</button>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<section id="teams-content" class="detail-stack" hidden>
|
|
136
|
+
<article class="detail-card">
|
|
137
|
+
<header class="detail-card-header">
|
|
138
|
+
<h2>Teams</h2>
|
|
139
|
+
<span id="team-count" class="tag">0 teams</span>
|
|
140
|
+
</header>
|
|
141
|
+
<div class="detail-card-content">
|
|
142
|
+
<div class="users-table-container">
|
|
143
|
+
<table class="users-table">
|
|
144
|
+
<thead>
|
|
145
|
+
<tr>
|
|
146
|
+
<th>Name</th>
|
|
147
|
+
<th>Members</th>
|
|
148
|
+
<th>Managers</th>
|
|
149
|
+
<th>Actions</th>
|
|
150
|
+
</tr>
|
|
151
|
+
</thead>
|
|
152
|
+
<tbody id="teams-table-body">
|
|
153
|
+
<!-- Teams populated by JS -->
|
|
154
|
+
</tbody>
|
|
155
|
+
</table>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</article>
|
|
159
|
+
</section>
|
|
160
|
+
</main>
|
|
161
|
+
|
|
162
|
+
<!-- Create/Edit Team Modal -->
|
|
163
|
+
<div id="team-modal" class="modal" hidden>
|
|
164
|
+
<div class="modal-overlay"></div>
|
|
165
|
+
<div class="modal-content" style="max-width: 640px;">
|
|
166
|
+
<div class="modal-header">
|
|
167
|
+
<h2 id="team-modal-title">Create Team</h2>
|
|
168
|
+
<button class="modal-close" id="close-team-modal">×</button>
|
|
169
|
+
</div>
|
|
170
|
+
<!-- Tab bar (hidden when creating) -->
|
|
171
|
+
<div id="team-modal-tabs" hidden style="display: flex; gap: 0; border-bottom: 2px solid var(--color-border); margin: 0 1.5rem;">
|
|
172
|
+
<button type="button" class="modal-tab-btn active" data-tab="details" style="padding: 0.625rem 1.25rem; background: none; border: none; border-bottom: 2px solid transparent; cursor: pointer; font-size: 0.9rem; margin-bottom: -2px; color: var(--color-text-secondary);">Details</button>
|
|
173
|
+
<button type="button" class="modal-tab-btn" data-tab="bindings" style="padding: 0.625rem 1.25rem; background: none; border: none; border-bottom: 2px solid transparent; cursor: pointer; font-size: 0.9rem; margin-bottom: -2px; color: var(--color-text-secondary);">Access Bindings</button>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="modal-body">
|
|
176
|
+
|
|
177
|
+
<!-- Details Tab -->
|
|
178
|
+
<div id="team-tab-details">
|
|
179
|
+
<div class="modal-section">
|
|
180
|
+
<label for="team-name">Name *</label>
|
|
181
|
+
<input type="text" id="team-name" class="form-input" required placeholder="e.g. Frontend Team">
|
|
182
|
+
</div>
|
|
183
|
+
<div class="modal-section">
|
|
184
|
+
<label for="team-description">Description</label>
|
|
185
|
+
<input type="text" id="team-description" class="form-input" placeholder="Optional description">
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<!-- Members section (shown when editing) -->
|
|
189
|
+
<div id="members-section" hidden>
|
|
190
|
+
<div class="modal-section">
|
|
191
|
+
<label>Members</label>
|
|
192
|
+
<div id="members-list" style="margin-bottom: 0.5rem;"></div>
|
|
193
|
+
<div id="add-member-row" style="display: flex; gap: 0.5rem; margin-top: 0.5rem;">
|
|
194
|
+
<select id="add-member-select" class="form-input" style="flex: 1; font-size: 0.875rem;">
|
|
195
|
+
<option value="">Add a member…</option>
|
|
196
|
+
</select>
|
|
197
|
+
<button type="button" class="btn-secondary btn-small" id="add-member-btn">Add</button>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<!-- Managers section (admin only) -->
|
|
202
|
+
<div id="managers-section" class="modal-section" hidden>
|
|
203
|
+
<label>Managers <span style="font-weight: normal; font-size: 0.8em; color: var(--color-text-secondary);">(admin only)</span></label>
|
|
204
|
+
<div id="managers-list" style="margin-bottom: 0.5rem;"></div>
|
|
205
|
+
<div id="add-manager-row" style="display: flex; gap: 0.5rem; margin-top: 0.5rem;">
|
|
206
|
+
<select id="add-manager-select" class="form-input" style="flex: 1; font-size: 0.875rem;">
|
|
207
|
+
<option value="">Promote a member to manager…</option>
|
|
208
|
+
</select>
|
|
209
|
+
<button type="button" class="btn-secondary btn-small" id="add-manager-btn">Add</button>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
<div id="team-form-error" class="login-error" hidden></div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<!-- Bindings Tab -->
|
|
218
|
+
<div id="team-tab-bindings" hidden>
|
|
219
|
+
<div id="bindings-loading" class="loading" hidden>Loading bindings…</div>
|
|
220
|
+
<div id="bindings-empty" hidden style="padding: 1.5rem 0; text-align: center; color: var(--color-text-secondary);">
|
|
221
|
+
No environment access bindings for this team yet.
|
|
222
|
+
</div>
|
|
223
|
+
<div id="bindings-list-container">
|
|
224
|
+
<table class="users-table" id="bindings-table">
|
|
225
|
+
<thead>
|
|
226
|
+
<tr>
|
|
227
|
+
<th>Environment</th>
|
|
228
|
+
<th>Role</th>
|
|
229
|
+
<th>Actions</th>
|
|
230
|
+
</tr>
|
|
231
|
+
</thead>
|
|
232
|
+
<tbody id="bindings-table-body"></tbody>
|
|
233
|
+
</table>
|
|
234
|
+
</div>
|
|
235
|
+
<div id="bindings-actions" style="margin-top: 1rem;">
|
|
236
|
+
<button type="button" class="btn-secondary btn-small" id="add-binding-btn" hidden>+ Add Binding</button>
|
|
237
|
+
</div>
|
|
238
|
+
<!-- Inline add-binding form -->
|
|
239
|
+
<div id="add-binding-form" hidden style="margin-top: 0.75rem; padding: 1rem; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-surface-elevated);">
|
|
240
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-bottom: 0.75rem;">
|
|
241
|
+
<div>
|
|
242
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Environment</label>
|
|
243
|
+
<select id="binding-environment" class="form-input" style="font-size: 0.875rem;"></select>
|
|
244
|
+
</div>
|
|
245
|
+
<div>
|
|
246
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Role</label>
|
|
247
|
+
<select id="binding-role" class="form-input" style="font-size: 0.875rem;"></select>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
251
|
+
<button type="button" class="btn-primary btn-small" id="save-binding-btn">Add Binding</button>
|
|
252
|
+
<button type="button" class="btn-ghost btn-small" id="cancel-binding-btn">Cancel</button>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
</div>
|
|
258
|
+
<div class="modal-footer" id="team-modal-footer">
|
|
259
|
+
<button class="btn-ghost" id="cancel-team">Cancel</button>
|
|
260
|
+
<button class="btn-primary" id="save-team">Save Team</button>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
<!-- Delete Team Confirmation Modal -->
|
|
266
|
+
<div id="delete-team-modal" class="modal" hidden>
|
|
267
|
+
<div class="modal-overlay"></div>
|
|
268
|
+
<div class="modal-content">
|
|
269
|
+
<div class="modal-header">
|
|
270
|
+
<h2>Delete Team</h2>
|
|
271
|
+
<button class="modal-close" id="close-delete-team-modal">×</button>
|
|
272
|
+
</div>
|
|
273
|
+
<div class="modal-body">
|
|
274
|
+
<p>Are you sure you want to delete team <strong id="delete-team-name"></strong>?</p>
|
|
275
|
+
<p class="field-hint">All environment access bindings for this team will also be removed. This action cannot be undone.</p>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="modal-footer">
|
|
278
|
+
<button class="btn-ghost" id="cancel-delete-team">Cancel</button>
|
|
279
|
+
<button class="btn-primary" id="confirm-delete-team" style="background: var(--color-danger);">Delete Team</button>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
</body>
|
|
285
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x225786=_0x4873;(function(_0x174eaa,_0x3c1562){const _0x5edc66=_0x4873,_0x2ea520=_0x174eaa();while(!![]){try{const _0x20cb80=parseInt(_0x5edc66(0x1be))/0x1+-parseInt(_0x5edc66(0x19b))/0x2*(parseInt(_0x5edc66(0x16a))/0x3)+parseInt(_0x5edc66(0x1df))/0x4+parseInt(_0x5edc66(0x1d4))/0x5+parseInt(_0x5edc66(0x194))/0x6*(-parseInt(_0x5edc66(0x1a5))/0x7)+parseInt(_0x5edc66(0x1f0))/0x8+-parseInt(_0x5edc66(0x1e0))/0x9*(parseInt(_0x5edc66(0x160))/0xa);if(_0x20cb80===_0x3c1562)break;else _0x2ea520['push'](_0x2ea520['shift']());}catch(_0x34b263){_0x2ea520['push'](_0x2ea520['shift']());}}}(_0x1023,0x6af80));import{API,Utils,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'teams':[],'users':[],'roles':[],'environments':[],'teamBindings':[],'currentUser':null,'editingTeamId':null,'deletingTeamId':null,'activeTab':_0x225786(0x18c)};document[_0x225786(0x18e)](_0x225786(0x1b1),async()=>{const _0x23a3a2=_0x225786;initTheme(),mountThemeToggle();try{state[_0x23a3a2(0x1ba)]=await API[_0x23a3a2(0x177)]();}catch{window[_0x23a3a2(0x1c1)]['href']=_0x23a3a2(0x15b);return;}await initializeAdminMenu(state['currentUser']),state['currentUser'][_0x23a3a2(0x184)]&&(document[_0x23a3a2(0x1f3)](_0x23a3a2(0x1ac))['hidden']=![]),bindEventListeners(),await Promise[_0x23a3a2(0x19f)]([loadTeams(),loadUsers(),loadRoles(),loadEnvironments()]),renderTeams();});async function loadTeams(){const _0x252e9f=_0x225786,_0x543e0d=document['getElementById']('teams-loading'),_0x2e5be7=document[_0x252e9f(0x1f3)](_0x252e9f(0x161)),_0x800723=document['getElementById']('teams-content');try{_0x543e0d[_0x252e9f(0x1a9)]=![],_0x2e5be7['hidden']=!![],_0x800723[_0x252e9f(0x1a9)]=!![];const {teams:_0x56aefb}=await API[_0x252e9f(0x1c0)]();state[_0x252e9f(0x1a0)]=_0x56aefb||[],renderTeams(),_0x543e0d[_0x252e9f(0x1a9)]=!![],_0x800723[_0x252e9f(0x1a9)]=![];}catch(_0x4c7aab){_0x543e0d['hidden']=!![],_0x2e5be7[_0x252e9f(0x1a9)]=![],document['getElementById']('teams-error-message')[_0x252e9f(0x157)]=_0x4c7aab['message'];}}async function loadUsers(){const _0x1e947a=_0x225786;try{const {users:_0x1ba675}=await API['getUsers']();state['users']=_0x1ba675||[];}catch{state[_0x1e947a(0x15e)]=[];}}async function loadRoles(){const _0x300b3e=_0x225786;try{const {roles:_0x55e7e3}=await API['getRoleDefinitions']();state[_0x300b3e(0x1c7)]=_0x55e7e3||[];}catch{state[_0x300b3e(0x1c7)]=[];}}async function loadEnvironments(){const _0x5f5b52=_0x225786;try{const _0x5a1495=await API[_0x5f5b52(0x1db)]();state[_0x5f5b52(0x1e1)]=_0x5a1495['environments']||[];}catch{state[_0x5f5b52(0x1e1)]=[];}}function renderTeams(){const _0x162a82=_0x225786,_0x4654b0=document[_0x162a82(0x1f3)]('teams-table-body'),_0x30e5f2=document[_0x162a82(0x1f3)](_0x162a82(0x1b9));if(!_0x4654b0)return;_0x30e5f2&&(_0x30e5f2[_0x162a82(0x157)]=state[_0x162a82(0x1a0)][_0x162a82(0x186)]+_0x162a82(0x1ed)+(state['teams'][_0x162a82(0x186)]===0x1?'':'s'));if(state[_0x162a82(0x1a0)][_0x162a82(0x186)]===0x0){_0x4654b0[_0x162a82(0x188)]=_0x162a82(0x181)+(state[_0x162a82(0x1ba)]?.[_0x162a82(0x184)]?'Click\x20<strong>Create\x20Team</strong>\x20to\x20get\x20started.':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';return;}const _0x188450=state[_0x162a82(0x1ba)]?.[_0x162a82(0x184)];_0x4654b0['innerHTML']=state[_0x162a82(0x1a0)]['map'](_0x4d5546=>{const _0x4cb437=_0x162a82,_0x26ee82=(_0x4d5546[_0x4cb437(0x192)]||[])['includes'](state[_0x4cb437(0x1ba)]?.['id']),_0x33fbf3=_0x188450||_0x26ee82,_0x2008e9=(_0x4d5546['managers']||[])[_0x4cb437(0x16c)](_0x38edfd=>{const _0x27cbdc=_0x4cb437;if(_0x4d5546[_0x27cbdc(0x1da)]&&_0x4d5546[_0x27cbdc(0x1da)][_0x38edfd])return _0x4d5546[_0x27cbdc(0x1da)][_0x38edfd];const _0x4254fb=state[_0x27cbdc(0x15e)][_0x27cbdc(0x1ff)](_0x1bd708=>_0x1bd708['id']===_0x38edfd);return _0x4254fb?_0x4254fb[_0x27cbdc(0x15f)]||_0x4254fb[_0x27cbdc(0x1e4)]:_0x38edfd;})['join'](',\x20')||'—',_0x196682=(_0x4d5546[_0x4cb437(0x1c3)]||[])[_0x4cb437(0x186)];return'\x0a\x20\x20\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-ghost\x20btn-small\x22\x20style=\x22font-weight:\x20600;\x20padding:\x200;\x20text-decoration:\x20underline;\x20text-decoration-style:\x20dotted;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20onclick=\x22window.openTeamModal(\x27'+_0x4d5546['id']+_0x4cb437(0x19e)+Utils[_0x4cb437(0x191)](_0x4d5546[_0x4cb437(0x15f)])+_0x4cb437(0x1fe)+(_0x4d5546[_0x4cb437(0x1a4)]?_0x4cb437(0x1bb)+Utils[_0x4cb437(0x191)](_0x4d5546[_0x4cb437(0x1a4)])+_0x4cb437(0x15c):'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>'+_0x196682+_0x4cb437(0x1a2)+Utils[_0x4cb437(0x191)](_0x2008e9)+_0x4cb437(0x16d)+(_0x33fbf3?_0x4cb437(0x1ef)+_0x4d5546['id']+_0x4cb437(0x1c5):'')+_0x4cb437(0x172)+(_0x188450?_0x4cb437(0x1bc)+_0x4d5546['id']+'\x27)\x22>Delete</button>':'')+_0x4cb437(0x1d1);})['join']('');}function bindEventListeners(){const _0x25e6af=_0x225786;document['getElementById']('create-team-btn')?.['addEventListener'](_0x25e6af(0x1b0),showCreateTeamModal),document['getElementById'](_0x25e6af(0x1cf))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),loadTeams),document[_0x25e6af(0x1f3)](_0x25e6af(0x19c))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),hideTeamModal),document[_0x25e6af(0x1f3)](_0x25e6af(0x1e2))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),hideTeamModal),document[_0x25e6af(0x1f3)](_0x25e6af(0x1a7))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),saveTeam),document[_0x25e6af(0x164)](_0x25e6af(0x169))?.[_0x25e6af(0x18e)]('click',hideTeamModal),document[_0x25e6af(0x1bd)](_0x25e6af(0x1dd))[_0x25e6af(0x163)](_0x5b85b1=>{const _0xb2815a=_0x25e6af;_0x5b85b1[_0xb2815a(0x18e)](_0xb2815a(0x1b0),()=>switchTab(_0x5b85b1[_0xb2815a(0x1d7)][_0xb2815a(0x1a8)]));}),document[_0x25e6af(0x1f3)](_0x25e6af(0x1c9))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),addMember),document[_0x25e6af(0x1f3)](_0x25e6af(0x15d))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),addManager),document['getElementById'](_0x25e6af(0x193))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),()=>{const _0x85d7dd=_0x25e6af;document[_0x85d7dd(0x1f3)]('add-binding-form')['hidden']=![],document['getElementById'](_0x85d7dd(0x193))[_0x85d7dd(0x1a9)]=!![],populateBindingForm();}),document[_0x25e6af(0x1f3)](_0x25e6af(0x1d6))?.['addEventListener'](_0x25e6af(0x1b0),()=>{const _0x46642f=_0x25e6af;document[_0x46642f(0x1f3)]('add-binding-form')['hidden']=!![],document['getElementById']('add-binding-btn')[_0x46642f(0x1a9)]=![];}),document[_0x25e6af(0x1f3)](_0x25e6af(0x1ad))?.['addEventListener'](_0x25e6af(0x1b0),saveBinding),document[_0x25e6af(0x1f3)](_0x25e6af(0x200))?.[_0x25e6af(0x18e)]('click',hideDeleteModal),document[_0x25e6af(0x1f3)](_0x25e6af(0x18b))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),hideDeleteModal),document['getElementById'](_0x25e6af(0x187))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),confirmDeleteTeam),document['querySelector'](_0x25e6af(0x1fb))?.[_0x25e6af(0x18e)](_0x25e6af(0x1b0),hideDeleteModal);}function showCreateTeamModal(){const _0x4d1680=_0x225786;state[_0x4d1680(0x1d3)]=null,state[_0x4d1680(0x1b3)]=_0x4d1680(0x18c),document['getElementById'](_0x4d1680(0x1cd))[_0x4d1680(0x157)]=_0x4d1680(0x1cc),document[_0x4d1680(0x1f3)](_0x4d1680(0x17e))[_0x4d1680(0x1b5)]='',document['getElementById']('team-name')[_0x4d1680(0x1c4)]=![],document['getElementById'](_0x4d1680(0x1ab))[_0x4d1680(0x1b5)]='',document[_0x4d1680(0x1f3)](_0x4d1680(0x1ab))[_0x4d1680(0x1c4)]=![],document[_0x4d1680(0x1f3)](_0x4d1680(0x16f))[_0x4d1680(0x1a9)]=!![],document['getElementById'](_0x4d1680(0x18d))[_0x4d1680(0x1a9)]=!![],document[_0x4d1680(0x1f3)](_0x4d1680(0x1ca))['hidden']=!![],document[_0x4d1680(0x1f3)](_0x4d1680(0x1a7))[_0x4d1680(0x1a9)]=![],document[_0x4d1680(0x1f3)](_0x4d1680(0x1a6))[_0x4d1680(0x1a9)]=![],showTab(_0x4d1680(0x18c)),document['getElementById']('team-modal')[_0x4d1680(0x1a9)]=![],setTimeout(()=>document[_0x4d1680(0x1f3)](_0x4d1680(0x17e))[_0x4d1680(0x1dc)](),0x64);}window[_0x225786(0x168)]=function(_0x3f88b2){const _0x3f32b3=_0x225786,_0x48d586=state[_0x3f32b3(0x1a0)][_0x3f32b3(0x1ff)](_0x35d099=>_0x35d099['id']===_0x3f88b2);if(!_0x48d586)return;state[_0x3f32b3(0x1d3)]=_0x3f88b2,state[_0x3f32b3(0x1b3)]=_0x3f32b3(0x18c);const _0x1f0847=state[_0x3f32b3(0x1ba)]?.[_0x3f32b3(0x184)],_0x449e77=(_0x48d586[_0x3f32b3(0x192)]||[])[_0x3f32b3(0x1fd)](state[_0x3f32b3(0x1ba)]?.['id']),_0x1c4f7d=_0x1f0847||_0x449e77;document[_0x3f32b3(0x1f3)](_0x3f32b3(0x1cd))[_0x3f32b3(0x157)]=_0x48d586[_0x3f32b3(0x15f)],document['getElementById']('team-name')[_0x3f32b3(0x1b5)]=_0x48d586[_0x3f32b3(0x15f)],document[_0x3f32b3(0x1f3)]('team-name')[_0x3f32b3(0x1c4)]=!_0x1c4f7d,document[_0x3f32b3(0x1f3)](_0x3f32b3(0x1ab))['value']=_0x48d586[_0x3f32b3(0x1a4)]||'',document[_0x3f32b3(0x1f3)]('team-description')[_0x3f32b3(0x1c4)]=!_0x1c4f7d,document[_0x3f32b3(0x1f3)](_0x3f32b3(0x16f))[_0x3f32b3(0x1a9)]=!![],document[_0x3f32b3(0x1f3)](_0x3f32b3(0x18d))['hidden']=![],document['getElementById']('members-section')[_0x3f32b3(0x1a9)]=![],document['getElementById']('save-team')[_0x3f32b3(0x1a9)]=!_0x1c4f7d,document['getElementById'](_0x3f32b3(0x17c))[_0x3f32b3(0x1a9)]=!_0x1f0847,setActiveTabButton(_0x3f32b3(0x18c)),renderMembersList(_0x48d586),updateMemberSelect(_0x48d586),_0x1f0847&&(renderManagersList(_0x48d586),updateManagerSelect(_0x48d586)),showTab(_0x3f32b3(0x18c)),document[_0x3f32b3(0x1f3)]('team-modal')[_0x3f32b3(0x1a9)]=![];};function hideTeamModal(){const _0x5f2b1c=_0x225786;document[_0x5f2b1c(0x1f3)](_0x5f2b1c(0x1e7))[_0x5f2b1c(0x1a9)]=!![],document[_0x5f2b1c(0x1f3)]('team-name')[_0x5f2b1c(0x1c4)]=![],document[_0x5f2b1c(0x1f3)](_0x5f2b1c(0x1ab))['disabled']=![],state[_0x5f2b1c(0x1d3)]=null;}function switchTab(_0x114dd1){const _0x50bec3=_0x225786;state['activeTab']=_0x114dd1,setActiveTabButton(_0x114dd1),showTab(_0x114dd1),_0x114dd1===_0x50bec3(0x1a3)&&state['editingTeamId']&&loadTeamBindings(state[_0x50bec3(0x1d3)]);}function _0x1023(){const _0x573cc4=['z2v0rw52AxjVBM1LBNrZ','zM9JDxm','lM1VzgfSlxrHyI1IDg4','yMLUzgLUzY1LBNzPCM9UBwvUDa','mJm3nZu0nerdyKnLBq','mtm1whPzwg5v','zw52AxjVBM1LBNrZ','y2fUy2vSlxrLyw0','BwvZC2fNzq','DxnLCM5HBwu','AM9PBG','zgvSzxrLvgvHBq','DgvHBs1TB2rHBa','DgvHBs10ywiTyMLUzgLUz3m','pgj1DhrVBIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lMrLBgv0zujPBMrPBMDdBgLJAYGN','cIaGicaGidXKAxyGC3r5Bgu9iMrPC3bSyxK6igzSzxG7igfSAwDUlwL0zw1ZoIbJzw50zxi7igP1C3rPzNKTy29UDgvUDdOGC3bHy2uTyMv0D2vLBJSGCgfKzgLUzZOGmc4ZnxjLBsaWoYbIB3jKzxiTyM90Dg9ToIaXChGGC29SAwqGDMfYkc0Ty29SB3iTyM9YzgvYktSIpGOGicaGicaGidXZCgfUihn0EwXLpsjMB250lxnPEMu6idaUodC1CMvToYi+cIaGicaGicaGica','zgvSzxrLlxrLyw0TBMfTzq','DgvHBq','ihrLyw0','rgvSzxrLifrLyw0','pgj1DhrVBIbJBgfZCZ0IyNrUlxnLy29UzgfYEsbIDg4TC21HBgWIig9Uy2XPy2S9iNDPBMrVDY5VCgvUvgvHBu1VzgfSkcC','nteZmJiWmezmzvrmCa','pc9VChrPB24+','cIaGica8Dhi+cIaGicaGidX0zd4','z2v0rwXLBwvUDej5swq','ktWVC3bHBJ4','C2HVD1rVyxn0','zgLZCgXHEq','qwrKAw5N4OcM','BwfUywDLCNmTBgLZDa','zM9UDfDLAwDODa','DMfYkc0Ty29SB3iTChjPBwfYEsK','i2rLBgv0zs10zwfTlw1VzgfSic5TB2rHBc1VDMvYBgf5','zgvSzxrPBMDuzwfTswq','Aw5JBhvKzxm','cIaGicaGicaGica8l2j1DhrVBJ4kicaGicaGicaGia','zMLUza','y2XVC2uTzgvSzxrLlxrLyw0TBw9KywW','vgvHBsbJCMvHDgvK','CMvTB3zLtwvTyMvYq2XPy2S','Dgv4DenVBNrLBNq','cIaGicaGidWVzgL2pG','twfUywDLCIbYzw1VDMvK','z2v0qMLUzgLUz3m','Bg9NAw4UAhrTBa','pc9KAxy+','ywrKlw1HBMfNzxiTyNrU','DxnLCNm','BMfTzq','odm2mZbXCNDZBeK','DgvHBxmTzxjYB3i','ywrKlw1LBwjLCI1ZzwXLy3q','zM9YrwfJAa','CxvLCNLtzwXLy3rVCG','CMvTB3zLtwfUywDLCKnSAwnR','C3r5Bgu','phaGC3r5Bgu9iMzVBNqTC2L6ztOGmc44nZvYzw07ignVBg9YoIb2yxiOls1JB2XVCI10zxH0lxnLy29UzgfYEsK7ig1HCMDPBJOGmc4YnxjLBsaWoYi+tM8GBwvTyMvYCYb5zxq8l3a+','B3bLBLrLyw1nB2rHBa','i3rLyw0TBw9KywWGlM1VzgfSlw92zxjSyxK','m2jZAMfXqG','jYKIihn0EwXLpsjJB2XVCJOGDMfYkc0Ty29SB3iTzgfUz2vYktSIpLjLBw92ztWVyNv0Dg9UpG','BwfW','pc90zd4kicaGicaGica8Dgq+cIaGicaGicaGica8zgL2ignSyxnZpsj1C2vYlwfJDgLVBNmIpGOGicaGicaGicaGica','BM9YBwfS','DgvHBs1MB3jTlwvYCM9Y','pg9WDgLVBIb2ywX1zt0IiJ5qCM9TB3rLigeGBwvTyMvYihrVig1HBMfNzxlIGky8l29WDgLVBJ4','ywrKvgvHBu1HBMfNzxi','cIaGicaGicaGicaGia','pc9ZCgfUpGOGicaGicaGidXIDxr0B24GDhLWzt0IyNv0Dg9UiIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lNjLBw92zu1HBMfNzxjdBgLJAYGN','CMvTB3zLvgvHBu1LBwjLCG','pc90zd4kicaGicaGphrKpG','CM9Szv9Uyw1L','z2v0q3vYCMvUDfvZzxi','zw52AxjVBM1LBNq','zMLSDgvY','cIaGicaGicaGpc9ZCgfUpGOGicaGicaGia','nJaW','BwfUywDLCNmTC2vJDgLVBG','zxjYB3i','DgvHBs1Uyw1L','qMLUzgLUzYbYzw1VDMvK','BwvTyMvYCY1SAxn0','cIaGicaGidX0CJ4kicaGicaGica8DgqGy29SC3bHBJ0InciGC3r5Bgu9iNrLEhqTywXPz246ignLBNrLCJSGy29SB3i6ihzHCIGTlwnVBg9YlxrLEhqTC2vJB25Kyxj5ktSGCgfKzgLUzZOGmNjLBtSIpGOGicaGicaGicaGtM8GDgvHBxmGEwv0lGOGicaGicaGicaG','idXZCgfUihn0EwXLpsjJB2XVCJOGDMfYkc0Ty29SB3iTDgv4Dc1ZzwnVBMrHCNKPoYbMB250lxnPEMu6idaUodvLBtSIpIG','DMfYkc0Ty29SB3iTDgv4Dc1ZzwnVBMrHCNKP','Axntzxj2zxjbzg1PBG','u2f2Aw5N4OcM','BgvUz3rO','y29UzMLYBs1KzwXLDguTDgvHBq','Aw5Uzxjive1m','vgvHBsb1CgrHDgvK','CM9Szv9Pza','y2fUy2vSlwrLBgv0zs10zwfT','zgv0ywLSCW','DgvHBs1TB2rHBc10ywjZ','ywrKrxzLBNrmAxn0zw5LCG','DhjPBq','yMLUzgLUz3mTzw1WDhK','zxnJyxbLshrTBa','BwfUywDLCNm','ywrKlwjPBMrPBMCTyNrU','mta4wgXsyvPi','cIaGicaGidXKAxyGC3r5Bgu9iMrPC3bSyxK6igzSzxG7igfSAwDUlwL0zw1ZoIbJzw50zxi7igP1C3rPzNKTy29UDgvUDdOGC3bHy2uTyMv0D2vLBJSGCgfKzgLUzZOGmc4ZnxjLBsaWoYbIB3jKzxiTyM90Dg9ToIaXChGGC29SAwqGDMfYkc0Ty29SB3iTyM9YzgvYktSIpGOGicaGicaGidXZCgfUihn0EwXLpsjMB250lxnPEMu6idaUodC1CMvToYi+','ywrKlw1HBMfNzxiTC2vSzwn0','yMLUzgLUz3mTBgLZDc1JB250ywLUzxi','vgvHBsbKzwXLDgvK','yMLUzgLUz3mTBg9HzgLUzW','y29SB3i','mtu3ote2mKzmthLZva','y2XVC2uTDgvHBs1TB2rHBa','pg9WDgLVBIb2ywX1zt0I','jYKIpGOGicaGicaGicaGica','ywXS','DgvHBxm','pg9WDgLVBIb2ywX1zt0IiJ5bBgWGzw52AxjVBM1LBNrZigfSCMvHzhKGyM91BMq8l29WDgLVBJ4','pc90zd4kicaGicaGica8Dgq+','yMLUzgLUz3m','zgvZy3jPChrPB24','odyWotndBwPmyvq','DgvHBs1TB2rHBc1MB290zxi','C2f2zs10zwfT','DgfI','AgLKzgvU','C3vJy2vZCW','DgvHBs1KzxnJCMLWDgLVBG','y3jLyxrLlxrLyw0TyNrU','C2f2zs1IAw5KAw5Nlwj0BG','zgvSzxrLqMLUzgLUzW','ywrKlw1LBwjLCI1YB3C','y2XPy2S','re9nq29UDgvUDeXVywrLza','pg9WDgLVBIb2ywX1zt0IiJ5bzgqGysbTzw1IzxlIGky8l29WDgLVBJ4','ywn0AxzLvgfI','zMLUzeLUzgv4','DMfSDwu','ywrKlwjPBMrPBMCTzM9YBq','cIaGicaGidWVDgq+cIaGica8l3rYpG','qwrKiejPBMrPBMC','DgvHBs1JB3vUDa','y3vYCMvUDfvZzxi','pgrPDIbZDhLSzt0IzM9UDc1ZAxPLoIaWlJHLBtSGy29SB3i6ihzHCIGTlwnVBg9YlxrLEhqTC2vJB25Kyxj5ktSGBwfYz2LUlxrVCdOGmc4XnxjLBtSIpG','pgj1DhrVBIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lMrLBgv0zvrLyw0OjW','CxvLCNLtzwXLy3rVCKfSBa','mti4ntuXzLzYruXj','zMXLEa','z2v0vgvHBxm','Bg9JyxrPB24','AgfZ','BwvTyMvYCW','zgLZywjSzwq','jYKIpKvKAxq8l2j1DhrVBJ4','DgvHBs10ywiTzgv0ywLSCW','CM9Szxm','jYKIihn0EwXLpsjJB2XVCJOGDMfYkc0Ty29SB3iTzgfUz2vYktSGCgfKzgLUzZOGmc4XnxjLBsaWlJrYzw07igzVBNqTC2L6ztOGmc44CMvToYi+uMvTB3zLpc9IDxr0B24+','ywrKlw1LBwjLCI1IDg4','BwvTyMvYCY1Zzwn0Aw9U','yMLUzgLUzY1YB2XL','q3jLyxrLifrLyw0','DgvHBs1TB2rHBc10AxrSzq','rMfPBgvKihrVigXVywqGyMLUzgLUz3m6ia','CMv0CNKTDgvHBxmTyNrU','pc90zd4kicaGicaGphrKpGOGicaGicaGia','cIaGicaGicaGica8l2rPDJ4kicaGicaGica8l3rKpGOGicaGica8l3rYpG','zgvSzxrLlxrLyw0TBw9KywW','zwrPDgLUz1rLyw1jza','mta1mdq1mgfszwDfwq','y3jLyxrLvgvHBq','y2fUy2vSlwjPBMrPBMCTyNrU','zgf0yxnLDa','DxbKyxrLvgvHBq','DgvHBujPBMrPBMDZ','BwfUywDLCL9Uyw1LCW'];_0x1023=function(){return _0x573cc4;};return _0x1023();}function setActiveTabButton(_0x40b4fe){const _0x5c948d=_0x225786;document[_0x5c948d(0x1bd)](_0x5c948d(0x1dd))[_0x5c948d(0x163)](_0x4993fc=>{const _0x4afaa9=_0x5c948d,_0x46fcd8=_0x4993fc['dataset'][_0x4afaa9(0x1a8)]===_0x40b4fe;_0x4993fc[_0x4afaa9(0x166)]['borderBottomColor']=_0x46fcd8?_0x4afaa9(0x1fa):'transparent',_0x4993fc[_0x4afaa9(0x166)][_0x4afaa9(0x19a)]=_0x46fcd8?'var(--color-primary)':_0x4afaa9(0x183),_0x4993fc[_0x4afaa9(0x166)][_0x4afaa9(0x1f9)]=_0x46fcd8?_0x4afaa9(0x17b):_0x4afaa9(0x16e);});}function showTab(_0x422037){const _0x47160a=_0x225786;document[_0x47160a(0x1f3)](_0x47160a(0x1c6))[_0x47160a(0x1a9)]=_0x422037!==_0x47160a(0x18c),document[_0x47160a(0x1f3)](_0x47160a(0x1e8))[_0x47160a(0x1a9)]=_0x422037!==_0x47160a(0x1a3),document['getElementById'](_0x47160a(0x1a6))['hidden']=_0x422037===_0x47160a(0x1a3);}function renderMembersList(_0x416391){const _0x4d3302=_0x225786,_0x5ae51f=state[_0x4d3302(0x1ba)]?.['isServerAdmin'],_0x549d59=(_0x416391[_0x4d3302(0x192)]||[])[_0x4d3302(0x1fd)](state[_0x4d3302(0x1ba)]?.['id']),_0x5b3ced=_0x5ae51f||_0x549d59,_0x3a76c3=_0x416391['members']||[],_0x47c1b1=document['getElementById'](_0x4d3302(0x180));if(_0x3a76c3[_0x4d3302(0x186)]===0x0){_0x47c1b1[_0x4d3302(0x188)]=_0x4d3302(0x167);return;}_0x47c1b1[_0x4d3302(0x188)]=_0x3a76c3['map'](_0x1f0e73=>{const _0x1b6346=_0x4d3302,_0x3da4d4=state[_0x1b6346(0x15e)][_0x1b6346(0x1ff)](_0xa1c55f=>_0xa1c55f['id']===_0x1f0e73),_0xd4617d=_0x3da4d4?''+Utils[_0x1b6346(0x191)](_0x3da4d4[_0x1b6346(0x1e4)])+(_0x3da4d4[_0x1b6346(0x15f)]?_0x1b6346(0x182)+Utils[_0x1b6346(0x191)](_0x3da4d4['name'])+_0x1b6346(0x1f4):''):Utils['escapeHtml'](_0x1f0e73),_0x5c10aa=(_0x416391['managers']||[])[_0x1b6346(0x1fd)](_0x1f0e73);return _0x1b6346(0x1ea)+_0xd4617d+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x5c10aa?'<span\x20class=\x22tag\x22\x20style=\x22margin-left:\x200.4rem;\x20font-size:\x200.7em;\x20padding:\x200.1em\x200.4em;\x22>manager</span>':'')+_0x1b6346(0x17a)+(_0x5b3ced?'<button\x20type=\x22button\x22\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.removeMemberClick(\x27'+_0x1f0e73+_0x1b6346(0x1c8):'')+_0x1b6346(0x158);})[_0x4d3302(0x1e5)]('');const _0xed3042=document[_0x4d3302(0x1f3)](_0x4d3302(0x1af));if(_0xed3042)_0xed3042[_0x4d3302(0x166)][_0x4d3302(0x1f6)]=_0x5b3ced?_0x4d3302(0x1bf):'none';}function renderManagersList(_0x3281f1){const _0x3b316e=_0x225786,_0x587da4=_0x3281f1[_0x3b316e(0x192)]||[],_0x328e8e=document['getElementById'](_0x3b316e(0x1f8));if(_0x587da4[_0x3b316e(0x186)]===0x0){_0x328e8e['innerHTML']='<p\x20style=\x22font-size:\x200.875rem;\x20color:\x20var(--color-text-secondary);\x20margin:\x200.25rem\x200;\x22>No\x20managers</p>';return;}_0x328e8e[_0x3b316e(0x188)]=_0x587da4[_0x3b316e(0x16c)](_0x4103df=>{const _0x2bc1a5=_0x3b316e,_0x451d9e=state[_0x2bc1a5(0x15e)][_0x2bc1a5(0x1ff)](_0x456f3c=>_0x456f3c['id']===_0x4103df),_0x4fb9fa=_0x451d9e?Utils[_0x2bc1a5(0x191)](_0x451d9e[_0x2bc1a5(0x1e4)]):Utils[_0x2bc1a5(0x191)](_0x4103df);return _0x2bc1a5(0x195)+_0x4fb9fa+_0x2bc1a5(0x173)+_0x4103df+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x20padding:\x200.15rem\x200.4rem;\x20font-size:\x200.8rem;\x22>Remove</button>\x0a\x20\x20\x20\x20\x20\x20</div>';})[_0x3b316e(0x1e5)]('');}function updateMemberSelect(_0x4995cb){const _0x187461=_0x225786,_0x4e5dce=document['getElementById'](_0x187461(0x162));if(!_0x4e5dce)return;const _0x170ddf=new Set(_0x4995cb['members']||[]),_0x482293=state['users'][_0x187461(0x179)](_0x3f2406=>!_0x170ddf[_0x187461(0x1c2)](_0x3f2406['id']));_0x4e5dce[_0x187461(0x188)]=_0x187461(0x1b2)+_0x482293[_0x187461(0x16c)](_0x623ea2=>'<option\x20value=\x22'+_0x623ea2['id']+'\x22>'+Utils[_0x187461(0x191)](_0x623ea2[_0x187461(0x1e4)])+(_0x623ea2[_0x187461(0x15f)]?'\x20('+Utils[_0x187461(0x191)](_0x623ea2[_0x187461(0x15f)])+')':'')+'</option>')['join']('');}function updateManagerSelect(_0x262afb){const _0x40c53a=_0x225786,_0x1d2f40=document[_0x40c53a(0x1f3)]('add-manager-select');if(!_0x1d2f40)return;const _0x4cc36c=new Set(_0x262afb[_0x40c53a(0x192)]||[]),_0x377efe=(_0x262afb[_0x40c53a(0x1c3)]||[])[_0x40c53a(0x179)](_0x48e1bb=>!_0x4cc36c[_0x40c53a(0x1c2)](_0x48e1bb))[_0x40c53a(0x16c)](_0x40d149=>state[_0x40c53a(0x15e)][_0x40c53a(0x1ff)](_0x15c387=>_0x15c387['id']===_0x40d149))['filter'](Boolean);_0x1d2f40[_0x40c53a(0x188)]=_0x40c53a(0x170)+_0x377efe[_0x40c53a(0x16c)](_0x58b6d8=>_0x40c53a(0x19d)+_0x58b6d8['id']+'\x22>'+Utils['escapeHtml'](_0x58b6d8[_0x40c53a(0x1e4)])+'</option>')['join']('');}async function addMember(){const _0x541199=_0x225786,_0x1b5345=document[_0x541199(0x1f3)](_0x541199(0x162)),_0x40f7d5=_0x1b5345[_0x541199(0x1b5)];if(!_0x40f7d5||!state['editingTeamId'])return;try{const {team:_0x16c6a8}=await API['addTeamMember'](state[_0x541199(0x1d3)],_0x40f7d5);syncTeamInState(_0x16c6a8),renderMembersList(_0x16c6a8),updateMemberSelect(_0x16c6a8),state[_0x541199(0x1ba)]?.['isServerAdmin']&&(renderManagersList(_0x16c6a8),updateManagerSelect(_0x16c6a8)),_0x1b5345[_0x541199(0x1b5)]='',Utils[_0x541199(0x1f5)]('Member\x20added',_0x541199(0x1aa));}catch(_0x126c0d){Utils['showToast'](_0x126c0d[_0x541199(0x1e3)],_0x541199(0x17d));}}async function addManager(){const _0x4742f2=_0x225786,_0x36f3ac=document[_0x4742f2(0x1f3)](_0x4742f2(0x196)),_0x384e4f=_0x36f3ac[_0x4742f2(0x1b5)];if(!_0x384e4f||!state[_0x4742f2(0x1d3)])return;try{const {team:_0x2c092a}=await API[_0x4742f2(0x171)](state[_0x4742f2(0x1d3)],_0x384e4f);syncTeamInState(_0x2c092a),renderMembersList(_0x2c092a),renderManagersList(_0x2c092a),updateManagerSelect(_0x2c092a),_0x36f3ac[_0x4742f2(0x1b5)]='',Utils[_0x4742f2(0x1f5)]('Manager\x20added','success');}catch(_0x229eab){Utils[_0x4742f2(0x1f5)](_0x229eab[_0x4742f2(0x1e3)],_0x4742f2(0x17d));}}window[_0x225786(0x156)]=async function(_0x154d74){const _0x23a851=_0x225786;if(!state['editingTeamId'])return;try{const {team:_0x58d15a}=await API[_0x23a851(0x174)](state[_0x23a851(0x1d3)],_0x154d74);syncTeamInState(_0x58d15a),renderMembersList(_0x58d15a),updateMemberSelect(_0x58d15a),state[_0x23a851(0x1ba)]?.[_0x23a851(0x184)]&&(renderManagersList(_0x58d15a),updateManagerSelect(_0x58d15a)),Utils[_0x23a851(0x1f5)]('Member\x20removed',_0x23a851(0x1aa));}catch(_0x14eff6){Utils[_0x23a851(0x1f5)](_0x14eff6[_0x23a851(0x1e3)],_0x23a851(0x17d));}},window[_0x225786(0x165)]=async function(_0x5953a4){const _0x5b313c=_0x225786;if(!state['editingTeamId'])return;try{const {team:_0x29caa1}=await API['removeTeamManager'](state['editingTeamId'],_0x5953a4);syncTeamInState(_0x29caa1),renderManagersList(_0x29caa1),updateManagerSelect(_0x29caa1),Utils[_0x5b313c(0x1f5)](_0x5b313c(0x159),'success');}catch(_0xaee163){Utils[_0x5b313c(0x1f5)](_0xaee163[_0x5b313c(0x1e3)],_0x5b313c(0x17d));}};async function loadTeamBindings(_0x2472db){const _0x6bf9b5=_0x225786,_0x5aeff8=document[_0x6bf9b5(0x1f3)](_0x6bf9b5(0x199)),_0x442b48=document[_0x6bf9b5(0x1f3)](_0x6bf9b5(0x190)),_0x444706=document[_0x6bf9b5(0x1f3)](_0x6bf9b5(0x197)),_0x2fa419=document[_0x6bf9b5(0x1f3)]('add-binding-btn');_0x5aeff8[_0x6bf9b5(0x1a9)]=![],_0x442b48[_0x6bf9b5(0x1a9)]=!![],_0x444706['style'][_0x6bf9b5(0x1f6)]='none',_0x2fa419[_0x6bf9b5(0x1a9)]=!![],document[_0x6bf9b5(0x1f3)]('add-binding-form')[_0x6bf9b5(0x1a9)]=!![];try{const {bindings:_0xcb1a1e}=await API[_0x6bf9b5(0x15a)]({'subject_type':_0x6bf9b5(0x1ec),'subject_id':_0x2472db});state['teamBindings']=_0xcb1a1e||[],_0x5aeff8[_0x6bf9b5(0x1a9)]=!![],state[_0x6bf9b5(0x1d9)]['length']===0x0?_0x442b48['hidden']=![]:(_0x444706[_0x6bf9b5(0x166)][_0x6bf9b5(0x1f6)]='',renderBindingsTable()),state['currentUser']?.[_0x6bf9b5(0x184)]&&(_0x2fa419[_0x6bf9b5(0x1a9)]=![]);}catch(_0x43da15){_0x5aeff8[_0x6bf9b5(0x1a9)]=!![],Utils[_0x6bf9b5(0x1f5)](_0x6bf9b5(0x1ce)+_0x43da15[_0x6bf9b5(0x1e3)],_0x6bf9b5(0x17d));}}function renderBindingsTable(){const _0xdf9fe3=_0x225786,_0x5eab52=document[_0xdf9fe3(0x1f3)]('bindings-table-body');if(!_0x5eab52)return;const _0x49dcec=state[_0xdf9fe3(0x1ba)]?.[_0xdf9fe3(0x184)];_0x5eab52[_0xdf9fe3(0x188)]=state[_0xdf9fe3(0x1d9)][_0xdf9fe3(0x16c)](_0x51ebce=>_0xdf9fe3(0x1f2)+Utils[_0xdf9fe3(0x191)](_0x51ebce[_0xdf9fe3(0x178)])+_0xdf9fe3(0x175)+Utils[_0xdf9fe3(0x191)](_0x51ebce[_0xdf9fe3(0x176)]||_0x51ebce[_0xdf9fe3(0x18a)])+_0xdf9fe3(0x1d0)+(_0x49dcec?_0xdf9fe3(0x1e9)+_0x51ebce['id']+_0xdf9fe3(0x16b):'—')+_0xdf9fe3(0x1b7))[_0xdf9fe3(0x1e5)]('');}function populateBindingForm(){const _0x285cc9=_0x225786,_0x399386=document['getElementById'](_0x285cc9(0x1de)),_0x54ce8c=document[_0x285cc9(0x1f3)](_0x285cc9(0x1cb)),_0xec4e09=new Set(state[_0x285cc9(0x1d9)]['map'](_0x21239a=>_0x21239a['environment'])),_0x51deb9=state[_0x285cc9(0x1e1)][_0x285cc9(0x179)](_0x2d0dc6=>!_0xec4e09[_0x285cc9(0x1c2)](_0x2d0dc6[_0x285cc9(0x15f)]));_0x399386['innerHTML']=_0x51deb9[_0x285cc9(0x186)]?_0x51deb9[_0x285cc9(0x16c)](_0x533a1f=>_0x285cc9(0x19d)+Utils[_0x285cc9(0x191)](_0x533a1f[_0x285cc9(0x15f)])+'\x22>'+Utils['escapeHtml'](_0x533a1f[_0x285cc9(0x15f)])+_0x285cc9(0x1f1))['join'](''):_0x285cc9(0x1a1),_0x54ce8c[_0x285cc9(0x188)]=state[_0x285cc9(0x1c7)]['map'](_0x38540a=>_0x285cc9(0x19d)+_0x38540a['id']+'\x22>'+Utils[_0x285cc9(0x191)](_0x38540a[_0x285cc9(0x15f)])+_0x285cc9(0x1f1))[_0x285cc9(0x1e5)]('');}async function saveBinding(){const _0x3884e8=_0x225786,_0x29a3ca=document[_0x3884e8(0x1f3)]('binding-environment')[_0x3884e8(0x1b5)],_0x2ec34f=document[_0x3884e8(0x1f3)](_0x3884e8(0x1cb))[_0x3884e8(0x1b5)];if(!_0x29a3ca||!_0x2ec34f||!state[_0x3884e8(0x1d3)])return;const _0x2b6982=document[_0x3884e8(0x1f3)]('save-binding-btn');_0x2b6982['disabled']=!![],_0x2b6982[_0x3884e8(0x157)]=_0x3884e8(0x1f7);try{await API['createBinding']({'subject_type':_0x3884e8(0x1ec),'subject_id':state[_0x3884e8(0x1d3)],'role_id':_0x2ec34f,'environment':_0x29a3ca}),Utils['showToast']('Binding\x20added',_0x3884e8(0x1aa)),document[_0x3884e8(0x1f3)](_0x3884e8(0x1b6))['hidden']=!![],document[_0x3884e8(0x1f3)](_0x3884e8(0x193))[_0x3884e8(0x1a9)]=![],await loadTeamBindings(state[_0x3884e8(0x1d3)]);}catch(_0x43202d){Utils[_0x3884e8(0x1f5)](_0x43202d[_0x3884e8(0x1e3)],_0x3884e8(0x17d));}finally{_0x2b6982[_0x3884e8(0x1c4)]=![],_0x2b6982['textContent']=_0x3884e8(0x1b8);}}window['deleteBindingClick']=async function(_0x15cd31){const _0x375248=_0x225786;try{await API[_0x375248(0x1ae)](_0x15cd31),Utils['showToast'](_0x375248(0x17f),_0x375248(0x1aa)),await loadTeamBindings(state[_0x375248(0x1d3)]);}catch(_0x1eb3c9){Utils['showToast'](_0x1eb3c9[_0x375248(0x1e3)],'error');}};async function saveTeam(){const _0x250dc4=_0x225786,_0x4a4ff1=document['getElementById'](_0x250dc4(0x17e))['value'][_0x250dc4(0x18f)](),_0x17437b=document['getElementById'](_0x250dc4(0x1ab))[_0x250dc4(0x1b5)][_0x250dc4(0x18f)](),_0x1b7bf2=document[_0x250dc4(0x1f3)](_0x250dc4(0x16f)),_0x5c5d72=document[_0x250dc4(0x1f3)]('save-team');if(!_0x4a4ff1){_0x1b7bf2[_0x250dc4(0x157)]='Team\x20name\x20is\x20required',_0x1b7bf2[_0x250dc4(0x1a9)]=![];return;}_0x1b7bf2['hidden']=!![];const _0x30bb31=_0x5c5d72[_0x250dc4(0x157)];_0x5c5d72['disabled']=!![],_0x5c5d72[_0x250dc4(0x157)]=state['editingTeamId']?_0x250dc4(0x185):'Creating…';try{if(state[_0x250dc4(0x1d3)]){const {team:_0xc4fc5b}=await API[_0x250dc4(0x1d8)](state['editingTeamId'],{'name':_0x4a4ff1,'description':_0x17437b});syncTeamInState(_0xc4fc5b),document[_0x250dc4(0x1f3)]('team-modal-title')[_0x250dc4(0x157)]=_0xc4fc5b['name'],Utils[_0x250dc4(0x1f5)](_0x250dc4(0x189),_0x250dc4(0x1aa));}else await API[_0x250dc4(0x1d5)]({'name':_0x4a4ff1,'description':_0x17437b}),Utils['showToast'](_0x250dc4(0x155),_0x250dc4(0x1aa)),hideTeamModal(),await loadTeams();state[_0x250dc4(0x1d3)]&&(_0x5c5d72[_0x250dc4(0x1c4)]=![],_0x5c5d72[_0x250dc4(0x157)]=_0x30bb31);}catch(_0x59ea16){_0x1b7bf2['textContent']=_0x59ea16[_0x250dc4(0x1e3)],_0x1b7bf2[_0x250dc4(0x1a9)]=![],_0x5c5d72[_0x250dc4(0x1c4)]=![],_0x5c5d72[_0x250dc4(0x157)]=_0x30bb31;}}function _0x4873(_0x2d3078,_0x13276f){_0x2d3078=_0x2d3078-0x155;const _0x102384=_0x1023();let _0x48738c=_0x102384[_0x2d3078];if(_0x4873['bPcsPG']===undefined){var _0x4f7a6f=function(_0x181ec1){const _0xa84aa0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x543e0d='',_0x2e5be7='';for(let _0x800723=0x0,_0x56aefb,_0x4c7aab,_0x1ba675=0x0;_0x4c7aab=_0x181ec1['charAt'](_0x1ba675++);~_0x4c7aab&&(_0x56aefb=_0x800723%0x4?_0x56aefb*0x40+_0x4c7aab:_0x4c7aab,_0x800723++%0x4)?_0x543e0d+=String['fromCharCode'](0xff&_0x56aefb>>(-0x2*_0x800723&0x6)):0x0){_0x4c7aab=_0xa84aa0['indexOf'](_0x4c7aab);}for(let _0x55e7e3=0x0,_0x5a1495=_0x543e0d['length'];_0x55e7e3<_0x5a1495;_0x55e7e3++){_0x2e5be7+='%'+('00'+_0x543e0d['charCodeAt'](_0x55e7e3)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2e5be7);};_0x4873['qGmaXI']=_0x4f7a6f,_0x4873['XbeLFa']={},_0x4873['bPcsPG']=!![];}const _0x31dc7f=_0x102384[0x0],_0xdd5035=_0x2d3078+_0x31dc7f,_0x5e9827=_0x4873['XbeLFa'][_0xdd5035];return!_0x5e9827?(_0x48738c=_0x4873['qGmaXI'](_0x48738c),_0x4873['XbeLFa'][_0xdd5035]=_0x48738c):_0x48738c=_0x5e9827,_0x48738c;}window['deleteTeam']=function(_0x357492){const _0x39e321=_0x225786,_0x101682=state[_0x39e321(0x1a0)][_0x39e321(0x1ff)](_0x22dedc=>_0x22dedc['id']===_0x357492);if(!_0x101682)return;state['deletingTeamId']=_0x357492,document['getElementById'](_0x39e321(0x1eb))['textContent']=_0x101682[_0x39e321(0x15f)],document['getElementById'](_0x39e321(0x1d2))[_0x39e321(0x1a9)]=![];};function hideDeleteModal(){const _0x24be68=_0x225786;document[_0x24be68(0x1f3)](_0x24be68(0x1d2))['hidden']=!![],state[_0x24be68(0x1fc)]=null;}async function confirmDeleteTeam(){const _0x3bd597=_0x225786;if(!state[_0x3bd597(0x1fc)])return;const _0x16ba3f=document[_0x3bd597(0x1f3)](_0x3bd597(0x187));_0x16ba3f[_0x3bd597(0x1c4)]=!![],_0x16ba3f[_0x3bd597(0x157)]='Deleting…';try{await API[_0x3bd597(0x1e6)](state[_0x3bd597(0x1fc)]),Utils[_0x3bd597(0x1f5)](_0x3bd597(0x198),_0x3bd597(0x1aa)),hideDeleteModal(),await loadTeams();}catch(_0xae7eef){Utils[_0x3bd597(0x1f5)]('Failed\x20to\x20delete\x20team:\x20'+_0xae7eef['message'],'error'),_0x16ba3f[_0x3bd597(0x1c4)]=![],_0x16ba3f[_0x3bd597(0x157)]=_0x3bd597(0x1ee);}}function syncTeamInState(_0x1e7b62){const _0x210cfe=_0x225786,_0x2a1eba=state[_0x210cfe(0x1a0)][_0x210cfe(0x1b4)](_0x4552de=>_0x4552de['id']===_0x1e7b62['id']);if(_0x2a1eba>=0x0)state['teams'][_0x2a1eba]=_0x1e7b62;renderTeams();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x58d960=_0x12c4;(function(_0x590d86,_0x221a21){const _0x21af3b=_0x12c4,_0x372d20=_0x590d86();while(!![]){try{const _0x1d1314=-parseInt(_0x21af3b(0xa7))/0x1+-parseInt(_0x21af3b(0xd4))/0x2+-parseInt(_0x21af3b(0xb0))/0x3+parseInt(_0x21af3b(0x9e))/0x4*(parseInt(_0x21af3b(0xaf))/0x5)+-parseInt(_0x21af3b(0xc8))/0x6*(parseInt(_0x21af3b(0xbb))/0x7)+parseInt(_0x21af3b(0xd7))/0x8*(parseInt(_0x21af3b(0xda))/0x9)+parseInt(_0x21af3b(0xb7))/0xa*(parseInt(_0x21af3b(0xac))/0xb);if(_0x1d1314===_0x221a21)break;else _0x372d20['push'](_0x372d20['shift']());}catch(_0x8443a8){_0x372d20['push'](_0x372d20['shift']());}}}(_0x224a,0xc109c));import{API,Utils}from'./app.js';import{Terminal}from'https://cdn.jsdelivr.net/npm/xterm@5.3.0/+esm';import{FitAddon}from'https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/+esm';import{getCurrentTheme,initTheme,mountThemeToggle,onThemeChange}from'./theme.js';const params=Utils['getQueryParams'](),containerId=params[_0x58d960(0xcd)],command=(params[_0x58d960(0xdb)]||'')[_0x58d960(0xbc)](),useServerExec=params[_0x58d960(0xa3)]===_0x58d960(0x9a),titleEl=document[_0x58d960(0xd3)](_0x58d960(0x9f)),subtitleEl=document[_0x58d960(0xd3)](_0x58d960(0xdc)),statusEl=document[_0x58d960(0xd3)](_0x58d960(0xa8)),terminalEl=document['getElementById'](_0x58d960(0xa9)),closeBtn=document[_0x58d960(0xd3)](_0x58d960(0x95));initTheme(),mountThemeToggle({'targetSelectors':['.terminal-actions']});const getXtermTheme=()=>{const _0x3ab78c=_0x58d960;return{'background':_0x3ab78c(0xad),'foreground':_0x3ab78c(0xa6),'cursor':_0x3ab78c(0xa6),'cursorAccent':_0x3ab78c(0xad)};};function _0x12c4(_0x5502f4,_0x315227){_0x5502f4=_0x5502f4-0x8f;const _0x224a08=_0x224a();let _0x12c454=_0x224a08[_0x5502f4];if(_0x12c4['gZMzKf']===undefined){var _0x5046ef=function(_0x3852b2){const _0x4b235e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x9ad9f3='',_0x420c6e='';for(let _0x3382c9=0x0,_0x3fb6a3,_0xaec0ef,_0x454824=0x0;_0xaec0ef=_0x3852b2['charAt'](_0x454824++);~_0xaec0ef&&(_0x3fb6a3=_0x3382c9%0x4?_0x3fb6a3*0x40+_0xaec0ef:_0xaec0ef,_0x3382c9++%0x4)?_0x9ad9f3+=String['fromCharCode'](0xff&_0x3fb6a3>>(-0x2*_0x3382c9&0x6)):0x0){_0xaec0ef=_0x4b235e['indexOf'](_0xaec0ef);}for(let _0x3c0289=0x0,_0x3d50c7=_0x9ad9f3['length'];_0x3c0289<_0x3d50c7;_0x3c0289++){_0x420c6e+='%'+('00'+_0x9ad9f3['charCodeAt'](_0x3c0289)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x420c6e);};_0x12c4['VSsriI']=_0x5046ef,_0x12c4['rRDgsQ']={},_0x12c4['gZMzKf']=!![];}const _0x7009a=_0x224a08[0x0],_0x42f4c6=_0x5502f4+_0x7009a,_0x405429=_0x12c4['rRDgsQ'][_0x42f4c6];return!_0x405429?(_0x12c454=_0x12c4['VSsriI'](_0x12c454),_0x12c4['rRDgsQ'][_0x42f4c6]=_0x12c454):_0x12c454=_0x405429,_0x12c454;}closeBtn&&closeBtn[_0x58d960(0x98)]('click',()=>{const _0xd3335a=_0x58d960;window[_0xd3335a(0xb1)]();});if(!containerId){updateStatus(_0x58d960(0xba),'error');throw new Error(_0x58d960(0xcc));}document[_0x58d960(0x92)]=_0x58d960(0xe4)+containerId[_0x58d960(0xaa)](0x0,0xc),enrichContainerDetails(containerId)[_0x58d960(0xc5)](()=>{const _0x63d5b4=_0x58d960;subtitleEl[_0x63d5b4(0xbe)]=_0x63d5b4(0xa2)+containerId[_0x63d5b4(0xd2)](0x0,0xc);});const term=new Terminal({'convertEol':!![],'cursorBlink':!![],'fontFamily':'JetBrains\x20Mono,\x20SFMono-Regular,\x20Consolas,\x20monospace','fontSize':0x10,'theme':getXtermTheme()}),fitAddon=new FitAddon();term[_0x58d960(0xd6)](fitAddon),term[_0x58d960(0xdd)](terminalEl),term[_0x58d960(0xa5)]();let isFitting=![];const doFit=()=>{const _0x3fcd88=_0x58d960;if(isFitting)return;isFitting=!![],fitAddon[_0x3fcd88(0xb8)](),sendResize(),term['scrollToBottom'](),setTimeout(()=>{isFitting=![];},0x32);};window[_0x58d960(0x98)](_0x58d960(0xc1),()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});const resizeObserver=new ResizeObserver(()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});resizeObserver['observe'](terminalEl);const socketProtocol=window[_0x58d960(0xc0)]['protocol']===_0x58d960(0xca)?_0x58d960(0xa0):'ws',socketUrl=new URL(_0x58d960(0xb2)+encodeURIComponent(containerId),window[_0x58d960(0xc0)][_0x58d960(0xbd)]);function _0x224a(){const _0x3ecae0=['ndC3mZq2nwDUDgvAyq','ndq3otK5m1z0DuXZBq','y2XVC2u','l3DZl2nVBNrHAw5LCNmV','zgf0yq','CMvHC29U','BgvUz3rO','y29UDgfPBMvYswq','mtC1nZKWvLzQELPW','zML0','Aw5MBW','twLZC2LUzYbJB250ywLUzxiGAwrLBNrPzMLLCG','ndGWnte3ogjYEg1REa','DhjPBq','AhjLzG','Dgv4DenVBNrLBNq','q29UBMvJDgLVBIbJBg9Zzwq','Bg9JyxrPB24','CMvZAxPL','zxjYB3i','CM93CW','C3rHDhvZ','y2f0y2G','uNvUBMLUzZOG','y3jLyxrLzef0','nMDuwfPUqW','zgvMyxvSDefNzw50','Ahr0Chm6','imk3ienVBw1HBMqG','y29UDgfPBMvYihbHCMfTzxrLCIbPCYbYzxf1AxjLza','y29UDgfPBMvY','C2vUza','CgfYC2u','y29UBMvJDgvK','y29UDgfPBMvYCW','C3vIC3rYAw5N','z2v0rwXLBwvUDej5swq','mJu0nta5og5OB2X0rq','D2fZq2XLyw4','Bg9HzefKzg9U','ntzXv3PxCKu','ChjVDg9JB2W','z2v0q29UDgfPBMvY','mtmWodGYnuL1tuzmCq','y21K','DgvYBwLUywWTC3vIDgL0Bgu','B3bLBG','zMLUza','imk3ifn0yxj0zwqG','DMfYAwfUDa','zgf0yxnLDa','Dg9tDhjPBMC','BwvZC2fNzq','vgvYBwLUywWGWRCG','t1bftG','q29UBMvJDgLVBIbLCNjVCG','CMvHzhLtDgf0zq','DhLWzq','DgL0Bgu','zw52AxjVBM1LBNq','C3rHCNrZv2L0Aa','y2XVC2uTDgvYBwLUywW','rw52AxjVBM1LBNqGDw5RBM93BG','u2vZC2LVBIa','ywrKrxzLBNrmAxn0zw5LCG','uhjLCgfYAw5NoIa','Dhj1zq','C2vHCMnOugfYyw1Z','C3rYAw5NAwz5','C3vJy2vZCW','ngL1r3b4uG','DgvYBwLUywWTDgL0Bgu','D3nZ','vgvYBwLUywWGD2vIC29JA2v0igvYCM9Y','q29UDgfPBMvYia','C2vYDMvYx2v4zwm','z2v0q29UDgfPBMvYCW','zM9JDxm','i2uYztHMma','mti5ode4n3jbqKfytq','DgvYBwLUywWTC3rHDhvZ','DgvYBwLUywWTy29UDgfPBMvY','C2XPy2u','imk3iefNzw50ia','mJiZm0nNuKvlBq','iZbMmtCYyq','D3jPDgu'];_0x224a=function(){return _0x3ecae0;};return _0x224a();}command&&useServerExec&&socketUrl[_0x58d960(0x9b)]['set'](_0x58d960(0xdb),command);socketUrl[_0x58d960(0xd8)]=socketProtocol+':';const socket=new WebSocket(socketUrl[_0x58d960(0xe2)]());term['onData'](_0x9ad9f3=>{const _0x17b2c9=_0x58d960;socket[_0x17b2c9(0x90)]===WebSocket[_0x17b2c9(0xe5)]&&socket['send'](JSON['stringify']({'type':_0x17b2c9(0xb3),'data':_0x9ad9f3}));});let commandSent=![],hasReceivedOutput=![];socket['addEventListener'](_0x58d960(0xe3),_0x420c6e=>{const _0xf76893=_0x58d960;try{const _0x3382c9=JSON[_0xf76893(0xcf)](_0x420c6e[_0xf76893(0xb3)]);if(_0x3382c9[_0xf76893(0x91)]===_0xf76893(0xb3)&&typeof _0x3382c9[_0xf76893(0xb3)]==='string')term[_0xf76893(0xae)](_0x3382c9[_0xf76893(0xb3)]),!hasReceivedOutput&&_0x3382c9[_0xf76893(0xb3)][_0xf76893(0xb5)]>0x0&&(hasReceivedOutput=!![],command&&!useServerExec&&!commandSent&&(commandSent=!![],setTimeout(()=>{const _0xde5483=_0xf76893;socket[_0xde5483(0x90)]===WebSocket[_0xde5483(0xe5)]&&socket[_0xde5483(0xce)](JSON[_0xde5483(0x9c)]({'type':_0xde5483(0xb3),'data':command+'\x0d'}));},0xc8)));else{if(_0x3382c9[_0xf76893(0x91)]==='status'&&_0x3382c9['status']){if(_0x3382c9[_0xf76893(0xc4)]==='connected'){if(command&&useServerExec)updateStatus(_0xf76893(0xc6)+command,_0xf76893(0xb9));else command?updateStatus(_0xf76893(0x99)+command,_0xf76893(0xb9)):updateStatus('Terminal\x20connected','success');doFit(),term['focus'](),command&&!useServerExec&&!commandSent&&setTimeout(()=>{const _0x1e059b=_0xf76893;!commandSent&&socket['readyState']===WebSocket[_0x1e059b(0xe5)]&&(commandSent=!![],socket[_0x1e059b(0xce)](JSON[_0x1e059b(0x9c)]({'type':_0x1e059b(0xb3),'data':command+'\x0d'})),updateStatus('Running:\x20'+command,_0x1e059b(0xb9)));},0x7d0);}else updateStatus(_0xf76893(0x97)+_0x3382c9[_0xf76893(0xc4)],_0x3382c9[_0xf76893(0xc4)]===_0xf76893(0xd0)?_0xf76893(0x9d):_0xf76893(0xb9));}else _0x3382c9[_0xf76893(0x91)]===_0xf76893(0xc2)&&_0x3382c9[_0xf76893(0xe3)]&&updateStatus(_0x3382c9[_0xf76893(0xe3)],'error');}}catch(_0x3fb6a3){console[_0xf76893(0xc2)]('Failed\x20to\x20parse\x20terminal\x20message',_0x3fb6a3);}}),socket['addEventListener']('close',_0xaec0ef=>{const _0x1677fc=_0x58d960,_0x454824=_0xaec0ef[_0x1677fc(0xb4)]||_0x1677fc(0xbf);updateStatus(_0x454824,_0xaec0ef[_0x1677fc(0xd5)]?_0x1677fc(0xb9):_0x1677fc(0xc2));}),socket[_0x58d960(0x98)](_0x58d960(0xc2),_0x3c0289=>{const _0x1638ff=_0x58d960;console['error'](_0x1638ff(0xa1),_0x3c0289),updateStatus(_0x1638ff(0x8f),_0x1638ff(0xc2));});function sendResize(){const _0x3578eb=_0x58d960;if(socket['readyState']!==WebSocket['OPEN'])return;const _0x3d50c7=term['cols'],_0x1aa043=term[_0x3578eb(0xc3)];socket['send'](JSON['stringify']({'type':_0x3578eb(0xc1),'cols':_0x3d50c7,'rows':_0x1aa043}));}function updateStatus(_0x208c8c,_0xac5616=_0x58d960(0xb9)){const _0x2cda64=_0x58d960;if(!statusEl)return;statusEl[_0x2cda64(0xbe)]=_0x208c8c,statusEl[_0x2cda64(0xe1)][_0x2cda64(0xe0)]=_0xac5616;}async function enrichContainerDetails(_0x2a7672){const _0x8657a4=_0x58d960;try{const _0x4a3525=await API[_0x8657a4(0xd9)](_0x2a7672);updateTerminalDetails(_0x4a3525);}catch{try{const _0x2fd12a=await API[_0x8657a4(0xa4)](),_0x18dca8=(_0x2fd12a[_0x8657a4(0xd1)]||[])[_0x8657a4(0xde)](_0x5621e5=>_0x5621e5[_0x8657a4(0xb6)]===_0x2a7672||_0x5621e5['name']===_0x2a7672||_0x5621e5['fullContainerId']?.[_0x8657a4(0x94)](_0x2a7672));if(_0x18dca8){updateTerminalDetails(_0x18dca8);return;}subtitleEl[_0x8657a4(0xbe)]=_0x8657a4(0xa2)+_0x2a7672['substring'](0x0,0xc);}catch{subtitleEl[_0x8657a4(0xbe)]='Container\x20'+_0x2a7672[_0x8657a4(0xd2)](0x0,0xc);}}}function updateTerminalDetails(_0x43ddd1){const _0x780b4b=_0x58d960,_0x21cfd3=_0x43ddd1['containerId']||_0x43ddd1['name']||_0x43ddd1['fullContainerId']||containerId,_0x313f51=_0x43ddd1['environment']?'Environment\x20'+_0x43ddd1[_0x780b4b(0x93)]:_0x780b4b(0x96),_0x42dadb=_0x43ddd1[_0x780b4b(0xc9)]?_0x780b4b(0xab)+_0x43ddd1[_0x780b4b(0xc9)]:'',_0x250e72=_0x43ddd1[_0x780b4b(0xc7)]?_0x780b4b(0xdf)+Utils['formatRelativeTime'](_0x43ddd1[_0x780b4b(0xc7)]):'';titleEl[_0x780b4b(0xbe)]=_0x780b4b(0xe4)+_0x21cfd3['substring'](0x0,0xc);const _0x592ecc=command?_0x780b4b(0xcb)+command:'';subtitleEl[_0x780b4b(0xbe)]=''+_0x313f51+_0x42dadb+_0x250e72+_0x592ecc;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x112387=_0x42be;(function(_0x45d29d,_0x56ad24){const _0x2c955c=_0x42be,_0x14929c=_0x45d29d();while(!![]){try{const _0x5ab9c5=parseInt(_0x2c955c(0x1ee))/0x1+-parseInt(_0x2c955c(0x22a))/0x2*(-parseInt(_0x2c955c(0x214))/0x3)+-parseInt(_0x2c955c(0x203))/0x4*(-parseInt(_0x2c955c(0x224))/0x5)+-parseInt(_0x2c955c(0x201))/0x6*(-parseInt(_0x2c955c(0x22c))/0x7)+parseInt(_0x2c955c(0x1fc))/0x8+-parseInt(_0x2c955c(0x20b))/0x9*(parseInt(_0x2c955c(0x208))/0xa)+parseInt(_0x2c955c(0x21e))/0xb*(-parseInt(_0x2c955c(0x1fb))/0xc);if(_0x5ab9c5===_0x56ad24)break;else _0x14929c['push'](_0x14929c['shift']());}catch(_0x2fe162){_0x14929c['push'](_0x14929c['shift']());}}}(_0x3082,0xc1bc4));function _0x42be(_0x12b8c0,_0x56bd85){_0x12b8c0=_0x12b8c0-0x1ec;const _0x30828a=_0x3082();let _0x42be61=_0x30828a[_0x12b8c0];if(_0x42be['uYCCFF']===undefined){var _0x576e12=function(_0x5f0c80){const _0x124591='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x223108='',_0x1e1c71='';for(let _0x38ab0f=0x0,_0x16d36a,_0x3860c7,_0x1393e7=0x0;_0x3860c7=_0x5f0c80['charAt'](_0x1393e7++);~_0x3860c7&&(_0x16d36a=_0x38ab0f%0x4?_0x16d36a*0x40+_0x3860c7:_0x3860c7,_0x38ab0f++%0x4)?_0x223108+=String['fromCharCode'](0xff&_0x16d36a>>(-0x2*_0x38ab0f&0x6)):0x0){_0x3860c7=_0x124591['indexOf'](_0x3860c7);}for(let _0x2fd3ff=0x0,_0x2cbce2=_0x223108['length'];_0x2fd3ff<_0x2cbce2;_0x2fd3ff++){_0x1e1c71+='%'+('00'+_0x223108['charCodeAt'](_0x2fd3ff)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1e1c71);};_0x42be['JgCJYs']=_0x576e12,_0x42be['mKmyxh']={},_0x42be['uYCCFF']=!![];}const _0x184b47=_0x30828a[0x0],_0x48e03e=_0x12b8c0+_0x184b47,_0x4ed824=_0x42be['mKmyxh'][_0x48e03e];return!_0x4ed824?(_0x42be61=_0x42be['JgCJYs'](_0x42be61),_0x42be['mKmyxh'][_0x48e03e]=_0x42be61):_0x42be61=_0x4ed824,_0x42be61;}const THEME_STORAGE_KEY=_0x112387(0x210),THEME_CHANGE_EVENT=_0x112387(0x21d),VALID_THEMES=new Set([_0x112387(0x1ff),_0x112387(0x1fa)]),DEFAULT_TARGET_SELECTORS=[_0x112387(0x212),_0x112387(0x1f8),_0x112387(0x1f6),_0x112387(0x229),_0x112387(0x1f2)];function readStoredTheme(){const _0x432932=_0x112387;try{const _0x223108=localStorage[_0x432932(0x20c)](THEME_STORAGE_KEY);if(_0x223108&&VALID_THEMES[_0x432932(0x209)](_0x223108))return _0x223108;}catch(_0x1e1c71){console['warn'](_0x432932(0x202),_0x1e1c71);}return null;}export function getPreferredTheme(){const _0x50a52b=_0x112387,_0x38ab0f=readStoredTheme();if(_0x38ab0f)return _0x38ab0f;const _0x16d36a=window['matchMedia']&&window['matchMedia']('(prefers-color-scheme:\x20dark)')[_0x50a52b(0x1f7)];return _0x16d36a?_0x50a52b(0x1fa):_0x50a52b(0x1ff);}export function getCurrentTheme(){const _0x51ff9a=_0x112387,_0x3860c7=document[_0x51ff9a(0x1ed)][_0x51ff9a(0x211)][_0x51ff9a(0x200)];if(_0x3860c7&&VALID_THEMES[_0x51ff9a(0x209)](_0x3860c7))return _0x3860c7;return getPreferredTheme();}function _0x3082(){const _0x6b63a9=['BgLNAhq','DgHLBwu','mtHwwuzKu08','w1rOzw1LxsbgywLSzwqGDg8GCMvHzcbZDg9YzwqGDgHLBwuGChjLzMvYzw5JztO','mZiZntC5nMT3CNP3vq','zgv0ywLS','BwfW','mZzWEa','DgL0Bgu','mJi5nta2mhbLufvMCG','AgfZ','CxvLCNLtzwXLy3rVCG','mZz1BNPdzfa','z2v0sxrLBq','ywrKrxzLBNrmAxn0zw5LCG','y2XHC3nmAxn0','ohb4','ChjVzM91BMqTy29KzxiTDgHLBwu','zgf0yxnLDa','i3rOzw1LlxrVz2DSzs1JB250ywLUzxi','yNrUlwDOB3n0ihrOzw1LlxrVz2DSzs1IDg4','m1jrDfb0Eq','zMfSC2u','ywrK','y2XHC3noyw1L','yxjPys1WCMvZC2vK','D2fYBG','ywXPz25jDgvTCW','w1rOzw1LxsbgywLSzwqGDg8GCgvYC2LZDcb0AgvTzsbWCMvMzxjLBMnLoG','DhLWzq','ChjVzM91BMqTDgHLBwuTy2HHBMDL','mtmXodu0ntHzD2nkDe0','y29SB3jty2HLBwu','zMLUza','BgLUzuHLAwDODa','y2vUDgvY','yNv0Dg9U','nxDdtKvVEa','zMXLEa','phn2zYb4BwXUCZ0IAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCIihDPzhrOpsiYmciGAgvPz2H0psiYmciGDMLLD0jVEd0ImcaWidi0idi0iIbMAwXSpsjUB25LiIbZDhjVA2u9iMn1CNjLBNrdB2XVCIiGC3rYB2TLlxDPzhrOpsiYiIbZDhjVA2uTBgLUzwnHCd0ICM91BMqIihn0CM9Rzs1SAw5LAM9PBJ0ICM91BMqIpJXJAxjJBguGy3G9iJeYiIbJEt0ImtiIihi9iJuIpJWVy2LYy2XLpJXSAw5LihGXpsiXmIiGEte9iJeIihGYpsiXmIiGEti9iJmIpJWVBgLUzt48BgLUzsb4mt0ImtiIihKXpsiYmsiGEdi9iJeYiIb5mJ0ImJmIpJWVBgLUzt48BgLUzsb4mt0Inc4YmIiGEte9iJqUmJiIihGYpsi1lJy0iIb5mJ0Ins42nci+pc9SAw5LpJXSAw5LihGXpsiXoc4ZnIiGEte9iJe4lJm2iIb4mJ0ImtKUnZGIihKYpsiXos43oci+pc9SAw5LpJXSAw5LihGXpsiXiIb5mt0ImtiIihGYpsiZiIb5mJ0ImtiIpJWVBgLUzt48BgLUzsb4mt0ImJeIihKXpsiXmIiGEdi9iJiZiIb5mJ0ImtiIpJWVBgLUzt48BgLUzsb4mt0Inc4YmIiGEte9iJe5lJC4iIb4mJ0Ins42nciGEti9iJe4lJm2iJ48l2XPBMu+pgXPBMuGEde9iJe4lJm2iIb5mt0Ins42nciGEdi9iJe5lJC4iIb5mJ0Inc4YmIi+pc9SAw5LpJWVC3zNpG','C2v0sxrLBq','zgLZCgf0y2HfDMvUDa','lNrLCM1PBMfSlwfJDgLVBNm','mJGYndCXoerAsLLIrG','u3DPDgnOihrVigXPz2H0ig1Vzgu','mJq1ndK0ovrvBLrUDa','u3DPDgnOihrVigrHCMSGBw9Kzq','yxbWzw5Kq2HPBgq','C3bHBG','y3jLyxrLrwXLBwvUDa','zgLZCgXHEq','C2v0qxr0CMLIDxrL','zg9JDw1LBNrfBgvTzw50','mti3mZGZou93wwrctW','DgHLBwuTDg9Nz2XLlwzSB2f0Aw5N','yxbWzw5K','AgvPz2H0','lNrVCc1Iyxi','C3r5Bgu','DgHLBwuTDg9Nz2XLlwj0BG','yM9KEq','lNn0yxr1CY1Hy3rPB25Z','Bwf0y2HLCW','lMHLywrLCI1Hy3rPB25Z','CMvTB3zLrxzLBNrmAxn0zw5LCG','zgfYAW','mZzAreDMvuy','nJa4mJy0meHmsxLyCG','DgHLBwuTAwnVBG','CgfKzgLUzW'];_0x3082=function(){return _0x6b63a9;};return _0x3082();}export function applyTheme(_0x1393e7,{persist:persist=!![],emitEvent:emitEvent=!![]}={}){const _0x271598=_0x112387,_0x2fd3ff=VALID_THEMES[_0x271598(0x209)](_0x1393e7)?_0x1393e7:_0x271598(0x1ff);document[_0x271598(0x1ed)]['dataset']['theme']=_0x2fd3ff,document[_0x271598(0x1ed)][_0x271598(0x1f3)][_0x271598(0x21f)]=_0x2fd3ff===_0x271598(0x1fa)?_0x271598(0x1fa):_0x271598(0x1ff);if(persist)try{localStorage[_0x271598(0x227)](THEME_STORAGE_KEY,_0x2fd3ff);}catch(_0x2cbce2){console[_0x271598(0x219)](_0x271598(0x21b),_0x2cbce2);}return emitEvent&&window[_0x271598(0x228)](new CustomEvent(THEME_CHANGE_EVENT,{'detail':{'theme':_0x2fd3ff}})),_0x2fd3ff;}export function initTheme(_0x402a65={}){const {emitEvent:emitEvent=![]}=_0x402a65;return applyTheme(getPreferredTheme(),{'persist':![],'emitEvent':emitEvent});}export function toggleTheme(){const _0x3ff8c6=_0x112387,_0x2d8a15=getCurrentTheme()===_0x3ff8c6(0x1fa)?_0x3ff8c6(0x1ff):_0x3ff8c6(0x1fa);return applyTheme(_0x2d8a15);}export function onThemeChange(_0x1fd6b2,{runImmediately:runImmediately=![]}={}){const _0x5ccfae=_0x112387,_0x52958e=_0x5519a0=>{const _0x287986=_0x42be;_0x1fd6b2(_0x5519a0[_0x287986(0x204)]['theme']);};return window[_0x5ccfae(0x20d)](THEME_CHANGE_EVENT,_0x52958e),runImmediately&&_0x1fd6b2(getCurrentTheme()),()=>window[_0x5ccfae(0x1f9)](THEME_CHANGE_EVENT,_0x52958e);}export function mountThemeToggle(_0xc13c20={}){const _0x2c2ebc=_0x112387,{targetSelectors:targetSelectors=DEFAULT_TARGET_SELECTORS}=_0xc13c20,_0x21e634=targetSelectors[_0x2c2ebc(0x205)](_0x534ec0=>document[_0x2c2ebc(0x20a)](_0x534ec0))[_0x2c2ebc(0x220)](Boolean),_0x3bb14e=document['createElement'](_0x2c2ebc(0x223));_0x3bb14e[_0x2c2ebc(0x21c)]='button',_0x3bb14e[_0x2c2ebc(0x217)]=_0x2c2ebc(0x213),_0x3bb14e['id']=_0x2c2ebc(0x1f4),_0x3bb14e['setAttribute'](_0x2c2ebc(0x218),_0x2c2ebc(0x215)),_0x3bb14e[_0x2c2ebc(0x1f3)][_0x2c2ebc(0x1fe)]=_0x2c2ebc(0x20f),_0x3bb14e[_0x2c2ebc(0x1f3)][_0x2c2ebc(0x221)]='0',_0x3bb14e['style']['width']=_0x2c2ebc(0x206),_0x3bb14e[_0x2c2ebc(0x1f3)][_0x2c2ebc(0x1f1)]=_0x2c2ebc(0x206),_0x3bb14e['style'][_0x2c2ebc(0x231)]=_0x2c2ebc(0x225),_0x3bb14e['style'][_0x2c2ebc(0x21a)]=_0x2c2ebc(0x222),_0x3bb14e['style']['justifyContent']=_0x2c2ebc(0x222);const _0x403c91=document[_0x2c2ebc(0x230)](_0x2c2ebc(0x22f));_0x403c91[_0x2c2ebc(0x217)]=_0x2c2ebc(0x1fd),_0x403c91[_0x2c2ebc(0x1f3)]['display']=_0x2c2ebc(0x225),_0x3bb14e[_0x2c2ebc(0x1f0)](_0x403c91);const _0x43c1ac='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22><path\x20d=\x22M21\x2012.79A9\x209\x200\x201\x201\x2011.21\x203\x207\x207\x200\x200\x200\x2021\x2012.79z\x22></path></svg>',_0x56e68a=_0x2c2ebc(0x226),_0xdbf3f4=_0x46c6ea=>{const _0x24b9bc=_0x2c2ebc,_0x426905=_0x46c6ea==='dark';_0x403c91['innerHTML']=_0x426905?_0x43c1ac:_0x56e68a,_0x3bb14e[_0x24b9bc(0x207)]=_0x426905?_0x24b9bc(0x22b):_0x24b9bc(0x22d),_0x3bb14e[_0x24b9bc(0x211)][_0x24b9bc(0x200)]=_0x46c6ea,_0x3bb14e[_0x24b9bc(0x1ec)](_0x24b9bc(0x218),String(_0x426905));};return _0x3bb14e[_0x2c2ebc(0x20d)]('click',()=>{const _0x20444f=_0x2c2ebc,_0x509eec=getCurrentTheme()==='dark'?_0x20444f(0x1ff):_0x20444f(0x1fa);applyTheme(_0x509eec);}),_0x21e634?_0x21e634[_0x2c2ebc(0x22e)](_0x3bb14e):(_0x3bb14e[_0x2c2ebc(0x20e)][_0x2c2ebc(0x216)](_0x2c2ebc(0x1ef)),document[_0x2c2ebc(0x1f5)][_0x2c2ebc(0x22e)](_0x3bb14e)),_0xdbf3f4(initTheme()),onThemeChange(_0xdbf3f4),_0x3bb14e;}export{THEME_STORAGE_KEY,THEME_CHANGE_EVENT};
|