@jackle.dev/zalox 1.0.1
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/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/cli/commands/admin.d.ts +17 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +359 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +88 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/autoreply.d.ts +12 -0
- package/dist/cli/commands/autoreply.d.ts.map +1 -0
- package/dist/cli/commands/autoreply.js +162 -0
- package/dist/cli/commands/autoreply.js.map +1 -0
- package/dist/cli/commands/bulk.d.ts +9 -0
- package/dist/cli/commands/bulk.d.ts.map +1 -0
- package/dist/cli/commands/bulk.js +169 -0
- package/dist/cli/commands/bulk.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +122 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/conv.d.ts +3 -0
- package/dist/cli/commands/conv.d.ts.map +1 -0
- package/dist/cli/commands/conv.js +229 -0
- package/dist/cli/commands/conv.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +13 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +102 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/export.d.ts +10 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +98 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/friend.d.ts +13 -0
- package/dist/cli/commands/friend.d.ts.map +1 -0
- package/dist/cli/commands/friend.js +337 -0
- package/dist/cli/commands/friend.js.map +1 -0
- package/dist/cli/commands/group-settings.d.ts +11 -0
- package/dist/cli/commands/group-settings.d.ts.map +1 -0
- package/dist/cli/commands/group-settings.js +154 -0
- package/dist/cli/commands/group-settings.js.map +1 -0
- package/dist/cli/commands/group.d.ts +14 -0
- package/dist/cli/commands/group.d.ts.map +1 -0
- package/dist/cli/commands/group.js +365 -0
- package/dist/cli/commands/group.js.map +1 -0
- package/dist/cli/commands/license.d.ts +13 -0
- package/dist/cli/commands/license.d.ts.map +1 -0
- package/dist/cli/commands/license.js +218 -0
- package/dist/cli/commands/license.js.map +1 -0
- package/dist/cli/commands/listen.d.ts +3 -0
- package/dist/cli/commands/listen.d.ts.map +1 -0
- package/dist/cli/commands/listen.js +177 -0
- package/dist/cli/commands/listen.js.map +1 -0
- package/dist/cli/commands/me.d.ts +9 -0
- package/dist/cli/commands/me.d.ts.map +1 -0
- package/dist/cli/commands/me.js +135 -0
- package/dist/cli/commands/me.js.map +1 -0
- package/dist/cli/commands/msg.d.ts +11 -0
- package/dist/cli/commands/msg.d.ts.map +1 -0
- package/dist/cli/commands/msg.js +255 -0
- package/dist/cli/commands/msg.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +3 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +50 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +12 -0
- package/dist/cli/commands/schedule.d.ts.map +1 -0
- package/dist/cli/commands/schedule.js +175 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +87 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/template.d.ts +12 -0
- package/dist/cli/commands/template.d.ts.map +1 -0
- package/dist/cli/commands/template.js +163 -0
- package/dist/cli/commands/template.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +63 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +144 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/core/autoreply.d.ts +57 -0
- package/dist/core/autoreply.d.ts.map +1 -0
- package/dist/core/autoreply.js +159 -0
- package/dist/core/autoreply.js.map +1 -0
- package/dist/core/bulk.d.ts +36 -0
- package/dist/core/bulk.d.ts.map +1 -0
- package/dist/core/bulk.js +117 -0
- package/dist/core/bulk.js.map +1 -0
- package/dist/core/client.d.ts +8 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +91 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/daemon.d.ts +30 -0
- package/dist/core/daemon.d.ts.map +1 -0
- package/dist/core/daemon.js +213 -0
- package/dist/core/daemon.js.map +1 -0
- package/dist/core/dm-commands.d.ts +41 -0
- package/dist/core/dm-commands.d.ts.map +1 -0
- package/dist/core/dm-commands.js +313 -0
- package/dist/core/dm-commands.js.map +1 -0
- package/dist/core/export.d.ts +20 -0
- package/dist/core/export.d.ts.map +1 -0
- package/dist/core/export.js +92 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/gate.d.ts +39 -0
- package/dist/core/gate.d.ts.map +1 -0
- package/dist/core/gate.js +75 -0
- package/dist/core/gate.js.map +1 -0
- package/dist/core/group-settings.d.ts +35 -0
- package/dist/core/group-settings.d.ts.map +1 -0
- package/dist/core/group-settings.js +70 -0
- package/dist/core/group-settings.js.map +1 -0
- package/dist/core/index.d.ts +22 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/license.d.ts +103 -0
- package/dist/core/license.d.ts.map +1 -0
- package/dist/core/license.js +444 -0
- package/dist/core/license.js.map +1 -0
- package/dist/core/scheduler.d.ts +45 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +203 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/templates.d.ts +35 -0
- package/dist/core/templates.d.ts.map +1 -0
- package/dist/core/templates.js +107 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/types.d.ts +57 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/server/api.d.ts +2 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +79 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +48 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/license-api.d.ts +55 -0
- package/dist/server/license-api.d.ts.map +1 -0
- package/dist/server/license-api.js +496 -0
- package/dist/server/license-api.js.map +1 -0
- package/dist/server/middleware.d.ts +18 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/webhook.d.ts +10 -0
- package/dist/server/webhook.d.ts.map +1 -0
- package/dist/server/webhook.js +53 -0
- package/dist/server/webhook.js.map +1 -0
- package/dist/server/ws.d.ts +66 -0
- package/dist/server/ws.d.ts.map +1 -0
- package/dist/server/ws.js +203 -0
- package/dist/server/ws.js.map +1 -0
- package/dist/utils/cache.d.ts +35 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +78 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +16 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +88 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +51 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +74 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ZaloX Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# ZaloX 🚀
|
|
2
|
+
|
|
3
|
+
> **Modern Zalo CLI & API Platform** — Automation Unleashed.
|
|
4
|
+
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://bun.sh)
|
|
7
|
+
[](https://github.com/lktiep/zalox)
|
|
8
|
+
|
|
9
|
+
**ZaloX** is a powerful, developer-friendly CLI tool and API server for Zalo automation. It replaces paid tools like `zca-cli` with a free, open-source alternative built on top of `zca-js`.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## ✨ Features
|
|
14
|
+
|
|
15
|
+
| Feature | ZaloX Free | zca-cli |
|
|
16
|
+
|---------|------------|---------|
|
|
17
|
+
| **Auth** | QR Code & Cookie Login | ✅ |
|
|
18
|
+
| **Messaging** | Text, Link, Reply, Undo, React | ✅ |
|
|
19
|
+
| **Contacts** | List Friends & Groups | 💰 Paid |
|
|
20
|
+
| **Real-time** | Message Listener | 💰 Paid |
|
|
21
|
+
| **Multi-account** | Unlimited Profiles | 💰 Paid |
|
|
22
|
+
| **API Server** | REST API (`zalox serve`) | ❌ |
|
|
23
|
+
| **Webhooks** | HTTP Forwarding | ❌ |
|
|
24
|
+
| **Platform** | Linux, macOS, Windows | Linux only |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 📦 Installation
|
|
29
|
+
|
|
30
|
+
### NPM (Node.js)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g @jackle.dev/zalox
|
|
34
|
+
```
|
|
35
|
+
Download the latest binary from [Releases](https://github.com/lktiep/zalox/releases).
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Linux / macOS
|
|
39
|
+
chmod +x zalox
|
|
40
|
+
mv zalox /usr/local/bin/
|
|
41
|
+
|
|
42
|
+
# Windows
|
|
43
|
+
# Add zalox.exe to your PATH
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### From Source
|
|
47
|
+
Requires [Bun](https://bun.sh) or Node.js 18+.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/lktiep/zalox.git
|
|
51
|
+
cd zalox
|
|
52
|
+
bun install
|
|
53
|
+
bun run build
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 🚀 Quick Start
|
|
59
|
+
|
|
60
|
+
1. **Login**
|
|
61
|
+
```bash
|
|
62
|
+
zalox auth login
|
|
63
|
+
# Scan the QR code with your Zalo app
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
2. **Send Message**
|
|
67
|
+
```bash
|
|
68
|
+
zalox msg send <user_id> "Hello from ZaloX!"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
3. **List Friends**
|
|
72
|
+
```bash
|
|
73
|
+
zalox friend list
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
4. **Start Listener**
|
|
77
|
+
```bash
|
|
78
|
+
zalox listen
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 📚 Commands Reference
|
|
84
|
+
|
|
85
|
+
### Authentication
|
|
86
|
+
- `zalox auth login` - Login via QR code
|
|
87
|
+
- `zalox auth status` - Check current session
|
|
88
|
+
- `zalox auth logout` - Remove credentials
|
|
89
|
+
- `zalox auth profiles` - List all saved profiles
|
|
90
|
+
- `zalox auth use <profile>` - Switch active profile
|
|
91
|
+
|
|
92
|
+
### Messaging
|
|
93
|
+
- `zalox msg send <id> <text>` - Send text message
|
|
94
|
+
- `zalox msg send-link <id> <url>` - Send link with preview
|
|
95
|
+
- `zalox msg undo <id> <msgId>` - Recall a message
|
|
96
|
+
- `zalox msg react <id> <msgId> <icon>` - React (❤️, 👍, 😂, etc.)
|
|
97
|
+
|
|
98
|
+
### Contacts
|
|
99
|
+
- `zalox friend list` - List friends
|
|
100
|
+
- `zalox friend find <phone>` - Find user by phone
|
|
101
|
+
- `zalox friend add <id> <msg>` - Send friend request
|
|
102
|
+
- `zalox group list` - List groups
|
|
103
|
+
- `zalox group members <id>` - List group members
|
|
104
|
+
- `zalox group create <name> <id1> <id2>` - Create new group
|
|
105
|
+
|
|
106
|
+
### Advanced
|
|
107
|
+
- `zalox listen` - Start real-time event listener
|
|
108
|
+
- `zalox serve` - Start REST API Server (Port 3456)
|
|
109
|
+
- `zalox config set webhook.url <url>` - Forward messages to URL
|
|
110
|
+
- `zalox me info` - View detailed account info
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 🔌 REST API Server
|
|
115
|
+
|
|
116
|
+
Run `zalox serve` to expose your Zalo account as a local REST API.
|
|
117
|
+
|
|
118
|
+
| Method | Endpoint | Description |
|
|
119
|
+
|--------|----------|-------------|
|
|
120
|
+
| `GET` | `/api/me` | Account info |
|
|
121
|
+
| `GET` | `/api/friends` | List friends |
|
|
122
|
+
| `GET` | `/api/groups` | List groups |
|
|
123
|
+
| `POST` | `/api/messages/send` | Send message |
|
|
124
|
+
|
|
125
|
+
**Example usage:**
|
|
126
|
+
```bash
|
|
127
|
+
curl -X POST http://localhost:3456/api/messages/send \
|
|
128
|
+
-H "Content-Type: application/json" \
|
|
129
|
+
-d '{"threadId": "123456789", "message": "Hello via API"}'
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🤖 OpenClaw Plugin
|
|
135
|
+
|
|
136
|
+
ZaloX includes a native **OpenClaw channel plugin** (`plugin/`) that integrates Zalo as a first-class messaging channel — just like Telegram, Discord, or WhatsApp.
|
|
137
|
+
|
|
138
|
+
### Features
|
|
139
|
+
- 📥 **Inbound:** Receive DMs and group messages from Zalo
|
|
140
|
+
- 📤 **Outbound:** Send text, images, and files
|
|
141
|
+
- ❤️ **Reactions:** Auto heart-react on inbound messages
|
|
142
|
+
- 👥 **Group mentions:** Only replies when @tagged in groups
|
|
143
|
+
- 🔐 **Persistent credentials:** Survives container restarts
|
|
144
|
+
- 📸 **Image upload:** Full support via sharp + zca-js uploadAttachment
|
|
145
|
+
|
|
146
|
+
### Setup
|
|
147
|
+
1. Configure in `openclaw.json`:
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"plugins": [{ "source": "/path/to/zalox/plugin" }],
|
|
151
|
+
"channels": {
|
|
152
|
+
"zalox": {
|
|
153
|
+
"accounts": { "default": {} },
|
|
154
|
+
"bindings": [{ "match": { "channel": "zalox" }, "agentId": "main" }]
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
2. Login via QR:
|
|
160
|
+
```bash
|
|
161
|
+
tsx plugin/scripts/qr-login.ts
|
|
162
|
+
```
|
|
163
|
+
3. Restart OpenClaw — Zalo messages now route to your agent!
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 🤝 Contributing
|
|
168
|
+
|
|
169
|
+
We welcome contributions! Please see `CONTRIBUTING.md` for details.
|
|
170
|
+
|
|
171
|
+
1. Fork the repo
|
|
172
|
+
2. Create your feature branch (`git checkout -b feature/amazing`)
|
|
173
|
+
3. Commit your changes (`git commit -m 'feat: Add amazing feature'`)
|
|
174
|
+
4. Push to the branch (`git push origin feature/amazing`)
|
|
175
|
+
5. Open a Pull Request
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## ⚖️ Disclaimer
|
|
180
|
+
|
|
181
|
+
This tool is **not affiliated with, endorsed by, or associated with Zalo Group or VNG Corporation**.
|
|
182
|
+
It is an unofficial open-source tool built for educational and development purposes.
|
|
183
|
+
Use responsibly and at your own risk.
|
|
184
|
+
|
|
185
|
+
**License:** MIT
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — Admin CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Server-side license management commands.
|
|
5
|
+
*
|
|
6
|
+
* Commands:
|
|
7
|
+
* zalox admin serve — Start license API server
|
|
8
|
+
* zalox admin gen-key --tier pro — Generate license key
|
|
9
|
+
* zalox admin list-keys — List all keys
|
|
10
|
+
* zalox admin revoke-key <key> — Revoke a key
|
|
11
|
+
* zalox admin transfer-key <key> — Transfer key (reset devices)
|
|
12
|
+
* zalox admin key-info <key> — Show key details
|
|
13
|
+
* zalox admin stats — Dashboard stats
|
|
14
|
+
*/
|
|
15
|
+
import type { Command } from 'commander';
|
|
16
|
+
export declare function adminCommands(program: Command): void;
|
|
17
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiFzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgVpD"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — Admin CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Server-side license management commands.
|
|
5
|
+
*
|
|
6
|
+
* Commands:
|
|
7
|
+
* zalox admin serve — Start license API server
|
|
8
|
+
* zalox admin gen-key --tier pro — Generate license key
|
|
9
|
+
* zalox admin list-keys — List all keys
|
|
10
|
+
* zalox admin revoke-key <key> — Revoke a key
|
|
11
|
+
* zalox admin transfer-key <key> — Transfer key (reset devices)
|
|
12
|
+
* zalox admin key-info <key> — Show key details
|
|
13
|
+
* zalox admin stats — Dashboard stats
|
|
14
|
+
*/
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import Table from 'cli-table3';
|
|
17
|
+
import { randomBytes } from 'crypto';
|
|
18
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
import { homedir } from 'os';
|
|
21
|
+
// ── Store Path ───────────────────────────────────────────
|
|
22
|
+
function getDataDir() {
|
|
23
|
+
return join(homedir(), '.config', 'zalox', 'server');
|
|
24
|
+
}
|
|
25
|
+
function getStorePath() {
|
|
26
|
+
return join(getDataDir(), 'licenses.json');
|
|
27
|
+
}
|
|
28
|
+
function loadStore() {
|
|
29
|
+
const path = getStorePath();
|
|
30
|
+
if (!existsSync(path)) {
|
|
31
|
+
return { keys: {}, version: 1, lastUpdated: new Date().toISOString() };
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { keys: {}, version: 1, lastUpdated: new Date().toISOString() };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function saveStore(store) {
|
|
41
|
+
const dir = getDataDir();
|
|
42
|
+
if (!existsSync(dir))
|
|
43
|
+
mkdirSync(dir, { recursive: true });
|
|
44
|
+
store.lastUpdated = new Date().toISOString();
|
|
45
|
+
writeFileSync(getStorePath(), JSON.stringify(store, null, 2));
|
|
46
|
+
}
|
|
47
|
+
// ── Key Generation ───────────────────────────────────────
|
|
48
|
+
function generateKey(tier) {
|
|
49
|
+
const random = randomBytes(4).toString('hex').toUpperCase();
|
|
50
|
+
const check = randomBytes(2).toString('hex').toUpperCase();
|
|
51
|
+
return `ZALOX-${tier.toUpperCase()}-${random}-${check}`;
|
|
52
|
+
}
|
|
53
|
+
// ── CLI Commands ─────────────────────────────────────────
|
|
54
|
+
export function adminCommands(program) {
|
|
55
|
+
const admin = program
|
|
56
|
+
.command('admin')
|
|
57
|
+
.description('🔐 License server administration');
|
|
58
|
+
// ── serve ──────────────────────────────────────────────
|
|
59
|
+
admin
|
|
60
|
+
.command('serve')
|
|
61
|
+
.description('Start license API server')
|
|
62
|
+
.option('-p, --port <port>', 'Port', '3456')
|
|
63
|
+
.option('--host <host>', 'Host', '0.0.0.0')
|
|
64
|
+
.option('--admin-token <token>', 'Admin API token (required)')
|
|
65
|
+
.option('--data-dir <dir>', 'Data directory', getDataDir())
|
|
66
|
+
.action(async (opts) => {
|
|
67
|
+
const adminToken = opts.adminToken || process.env.ZALOX_ADMIN_TOKEN;
|
|
68
|
+
if (!adminToken) {
|
|
69
|
+
console.log(chalk.red(' ✖ Admin token required. Use --admin-token or set ZALOX_ADMIN_TOKEN'));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
const { createLicenseApi } = await import('../../server/license-api.js');
|
|
73
|
+
const { serve } = await import('@hono/node-server');
|
|
74
|
+
const app = createLicenseApi({
|
|
75
|
+
dataDir: opts.dataDir,
|
|
76
|
+
adminToken,
|
|
77
|
+
});
|
|
78
|
+
const port = parseInt(opts.port);
|
|
79
|
+
console.log();
|
|
80
|
+
console.log(chalk.green.bold(' 🔑 ZaloX License Server'));
|
|
81
|
+
console.log(chalk.gray(` ─────────────────────────────`));
|
|
82
|
+
console.log(` ${chalk.gray('Port:')} ${chalk.white(port)}`);
|
|
83
|
+
console.log(` ${chalk.gray('Host:')} ${chalk.white(opts.host)}`);
|
|
84
|
+
console.log(` ${chalk.gray('Data:')} ${chalk.white(opts.dataDir)}`);
|
|
85
|
+
console.log(` ${chalk.gray('Admin:')} ${chalk.yellow(adminToken.slice(0, 8) + '...')}`);
|
|
86
|
+
console.log();
|
|
87
|
+
console.log(chalk.gray(' Endpoints:'));
|
|
88
|
+
console.log(chalk.cyan(' POST /api/license/activate'));
|
|
89
|
+
console.log(chalk.cyan(' POST /api/license/verify'));
|
|
90
|
+
console.log(chalk.cyan(' POST /api/license/deactivate'));
|
|
91
|
+
console.log(chalk.yellow(' POST /api/admin/keys/generate [admin]'));
|
|
92
|
+
console.log(chalk.yellow(' GET /api/admin/keys [admin]'));
|
|
93
|
+
console.log(chalk.yellow(' GET /api/admin/keys/:key [admin]'));
|
|
94
|
+
console.log(chalk.yellow(' PATCH /api/admin/keys/:key [admin]'));
|
|
95
|
+
console.log(chalk.yellow(' POST /api/admin/keys/revoke [admin]'));
|
|
96
|
+
console.log(chalk.yellow(' POST /api/admin/keys/transfer [admin]'));
|
|
97
|
+
console.log(chalk.yellow(' DELETE /api/admin/keys/:key [admin]'));
|
|
98
|
+
console.log(chalk.yellow(' GET /api/admin/stats [admin]'));
|
|
99
|
+
console.log();
|
|
100
|
+
serve({ fetch: app.fetch, port, hostname: opts.host });
|
|
101
|
+
});
|
|
102
|
+
// ── gen-key ────────────────────────────────────────────
|
|
103
|
+
admin
|
|
104
|
+
.command('gen-key')
|
|
105
|
+
.description('Generate license key(s)')
|
|
106
|
+
.option('-t, --tier <tier>', 'License tier (starter/pro/team)', 'pro')
|
|
107
|
+
.option('-n, --count <count>', 'Number of keys', '1')
|
|
108
|
+
.option('--owner <name>', 'Owner name')
|
|
109
|
+
.option('--email <email>', 'Owner email')
|
|
110
|
+
.option('--note <note>', 'Note')
|
|
111
|
+
.option('--expires <date>', 'Expiration date (ISO)')
|
|
112
|
+
.option('--max-devices <n>', 'Max devices')
|
|
113
|
+
.option('--payment-ref <ref>', 'Payment reference')
|
|
114
|
+
.action((opts) => {
|
|
115
|
+
const tier = opts.tier;
|
|
116
|
+
if (!['starter', 'pro', 'team'].includes(tier)) {
|
|
117
|
+
console.log(chalk.red(` ✖ Invalid tier "${tier}". Use: starter, pro, team`));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const count = Math.min(parseInt(opts.count) || 1, 100);
|
|
121
|
+
const store = loadStore();
|
|
122
|
+
const maxDevices = opts.maxDevices ? parseInt(opts.maxDevices) : (tier === 'team' ? 5 : 1);
|
|
123
|
+
console.log();
|
|
124
|
+
console.log(chalk.green.bold(` 🔑 Generating ${count} ${tier.toUpperCase()} key(s)...`));
|
|
125
|
+
console.log();
|
|
126
|
+
const keys = [];
|
|
127
|
+
for (let i = 0; i < count; i++) {
|
|
128
|
+
let key;
|
|
129
|
+
do {
|
|
130
|
+
key = generateKey(tier);
|
|
131
|
+
} while (store.keys[key]);
|
|
132
|
+
store.keys[key] = {
|
|
133
|
+
key,
|
|
134
|
+
tier,
|
|
135
|
+
status: 'active',
|
|
136
|
+
createdAt: new Date().toISOString(),
|
|
137
|
+
activatedAt: null,
|
|
138
|
+
revokedAt: null,
|
|
139
|
+
expiresAt: opts.expires || null,
|
|
140
|
+
maxDevices,
|
|
141
|
+
devices: [],
|
|
142
|
+
owner: opts.owner || null,
|
|
143
|
+
email: opts.email || null,
|
|
144
|
+
note: opts.note || null,
|
|
145
|
+
paymentRef: opts.paymentRef || null,
|
|
146
|
+
metadata: {},
|
|
147
|
+
};
|
|
148
|
+
keys.push(key);
|
|
149
|
+
}
|
|
150
|
+
saveStore(store);
|
|
151
|
+
// Display
|
|
152
|
+
const prices = { starter: '499,000₫', pro: '999,000₫', team: '2,499,000₫' };
|
|
153
|
+
for (const key of keys) {
|
|
154
|
+
console.log(` ${chalk.yellow('⚡')} ${chalk.white.bold(key)}`);
|
|
155
|
+
}
|
|
156
|
+
console.log();
|
|
157
|
+
console.log(chalk.gray(` Tier: ${chalk.white(tier.toUpperCase())} (${prices[tier]})`));
|
|
158
|
+
console.log(chalk.gray(` Max devices: ${chalk.white(maxDevices)}`));
|
|
159
|
+
if (opts.owner)
|
|
160
|
+
console.log(chalk.gray(` Owner: ${chalk.white(opts.owner)}`));
|
|
161
|
+
if (opts.email)
|
|
162
|
+
console.log(chalk.gray(` Email: ${chalk.white(opts.email)}`));
|
|
163
|
+
if (opts.expires)
|
|
164
|
+
console.log(chalk.gray(` Expires: ${chalk.white(opts.expires)}`));
|
|
165
|
+
if (opts.paymentRef)
|
|
166
|
+
console.log(chalk.gray(` Payment: ${chalk.white(opts.paymentRef)}`));
|
|
167
|
+
console.log(chalk.gray(` Stored: ${getStorePath()}`));
|
|
168
|
+
console.log();
|
|
169
|
+
});
|
|
170
|
+
// ── list-keys ──────────────────────────────────────────
|
|
171
|
+
admin
|
|
172
|
+
.command('list-keys')
|
|
173
|
+
.alias('ls')
|
|
174
|
+
.description('List all license keys')
|
|
175
|
+
.option('-t, --tier <tier>', 'Filter by tier')
|
|
176
|
+
.option('-s, --status <status>', 'Filter by status')
|
|
177
|
+
.option('-q, --query <search>', 'Search in key/owner/email')
|
|
178
|
+
.action((opts) => {
|
|
179
|
+
const store = loadStore();
|
|
180
|
+
let keys = Object.values(store.keys);
|
|
181
|
+
if (opts.tier)
|
|
182
|
+
keys = keys.filter(k => k.tier === opts.tier);
|
|
183
|
+
if (opts.status)
|
|
184
|
+
keys = keys.filter(k => k.status === opts.status);
|
|
185
|
+
if (opts.query) {
|
|
186
|
+
const q = opts.query.toLowerCase();
|
|
187
|
+
keys = keys.filter(k => k.key.toLowerCase().includes(q) ||
|
|
188
|
+
k.owner?.toLowerCase().includes(q) ||
|
|
189
|
+
k.email?.toLowerCase().includes(q));
|
|
190
|
+
}
|
|
191
|
+
keys.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
192
|
+
if (keys.length === 0) {
|
|
193
|
+
console.log(chalk.yellow('\n No keys found.\n'));
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
console.log();
|
|
197
|
+
console.log(chalk.green.bold(` 📋 License Keys (${keys.length} total)`));
|
|
198
|
+
console.log();
|
|
199
|
+
const table = new Table({
|
|
200
|
+
head: ['Key', 'Tier', 'Status', 'Devices', 'Owner', 'Created'].map(h => chalk.gray(h)),
|
|
201
|
+
style: { 'padding-left': 2 },
|
|
202
|
+
});
|
|
203
|
+
for (const k of keys) {
|
|
204
|
+
const statusColor = {
|
|
205
|
+
active: chalk.blue,
|
|
206
|
+
activated: chalk.green,
|
|
207
|
+
revoked: chalk.red,
|
|
208
|
+
expired: chalk.gray,
|
|
209
|
+
}[k.status] || chalk.white;
|
|
210
|
+
table.push([
|
|
211
|
+
chalk.white(k.key),
|
|
212
|
+
chalk.yellow(k.tier.toUpperCase()),
|
|
213
|
+
statusColor(k.status),
|
|
214
|
+
`${k.devices.length}/${k.maxDevices}`,
|
|
215
|
+
k.owner || chalk.gray('-'),
|
|
216
|
+
new Date(k.createdAt).toLocaleDateString(),
|
|
217
|
+
]);
|
|
218
|
+
}
|
|
219
|
+
console.log(table.toString());
|
|
220
|
+
console.log();
|
|
221
|
+
});
|
|
222
|
+
// ── key-info ───────────────────────────────────────────
|
|
223
|
+
admin
|
|
224
|
+
.command('key-info <key>')
|
|
225
|
+
.description('Show key details')
|
|
226
|
+
.action((key) => {
|
|
227
|
+
const store = loadStore();
|
|
228
|
+
const license = store.keys[key.toUpperCase()];
|
|
229
|
+
if (!license) {
|
|
230
|
+
console.log(chalk.red(`\n ✖ Key not found: ${key}\n`));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
console.log();
|
|
234
|
+
console.log(chalk.green.bold(` 🔑 License Details`));
|
|
235
|
+
console.log(chalk.gray(` ─────────────────────────────`));
|
|
236
|
+
console.log(` ${chalk.gray('Key:')} ${chalk.white.bold(license.key)}`);
|
|
237
|
+
console.log(` ${chalk.gray('Tier:')} ${chalk.yellow(license.tier.toUpperCase())}`);
|
|
238
|
+
console.log(` ${chalk.gray('Status:')} ${license.status}`);
|
|
239
|
+
console.log(` ${chalk.gray('Max Devices:')} ${license.maxDevices}`);
|
|
240
|
+
console.log(` ${chalk.gray('Created:')} ${license.createdAt}`);
|
|
241
|
+
if (license.activatedAt)
|
|
242
|
+
console.log(` ${chalk.gray('Activated:')} ${license.activatedAt}`);
|
|
243
|
+
if (license.expiresAt)
|
|
244
|
+
console.log(` ${chalk.gray('Expires:')} ${license.expiresAt}`);
|
|
245
|
+
if (license.revokedAt)
|
|
246
|
+
console.log(` ${chalk.gray('Revoked:')} ${license.revokedAt}`);
|
|
247
|
+
if (license.owner)
|
|
248
|
+
console.log(` ${chalk.gray('Owner:')} ${license.owner}`);
|
|
249
|
+
if (license.email)
|
|
250
|
+
console.log(` ${chalk.gray('Email:')} ${license.email}`);
|
|
251
|
+
if (license.note)
|
|
252
|
+
console.log(` ${chalk.gray('Note:')} ${license.note}`);
|
|
253
|
+
if (license.paymentRef)
|
|
254
|
+
console.log(` ${chalk.gray('Payment:')} ${license.paymentRef}`);
|
|
255
|
+
if (license.devices.length > 0) {
|
|
256
|
+
console.log();
|
|
257
|
+
console.log(chalk.gray(` Activated Devices (${license.devices.length}):`));
|
|
258
|
+
for (const d of license.devices) {
|
|
259
|
+
console.log(` ${chalk.cyan('•')} ${chalk.white(d.deviceCode)} — ${d.hostname || '?'} (${d.platform || '?'})`);
|
|
260
|
+
console.log(` ${chalk.gray(`Activated: ${d.activatedAt} | Last seen: ${d.lastVerifiedAt}`)}`);
|
|
261
|
+
if (d.ip)
|
|
262
|
+
console.log(` ${chalk.gray(`IP: ${d.ip}`)}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
console.log();
|
|
266
|
+
});
|
|
267
|
+
// ── revoke-key ─────────────────────────────────────────
|
|
268
|
+
admin
|
|
269
|
+
.command('revoke-key <key>')
|
|
270
|
+
.description('Revoke a license key')
|
|
271
|
+
.action((key) => {
|
|
272
|
+
const store = loadStore();
|
|
273
|
+
const license = store.keys[key.toUpperCase()];
|
|
274
|
+
if (!license) {
|
|
275
|
+
console.log(chalk.red(`\n ✖ Key not found: ${key}\n`));
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
license.status = 'revoked';
|
|
279
|
+
license.revokedAt = new Date().toISOString();
|
|
280
|
+
saveStore(store);
|
|
281
|
+
console.log(chalk.green(`\n ✔ Key ${chalk.white(license.key)} revoked successfully.`));
|
|
282
|
+
console.log(chalk.gray(` ${license.devices.length} device(s) will be blocked on next verify.\n`));
|
|
283
|
+
});
|
|
284
|
+
// ── transfer-key ───────────────────────────────────────
|
|
285
|
+
admin
|
|
286
|
+
.command('transfer-key <key>')
|
|
287
|
+
.description('Transfer key (reset device bindings)')
|
|
288
|
+
.option('--device <code>', 'Remove specific device only')
|
|
289
|
+
.action((key, opts) => {
|
|
290
|
+
const store = loadStore();
|
|
291
|
+
const license = store.keys[key.toUpperCase()];
|
|
292
|
+
if (!license) {
|
|
293
|
+
console.log(chalk.red(`\n ✖ Key not found: ${key}\n`));
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (opts.device) {
|
|
297
|
+
const idx = license.devices.findIndex(d => d.deviceCode === opts.device);
|
|
298
|
+
if (idx === -1) {
|
|
299
|
+
console.log(chalk.red(`\n ✖ Device ${opts.device} not found on this key.\n`));
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
license.devices.splice(idx, 1);
|
|
303
|
+
console.log(chalk.green(`\n ✔ Device ${chalk.white(opts.device)} removed from ${chalk.white(license.key)}`));
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
const count = license.devices.length;
|
|
307
|
+
license.devices = [];
|
|
308
|
+
console.log(chalk.green(`\n ✔ All ${count} device(s) removed from ${chalk.white(license.key)}`));
|
|
309
|
+
}
|
|
310
|
+
license.status = license.devices.length > 0 ? 'activated' : 'active';
|
|
311
|
+
saveStore(store);
|
|
312
|
+
console.log(chalk.gray(' Key is ready for new activation.\n'));
|
|
313
|
+
});
|
|
314
|
+
// ── stats ──────────────────────────────────────────────
|
|
315
|
+
admin
|
|
316
|
+
.command('stats')
|
|
317
|
+
.description('Show license statistics')
|
|
318
|
+
.action(() => {
|
|
319
|
+
const store = loadStore();
|
|
320
|
+
const keys = Object.values(store.keys);
|
|
321
|
+
const prices = { starter: 499000, pro: 999000, team: 2499000 };
|
|
322
|
+
const stats = {
|
|
323
|
+
total: keys.length,
|
|
324
|
+
starter: 0, pro: 0, team: 0,
|
|
325
|
+
active: 0, activated: 0, revoked: 0, expired: 0,
|
|
326
|
+
totalDevices: 0,
|
|
327
|
+
revenue: 0,
|
|
328
|
+
};
|
|
329
|
+
for (const k of keys) {
|
|
330
|
+
stats[k.tier]++;
|
|
331
|
+
stats[k.status]++;
|
|
332
|
+
stats.totalDevices += k.devices.length;
|
|
333
|
+
if (k.status !== 'revoked') {
|
|
334
|
+
stats.revenue += prices[k.tier];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const fmt = (n) => n.toLocaleString('vi-VN') + '₫';
|
|
338
|
+
console.log();
|
|
339
|
+
console.log(chalk.green.bold(' 📊 License Dashboard'));
|
|
340
|
+
console.log(chalk.gray(' ─────────────────────────────'));
|
|
341
|
+
console.log(` ${chalk.gray('Total Keys:')} ${chalk.white.bold(stats.total)}`);
|
|
342
|
+
console.log(` ${chalk.gray('Total Devices:')} ${chalk.white(stats.totalDevices)}`);
|
|
343
|
+
console.log();
|
|
344
|
+
console.log(chalk.gray(' By Tier:'));
|
|
345
|
+
console.log(` Starter: ${chalk.blue(stats.starter)}`);
|
|
346
|
+
console.log(` Pro: ${chalk.yellow(stats.pro)}`);
|
|
347
|
+
console.log(` Team: ${chalk.magenta(stats.team)}`);
|
|
348
|
+
console.log();
|
|
349
|
+
console.log(chalk.gray(' By Status:'));
|
|
350
|
+
console.log(` Active: ${chalk.blue(stats.active)} ${chalk.gray('(generated, not yet activated)')}`);
|
|
351
|
+
console.log(` Activated: ${chalk.green(stats.activated)}`);
|
|
352
|
+
console.log(` Revoked: ${chalk.red(stats.revoked)}`);
|
|
353
|
+
console.log(` Expired: ${chalk.gray(stats.expired)}`);
|
|
354
|
+
console.log();
|
|
355
|
+
console.log(` ${chalk.gray('Est. Revenue:')} ${chalk.green.bold(fmt(stats.revenue))}`);
|
|
356
|
+
console.log();
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAc,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAoC7B,4DAA4D;AAE5D,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAmB;IACpC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,4DAA4D;AAE5D,SAAS,WAAW,CAAC,IAAiB;IACpC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,OAAO,SAAS,IAAI,CAAC,WAAW,EAAE,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,4DAA4D;AAE5D,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAEnD,0DAA0D;IAE1D,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC;SAC3C,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC;SAC1C,MAAM,CAAC,uBAAuB,EAAE,4BAA4B,CAAC;SAC7D,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACpE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACzE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,gBAAgB,CAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,0DAA0D;IAE1D,KAAK;SACF,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,GAAG,CAAC;SACpD,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC;SACtC,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC;SAC/B,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;SACnD,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC;SAC1C,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;SAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAmB,CAAC;QACtC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,IAAI,4BAA4B,CAAC,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3F,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,GAAW,CAAC;YAChB,GAAG,CAAC;gBACF,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAE1B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBAChB,GAAG;gBACH,IAAI;gBACJ,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;gBAC/B,UAAU;gBACV,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;gBACvB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;gBACnC,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QAED,SAAS,CAAC,KAAK,CAAC,CAAC;QAEjB,UAAU;QACV,MAAM,MAAM,GAA2B,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QAEpG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEL,0DAA0D;IAE1D,KAAK;SACF,OAAO,CAAC,WAAW,CAAC;SACpB,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;SAC7C,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;SACnD,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,CAAC;SAC3D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrB,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC/B,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAClC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAEvF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtF,KAAK,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE;SAC7B,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG;gBAClB,MAAM,EAAE,KAAK,CAAC,IAAI;gBAClB,SAAS,EAAE,KAAK,CAAC,KAAK;gBACtB,OAAO,EAAE,KAAK,CAAC,GAAG;gBAClB,OAAO,EAAE,KAAK,CAAC,IAAI;aACpB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;YAE3B,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;gBACrB,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,EAAE;gBACrC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE;aAC3C,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEL,0DAA0D;IAE1D,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,CAAC,GAAW,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/F,IAAI,OAAO,CAAC,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7F,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YAC5E,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG,GAAG,CAAC,CAAC;gBACjH,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,WAAW,iBAAiB,CAAC,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnG,IAAI,CAAC,CAAC,EAAE;oBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEL,0DAA0D;IAE1D,KAAK;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,CAAC,GAAW,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,SAAS,CAAC,KAAK,CAAC,CAAC;QAEjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,8CAA8C,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEL,0DAA0D;IAE1D,KAAK;SACF,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,CAAC;SACxD,MAAM,CAAC,CAAC,GAAW,EAAE,IAAyB,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,MAAM,2BAA2B,CAAC,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAChH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YACrC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,KAAK,2BAA2B,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACpG,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrE,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEL,0DAA0D;IAE1D,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YAC3B,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;YAC/C,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;SACX,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAChB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAClB,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC3B,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;QAE3D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;QAC3G,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,QAuF5C"}
|