@walavave/cc98-cli 0.1.0

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.
Files changed (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/api/client.d.ts +57 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +298 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/endpoints.d.ts +48 -0
  8. package/dist/api/endpoints.d.ts.map +1 -0
  9. package/dist/api/endpoints.js +53 -0
  10. package/dist/api/endpoints.js.map +1 -0
  11. package/dist/api/types.d.ts +35 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +2 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/api/webvpn.d.ts +40 -0
  16. package/dist/api/webvpn.d.ts.map +1 -0
  17. package/dist/api/webvpn.js +259 -0
  18. package/dist/api/webvpn.js.map +1 -0
  19. package/dist/cli/commands/account.d.ts +2 -0
  20. package/dist/cli/commands/account.d.ts.map +1 -0
  21. package/dist/cli/commands/account.js +81 -0
  22. package/dist/cli/commands/account.js.map +1 -0
  23. package/dist/cli/commands/board.d.ts +2 -0
  24. package/dist/cli/commands/board.d.ts.map +1 -0
  25. package/dist/cli/commands/board.js +61 -0
  26. package/dist/cli/commands/board.js.map +1 -0
  27. package/dist/cli/commands/cache.d.ts +2 -0
  28. package/dist/cli/commands/cache.d.ts.map +1 -0
  29. package/dist/cli/commands/cache.js +68 -0
  30. package/dist/cli/commands/cache.js.map +1 -0
  31. package/dist/cli/commands/forum.d.ts +2 -0
  32. package/dist/cli/commands/forum.d.ts.map +1 -0
  33. package/dist/cli/commands/forum.js +38 -0
  34. package/dist/cli/commands/forum.js.map +1 -0
  35. package/dist/cli/commands/login.d.ts +2 -0
  36. package/dist/cli/commands/login.d.ts.map +1 -0
  37. package/dist/cli/commands/login.js +98 -0
  38. package/dist/cli/commands/login.js.map +1 -0
  39. package/dist/cli/commands/logout.d.ts +2 -0
  40. package/dist/cli/commands/logout.d.ts.map +1 -0
  41. package/dist/cli/commands/logout.js +20 -0
  42. package/dist/cli/commands/logout.js.map +1 -0
  43. package/dist/cli/commands/me.d.ts +2 -0
  44. package/dist/cli/commands/me.d.ts.map +1 -0
  45. package/dist/cli/commands/me.js +9 -0
  46. package/dist/cli/commands/me.js.map +1 -0
  47. package/dist/cli/commands/message.d.ts +2 -0
  48. package/dist/cli/commands/message.d.ts.map +1 -0
  49. package/dist/cli/commands/message.js +42 -0
  50. package/dist/cli/commands/message.js.map +1 -0
  51. package/dist/cli/commands/notice.d.ts +2 -0
  52. package/dist/cli/commands/notice.d.ts.map +1 -0
  53. package/dist/cli/commands/notice.js +30 -0
  54. package/dist/cli/commands/notice.js.map +1 -0
  55. package/dist/cli/commands/post.d.ts +2 -0
  56. package/dist/cli/commands/post.d.ts.map +1 -0
  57. package/dist/cli/commands/post.js +37 -0
  58. package/dist/cli/commands/post.js.map +1 -0
  59. package/dist/cli/commands/search.d.ts +2 -0
  60. package/dist/cli/commands/search.d.ts.map +1 -0
  61. package/dist/cli/commands/search.js +13 -0
  62. package/dist/cli/commands/search.js.map +1 -0
  63. package/dist/cli/commands/topic.d.ts +2 -0
  64. package/dist/cli/commands/topic.d.ts.map +1 -0
  65. package/dist/cli/commands/topic.js +196 -0
  66. package/dist/cli/commands/topic.js.map +1 -0
  67. package/dist/cli/commands/update.d.ts +2 -0
  68. package/dist/cli/commands/update.d.ts.map +1 -0
  69. package/dist/cli/commands/update.js +24 -0
  70. package/dist/cli/commands/update.js.map +1 -0
  71. package/dist/cli/commands/user.d.ts +2 -0
  72. package/dist/cli/commands/user.d.ts.map +1 -0
  73. package/dist/cli/commands/user.js +90 -0
  74. package/dist/cli/commands/user.js.map +1 -0
  75. package/dist/cli/commands/vpn.d.ts +2 -0
  76. package/dist/cli/commands/vpn.d.ts.map +1 -0
  77. package/dist/cli/commands/vpn.js +177 -0
  78. package/dist/cli/commands/vpn.js.map +1 -0
  79. package/dist/cli/context.d.ts +9 -0
  80. package/dist/cli/context.d.ts.map +1 -0
  81. package/dist/cli/context.js +26 -0
  82. package/dist/cli/context.js.map +1 -0
  83. package/dist/cli/options.d.ts +6 -0
  84. package/dist/cli/options.d.ts.map +1 -0
  85. package/dist/cli/options.js +22 -0
  86. package/dist/cli/options.js.map +1 -0
  87. package/dist/cli/parse.d.ts +15 -0
  88. package/dist/cli/parse.d.ts.map +1 -0
  89. package/dist/cli/parse.js +55 -0
  90. package/dist/cli/parse.js.map +1 -0
  91. package/dist/cli/prompt.d.ts +4 -0
  92. package/dist/cli/prompt.d.ts.map +1 -0
  93. package/dist/cli/prompt.js +53 -0
  94. package/dist/cli/prompt.js.map +1 -0
  95. package/dist/cli/router.d.ts +2 -0
  96. package/dist/cli/router.d.ts.map +1 -0
  97. package/dist/cli/router.js +90 -0
  98. package/dist/cli/router.js.map +1 -0
  99. package/dist/config.d.ts +10 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +74 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/main.d.ts +3 -0
  104. package/dist/main.d.ts.map +1 -0
  105. package/dist/main.js +17 -0
  106. package/dist/main.js.map +1 -0
  107. package/dist/storage/cache-store.d.ts +62 -0
  108. package/dist/storage/cache-store.d.ts.map +1 -0
  109. package/dist/storage/cache-store.js +233 -0
  110. package/dist/storage/cache-store.js.map +1 -0
  111. package/dist/storage/paths.d.ts +5 -0
  112. package/dist/storage/paths.d.ts.map +1 -0
  113. package/dist/storage/paths.js +17 -0
  114. package/dist/storage/paths.js.map +1 -0
  115. package/dist/storage/token-store.d.ts +39 -0
  116. package/dist/storage/token-store.d.ts.map +1 -0
  117. package/dist/storage/token-store.js +177 -0
  118. package/dist/storage/token-store.js.map +1 -0
  119. package/dist/storage/vpn-store.d.ts +16 -0
  120. package/dist/storage/vpn-store.d.ts.map +1 -0
  121. package/dist/storage/vpn-store.js +72 -0
  122. package/dist/storage/vpn-store.js.map +1 -0
  123. package/dist/tui/account-modal.d.ts +31 -0
  124. package/dist/tui/account-modal.d.ts.map +1 -0
  125. package/dist/tui/account-modal.js +97 -0
  126. package/dist/tui/account-modal.js.map +1 -0
  127. package/dist/tui/ansi.d.ts +20 -0
  128. package/dist/tui/ansi.d.ts.map +1 -0
  129. package/dist/tui/ansi.js +28 -0
  130. package/dist/tui/ansi.js.map +1 -0
  131. package/dist/tui/app-data.d.ts +22 -0
  132. package/dist/tui/app-data.d.ts.map +1 -0
  133. package/dist/tui/app-data.js +828 -0
  134. package/dist/tui/app-data.js.map +1 -0
  135. package/dist/tui/app-runtime.d.ts +27 -0
  136. package/dist/tui/app-runtime.d.ts.map +1 -0
  137. package/dist/tui/app-runtime.js +874 -0
  138. package/dist/tui/app-runtime.js.map +1 -0
  139. package/dist/tui/app.d.ts +2 -0
  140. package/dist/tui/app.d.ts.map +1 -0
  141. package/dist/tui/app.js +172 -0
  142. package/dist/tui/app.js.map +1 -0
  143. package/dist/tui/cached-client.d.ts +41 -0
  144. package/dist/tui/cached-client.d.ts.map +1 -0
  145. package/dist/tui/cached-client.js +78 -0
  146. package/dist/tui/cached-client.js.map +1 -0
  147. package/dist/tui/canvas.d.ts +26 -0
  148. package/dist/tui/canvas.d.ts.map +1 -0
  149. package/dist/tui/canvas.js +204 -0
  150. package/dist/tui/canvas.js.map +1 -0
  151. package/dist/tui/downloads.d.ts +2 -0
  152. package/dist/tui/downloads.d.ts.map +1 -0
  153. package/dist/tui/downloads.js +81 -0
  154. package/dist/tui/downloads.js.map +1 -0
  155. package/dist/tui/image-preview.d.ts +19 -0
  156. package/dist/tui/image-preview.d.ts.map +1 -0
  157. package/dist/tui/image-preview.js +217 -0
  158. package/dist/tui/image-preview.js.map +1 -0
  159. package/dist/tui/interactions.d.ts +5 -0
  160. package/dist/tui/interactions.d.ts.map +1 -0
  161. package/dist/tui/interactions.js +25 -0
  162. package/dist/tui/interactions.js.map +1 -0
  163. package/dist/tui/keymap.d.ts +7 -0
  164. package/dist/tui/keymap.d.ts.map +1 -0
  165. package/dist/tui/keymap.js +262 -0
  166. package/dist/tui/keymap.js.map +1 -0
  167. package/dist/tui/layout.d.ts +29 -0
  168. package/dist/tui/layout.d.ts.map +1 -0
  169. package/dist/tui/layout.js +82 -0
  170. package/dist/tui/layout.js.map +1 -0
  171. package/dist/tui/renderer.d.ts +9 -0
  172. package/dist/tui/renderer.d.ts.map +1 -0
  173. package/dist/tui/renderer.js +375 -0
  174. package/dist/tui/renderer.js.map +1 -0
  175. package/dist/tui/terminal.d.ts +41 -0
  176. package/dist/tui/terminal.d.ts.map +1 -0
  177. package/dist/tui/terminal.js +162 -0
  178. package/dist/tui/terminal.js.map +1 -0
  179. package/dist/tui/text.d.ts +10 -0
  180. package/dist/tui/text.d.ts.map +1 -0
  181. package/dist/tui/text.js +158 -0
  182. package/dist/tui/text.js.map +1 -0
  183. package/dist/tui/theme.d.ts +56 -0
  184. package/dist/tui/theme.d.ts.map +1 -0
  185. package/dist/tui/theme.js +95 -0
  186. package/dist/tui/theme.js.map +1 -0
  187. package/dist/tui/tui-model.d.ts +126 -0
  188. package/dist/tui/tui-model.d.ts.map +1 -0
  189. package/dist/tui/tui-model.js +54 -0
  190. package/dist/tui/tui-model.js.map +1 -0
  191. package/dist/tui/ubb-renderer.d.ts +12 -0
  192. package/dist/tui/ubb-renderer.d.ts.map +1 -0
  193. package/dist/tui/ubb-renderer.js +196 -0
  194. package/dist/tui/ubb-renderer.js.map +1 -0
  195. package/dist/update.d.ts +17 -0
  196. package/dist/update.d.ts.map +1 -0
  197. package/dist/update.js +88 -0
  198. package/dist/update.js.map +1 -0
  199. package/dist/version.d.ts +6 -0
  200. package/dist/version.d.ts.map +1 -0
  201. package/dist/version.js +6 -0
  202. package/dist/version.js.map +1 -0
  203. package/docs/images/tui.png +0 -0
  204. package/docs/images/tui2.png +0 -0
  205. package/package.json +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAE1B,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC5E,eAAe,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,uCAAuC,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;CAOb,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function userCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/user.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE/D"}
@@ -0,0 +1,90 @@
1
+ import { createCliContext } from "../context.js";
2
+ import { extractAccountOption } from "../options.js";
3
+ import { extractPageOptions, parseIds, parsePositiveInteger, printJson } from "../parse.js";
4
+ export async function userCommand(args) {
5
+ const accountOption = extractAccountOption(args);
6
+ const [subcommand, ...rest] = accountOption.args;
7
+ const { client } = await createCliContext({ account: accountOption.account });
8
+ switch (subcommand) {
9
+ case undefined:
10
+ case "--help":
11
+ case "-h":
12
+ case "help":
13
+ printUserHelp();
14
+ return;
15
+ case "me":
16
+ printJson(await client.getMe());
17
+ return;
18
+ case "profile": {
19
+ const userId = parsePositiveInteger(rest[0], "user-id");
20
+ printJson(await client.getUserProfile(userId));
21
+ return;
22
+ }
23
+ case "basic":
24
+ printJson(await client.getBasicUsers(parseIds(rest)));
25
+ return;
26
+ case "list":
27
+ printJson(await client.getUsers(parseIds(rest)));
28
+ return;
29
+ case "followers": {
30
+ const page = extractPageOptions(rest, { size: 10 });
31
+ printJson(await client.getFriendIds("follower", page.from, page.size));
32
+ return;
33
+ }
34
+ case "followees": {
35
+ const page = extractPageOptions(rest, { size: 10 });
36
+ printJson(await client.getFriendIds("followee", page.from, page.size));
37
+ return;
38
+ }
39
+ case "moment": {
40
+ const page = extractPageOptions(rest, { size: 20 });
41
+ printJson(await client.getMoment(page.from, page.size));
42
+ return;
43
+ }
44
+ case "favorite-updates": {
45
+ const page = extractPageOptions(rest, { size: 20 });
46
+ printJson(await client.getFavoriteUpdates(page.from, page.size));
47
+ return;
48
+ }
49
+ case "favorite-groups":
50
+ printJson(await client.getFavoriteGroups());
51
+ return;
52
+ case "search": {
53
+ const name = rest.join(" ").trim();
54
+ if (!name) {
55
+ throw new Error("usage: cc98 user search <name>");
56
+ }
57
+ printJson(await client.searchUsers(name));
58
+ return;
59
+ }
60
+ case "unread":
61
+ printJson(await client.getUnreadCount());
62
+ return;
63
+ case "browse-history": {
64
+ const page = extractPageOptions(rest, { size: 11 });
65
+ printJson(await client.getBrowseHistory(page.from, page.size));
66
+ return;
67
+ }
68
+ default:
69
+ throw new Error(`unknown user command: ${subcommand}`);
70
+ }
71
+ }
72
+ function printUserHelp() {
73
+ console.log(`cc98 user
74
+
75
+ Usage:
76
+ cc98 user me
77
+ cc98 user profile <user-id>
78
+ cc98 user basic <ids...>
79
+ cc98 user list <ids...>
80
+ cc98 user followers [--from n] [--size n]
81
+ cc98 user followees [--from n] [--size n]
82
+ cc98 user moment [--from n] [--size n]
83
+ cc98 user favorite-updates [--from n] [--size n]
84
+ cc98 user favorite-groups
85
+ cc98 user search <name>
86
+ cc98 user unread
87
+ cc98 user browse-history [--from n] [--size n]
88
+ `);
89
+ }
90
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/cli/commands/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function vpnCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=vpn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpn.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/vpn.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B9D"}
@@ -0,0 +1,177 @@
1
+ import { WebVpnService } from "../../api/webvpn.js";
2
+ import { VpnStore } from "../../storage/vpn-store.js";
3
+ import { promptPassword, promptText } from "../prompt.js";
4
+ export async function vpnCommand(args) {
5
+ const [subCommand, ...rest] = args;
6
+ if (!subCommand || subCommand === "--help" || subCommand === "-h") {
7
+ printVpnHelp();
8
+ return;
9
+ }
10
+ switch (subCommand) {
11
+ case "login":
12
+ await vpnLogin(rest);
13
+ return;
14
+ case "logout":
15
+ await vpnLogout();
16
+ return;
17
+ case "status":
18
+ await vpnStatus();
19
+ return;
20
+ case "test":
21
+ await vpnTest();
22
+ return;
23
+ case "mode":
24
+ await vpnMode(rest);
25
+ return;
26
+ default:
27
+ throw new Error(`unknown vpn subcommand: ${subCommand}. Run "cc98 vpn --help" for usage.`);
28
+ }
29
+ }
30
+ async function vpnLogin(args) {
31
+ const store = new VpnStore();
32
+ const config = await store.getConfig();
33
+ let username = args[0] || config.username;
34
+ if (!username) {
35
+ username = await promptText("浙大通行证用户名: ");
36
+ if (!username) {
37
+ console.error("用户名不能为空");
38
+ return;
39
+ }
40
+ }
41
+ let password = args[1];
42
+ if (!password) {
43
+ password = await promptPassword("浙大通行证密码: ");
44
+ if (!password) {
45
+ console.error("密码不能为空");
46
+ return;
47
+ }
48
+ }
49
+ console.log("正在登录 WebVPN...");
50
+ const vpn = new WebVpnService();
51
+ const result = await vpn.login(username, password);
52
+ if (result.needConfirm) {
53
+ console.log("需要确认登录(可能在其他设备已登录)");
54
+ const confirm = await promptText("是否确认登录?(y/N): ");
55
+ if (confirm.toLowerCase() !== "y") {
56
+ console.log("已取消登录");
57
+ return;
58
+ }
59
+ const confirmResult = await vpn.confirmLogin();
60
+ if (!confirmResult.success) {
61
+ console.error("确认登录失败:", confirmResult.message);
62
+ return;
63
+ }
64
+ }
65
+ else if (!result.success) {
66
+ console.error("WebVPN 登录失败:", result.message);
67
+ return;
68
+ }
69
+ console.log("WebVPN 登录成功");
70
+ await store.saveSession(username, vpn.getCookies());
71
+ console.log("\n测试 WebVPN 连接...");
72
+ vpn.enabled = true;
73
+ const testResponse = await vpn.fetch("https://api.cc98.org/config/index");
74
+ if (testResponse.ok) {
75
+ console.log("WebVPN 连接正常");
76
+ }
77
+ else {
78
+ console.error("WebVPN 连接失败:", testResponse.status);
79
+ }
80
+ }
81
+ async function vpnLogout() {
82
+ const store = new VpnStore();
83
+ const config = await store.getConfig();
84
+ if (!config.username) {
85
+ console.log("未配置 WebVPN");
86
+ return;
87
+ }
88
+ const vpn = new WebVpnService(config.cookies);
89
+ await vpn.logout();
90
+ await store.clear();
91
+ console.log("已清除 WebVPN 配置");
92
+ }
93
+ async function vpnStatus() {
94
+ const store = new VpnStore();
95
+ const config = await store.getConfig();
96
+ console.log("WebVPN 状态:");
97
+ console.log(` 模式: ${config.mode}`);
98
+ console.log(` 用户名: ${config.username || "未配置"}`);
99
+ console.log(` 会话: ${config.cookies ? "已保存" : "未登录"}`);
100
+ if (config.loggedInAt) {
101
+ console.log(` 登录时间: ${config.loggedInAt}`);
102
+ }
103
+ if (config.username) {
104
+ console.log("\n测试连接...");
105
+ const vpn = new WebVpnService(config.cookies);
106
+ const inCampus = await vpn.checkNetwork();
107
+ console.log(` 校园网: ${inCampus ? "是" : "否"}`);
108
+ if (!inCampus && config.mode !== "direct") {
109
+ console.log(" 提示: 不在校园网内,WebVPN 将自动启用");
110
+ }
111
+ }
112
+ }
113
+ async function vpnTest() {
114
+ console.log("测试 WebVPN 连接...\n");
115
+ const vpn = new WebVpnService();
116
+ console.log("1. 检测校园网...");
117
+ const inCampus = await vpn.checkNetwork();
118
+ console.log(` 结果: ${inCampus ? "在校园网内" : "不在校园网内"}`);
119
+ if (inCampus) {
120
+ console.log("\n当前在校园网内,无需使用 WebVPN");
121
+ return;
122
+ }
123
+ console.log("\n2. 测试 WebVPN 访问...");
124
+ vpn.enabled = true;
125
+ const store = new VpnStore();
126
+ const config = await store.getConfig();
127
+ if (config.username && config.cookies) {
128
+ console.log(` 使用账号: ${config.username}`);
129
+ vpn.loadCookies(config.cookies);
130
+ const response = await vpn.fetch("https://api.cc98.org/config/index");
131
+ console.log(` API 访问: ${response.ok ? "成功" : `失败 ${response.status}`}`);
132
+ return;
133
+ }
134
+ if (config.username) {
135
+ console.log(` 已配置账号: ${config.username}`);
136
+ console.log(" 未保存有效会话,请运行 'cc98 vpn login' 重新登录");
137
+ return;
138
+ }
139
+ console.log(" 未配置 WebVPN 账号");
140
+ console.log(" 请运行 'cc98 vpn login' 配置");
141
+ }
142
+ async function vpnMode(args) {
143
+ const store = new VpnStore();
144
+ const mode = args[0];
145
+ if (!mode) {
146
+ const config = await store.getConfig();
147
+ console.log(`当前模式: ${config.mode}`);
148
+ console.log("\n可用模式:");
149
+ console.log(" auto - 自动检测校园网,非校园网自动使用 WebVPN");
150
+ console.log(" vpn - 强制使用 WebVPN");
151
+ console.log(" direct - 强制直连(不使用 WebVPN)");
152
+ console.log("\n用法: cc98 vpn mode <mode>");
153
+ return;
154
+ }
155
+ if (!["auto", "vpn", "direct"].includes(mode)) {
156
+ console.error(`无效的模式: ${mode}`);
157
+ console.error("可用模式: auto, vpn, direct");
158
+ return;
159
+ }
160
+ await store.saveMode(mode);
161
+ console.log(`已设置模式: ${mode}`);
162
+ }
163
+ function printVpnHelp() {
164
+ console.log(`cc98 vpn - WebVPN 管理
165
+
166
+ Usage:
167
+ cc98 vpn login [username] [password] 登录 WebVPN
168
+ cc98 vpn logout 注销 WebVPN
169
+ cc98 vpn status 查看状态
170
+ cc98 vpn test 测试连接
171
+ cc98 vpn mode [auto|vpn|direct] 设置模式
172
+
173
+ Options:
174
+ -h, --help 显示帮助
175
+ `);
176
+ }
177
+ //# sourceMappingURL=vpn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpn.js","sourceRoot":"","sources":["../../../src/cli/commands/vpn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Cc98Client } from "../api/client.js";
2
+ import { TokenStore } from "../storage/token-store.js";
3
+ export declare function createCliContext(options?: {
4
+ account?: string;
5
+ }): Promise<{
6
+ client: Cc98Client;
7
+ tokenStore: TokenStore;
8
+ }>;
9
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,wBAAsB,gBAAgB,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC,CASlI"}
@@ -0,0 +1,26 @@
1
+ import { Cc98Client } from "../api/client.js";
2
+ import { VpnStore } from "../storage/vpn-store.js";
3
+ import { TokenStore } from "../storage/token-store.js";
4
+ export async function createCliContext(options = {}) {
5
+ const tokenStore = new TokenStore().withAccount(options.account);
6
+ const vpnConfig = await new VpnStore().getConfig();
7
+ const webVpn = getWebVpnOptions(vpnConfig);
8
+ const client = new Cc98Client({ tokenStore, webVpn });
9
+ if (webVpn) {
10
+ await client.initWebVpn();
11
+ }
12
+ return { client, tokenStore };
13
+ }
14
+ function getWebVpnOptions(config) {
15
+ if (config.mode === "direct") {
16
+ return { mode: "direct" };
17
+ }
18
+ if (config.mode === "vpn" || config.cookies) {
19
+ return {
20
+ mode: config.mode,
21
+ cookies: config.cookies
22
+ };
23
+ }
24
+ return undefined;
25
+ }
26
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAgC,EAAE;IACvE,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAkD;IAC1E,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface AccountOptionResult {
2
+ account?: string;
3
+ args: string[];
4
+ }
5
+ export declare function extractAccountOption(args: string[]): AccountOptionResult;
6
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAwBxE"}
@@ -0,0 +1,22 @@
1
+ export function extractAccountOption(args) {
2
+ const nextArgs = [];
3
+ let account;
4
+ for (let index = 0; index < args.length; index += 1) {
5
+ const arg = args[index];
6
+ if (arg === "--account" || arg === "-a") {
7
+ const value = args[index + 1];
8
+ if (!value) {
9
+ throw new Error(`missing value for ${arg}`);
10
+ }
11
+ account = value;
12
+ index += 1;
13
+ continue;
14
+ }
15
+ nextArgs.push(arg);
16
+ }
17
+ return {
18
+ account,
19
+ args: nextArgs
20
+ };
21
+ }
22
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAA2B,CAAC;IAEhC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,OAAO;QACP,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare function parseInteger(value: string | undefined, name: string): number;
2
+ export declare function parsePositiveInteger(value: string | undefined, name: string): number;
3
+ export declare function parseNonNegativeInteger(value: string | undefined, name: string): number;
4
+ export declare function parseIds(values: string[], name?: string): number[];
5
+ export interface PageOptions {
6
+ from: number;
7
+ size: number;
8
+ rest: string[];
9
+ }
10
+ export declare function extractPageOptions(args: string[], defaults?: {
11
+ from?: number;
12
+ size?: number;
13
+ }): PageOptions;
14
+ export declare function printJson(value: unknown): void;
15
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/cli/parse.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMvF;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,SAAQ,GAAG,MAAM,EAAE,CAWjE;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CAwB/G;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE9C"}
@@ -0,0 +1,55 @@
1
+ export function parseInteger(value, name) {
2
+ const parsed = Number(value);
3
+ if (!Number.isInteger(parsed)) {
4
+ throw new Error(`missing or invalid value for ${name}`);
5
+ }
6
+ return parsed;
7
+ }
8
+ export function parsePositiveInteger(value, name) {
9
+ const parsed = parseInteger(value, name);
10
+ if (parsed <= 0) {
11
+ throw new Error(`missing or invalid value for ${name}`);
12
+ }
13
+ return parsed;
14
+ }
15
+ export function parseNonNegativeInteger(value, name) {
16
+ const parsed = parseInteger(value, name);
17
+ if (parsed < 0) {
18
+ throw new Error(`missing or invalid value for ${name}`);
19
+ }
20
+ return parsed;
21
+ }
22
+ export function parseIds(values, name = "ids") {
23
+ const ids = values.flatMap((value) => value.split(","))
24
+ .map((value) => value.trim())
25
+ .filter(Boolean)
26
+ .map((value) => parsePositiveInteger(value, name));
27
+ if (ids.length === 0) {
28
+ throw new Error(`missing ${name}`);
29
+ }
30
+ return ids;
31
+ }
32
+ export function extractPageOptions(args, defaults = {}) {
33
+ const rest = [];
34
+ let from = defaults.from ?? 0;
35
+ let size = defaults.size ?? 20;
36
+ for (let index = 0; index < args.length; index += 1) {
37
+ const arg = args[index];
38
+ if (arg === "--from") {
39
+ from = parseNonNegativeInteger(args[index + 1], "--from");
40
+ index += 1;
41
+ continue;
42
+ }
43
+ if (arg === "--size") {
44
+ size = parsePositiveInteger(args[index + 1], "--size");
45
+ index += 1;
46
+ continue;
47
+ }
48
+ rest.push(arg);
49
+ }
50
+ return { from, size, rest };
51
+ }
52
+ export function printJson(value) {
53
+ console.log(JSON.stringify(value, null, 2));
54
+ }
55
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/cli/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function promptText(label: string): Promise<string>;
2
+ export declare function promptPassword(label: string): Promise<string>;
3
+ export declare function readStdinText(): Promise<string>;
4
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"AAuBA,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/D;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBnE;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAMrD"}
@@ -0,0 +1,53 @@
1
+ import { stdin, stdout } from "node:process";
2
+ import { Writable } from "node:stream";
3
+ import { createInterface } from "node:readline/promises";
4
+ class MuteableOutput extends Writable {
5
+ target;
6
+ muted = false;
7
+ constructor(target) {
8
+ super();
9
+ this.target = target;
10
+ }
11
+ _write(chunk, encoding, callback) {
12
+ if (!this.muted) {
13
+ this.target.write(chunk, encoding);
14
+ }
15
+ callback();
16
+ }
17
+ }
18
+ export async function promptText(label) {
19
+ const rl = createInterface({ input: stdin, output: stdout });
20
+ try {
21
+ return await rl.question(label);
22
+ }
23
+ finally {
24
+ rl.close();
25
+ }
26
+ }
27
+ export async function promptPassword(label) {
28
+ if (!stdin.isTTY) {
29
+ return promptText(label);
30
+ }
31
+ const output = new MuteableOutput(stdout);
32
+ const rl = createInterface({ input: stdin, output, terminal: true });
33
+ try {
34
+ stdout.write(label);
35
+ output.muted = true;
36
+ const password = await rl.question("");
37
+ output.muted = false;
38
+ stdout.write("\n");
39
+ return password;
40
+ }
41
+ finally {
42
+ output.muted = false;
43
+ rl.close();
44
+ }
45
+ }
46
+ export async function readStdinText() {
47
+ const chunks = [];
48
+ for await (const chunk of stdin) {
49
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));
50
+ }
51
+ return Buffer.concat(chunks).toString("utf8");
52
+ }
53
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,cAAe,SAAQ,QAAQ;IAGN;IAF7B,KAAK,GAAG,KAAK,CAAC;IAEd,YAA6B,MAA0B;QACrD,KAAK,EAAE,CAAC;QADmB,WAAM,GAAN,MAAM,CAAoB;IAEvD,CAAC;IAEQ,MAAM,CACb,KAAsB,EACtB,QAAwB,EACxB,QAAwC;QAExC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;QACD,QAAQ,EAAE,CAAC;IACb,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runCli(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"AAwCA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB1D"}
@@ -0,0 +1,90 @@
1
+ import { accountCommand } from "./commands/account.js";
2
+ import { boardCommand } from "./commands/board.js";
3
+ import { cacheCommand } from "./commands/cache.js";
4
+ import { forumCommand } from "./commands/forum.js";
5
+ import { loginCommand } from "./commands/login.js";
6
+ import { logoutCommand } from "./commands/logout.js";
7
+ import { messageCommand } from "./commands/message.js";
8
+ import { meCommand } from "./commands/me.js";
9
+ import { noticeCommand } from "./commands/notice.js";
10
+ import { postCommand } from "./commands/post.js";
11
+ import { extractAccountOption } from "./options.js";
12
+ import { searchCommand } from "./commands/search.js";
13
+ import { topicCommand } from "./commands/topic.js";
14
+ import { updateCommand } from "./commands/update.js";
15
+ import { userCommand } from "./commands/user.js";
16
+ import { vpnCommand } from "./commands/vpn.js";
17
+ import { runTui } from "../tui/app.js";
18
+ import { appName, appVersion } from "../version.js";
19
+ const commands = {
20
+ account: accountCommand,
21
+ board: boardCommand,
22
+ cache: cacheCommand,
23
+ forum: forumCommand,
24
+ login: loginCommand,
25
+ logout: logoutCommand,
26
+ message: messageCommand,
27
+ me: meCommand,
28
+ notice: noticeCommand,
29
+ post: postCommand,
30
+ search: searchCommand,
31
+ topic: topicCommand,
32
+ tui: runTui,
33
+ update: updateCommand,
34
+ user: userCommand,
35
+ vpn: vpnCommand
36
+ };
37
+ export async function runCli(args) {
38
+ const accountOption = extractAccountOption(args);
39
+ const [command, ...rest] = accountOption.args;
40
+ if (!command || command === "--help" || command === "-h" || command === "help") {
41
+ printHelp();
42
+ return;
43
+ }
44
+ if (command === "--version" || command === "-v") {
45
+ console.log(`${appName} ${appVersion}`);
46
+ return;
47
+ }
48
+ const handler = commands[command];
49
+ if (!handler) {
50
+ throw new Error(`unknown command: ${command}. Run "cc98 --help" for usage.`);
51
+ }
52
+ const commandArgs = accountOption.account && command !== "account"
53
+ ? [...rest, "--account", accountOption.account]
54
+ : rest;
55
+ await handler(commandArgs);
56
+ }
57
+ function printHelp() {
58
+ console.log(`cc98
59
+
60
+ Usage:
61
+ cc98 Open the TUI
62
+ cc98 tui Open the TUI explicitly
63
+ cc98 login Sign in and save tokens
64
+ cc98 account list List local accounts
65
+ cc98 account use <name> Set current account
66
+ cc98 logout Remove saved tokens
67
+ cc98 me Show current user profile
68
+ cc98 forum index Read forum index config
69
+ cc98 forum boards Read all boards
70
+ cc98 board <board-id> List topics in a board
71
+ cc98 topic <topic-id> Read a topic
72
+ cc98 user profile <id> Read user profile
73
+ cc98 message unread Read unread counts
74
+ cc98 notice system Read system notices
75
+ cc98 post rate-reasons 0 Read post rating reasons
76
+ cc98 search <keyword> Search topics
77
+ cc98 cache stats Show cache statistics
78
+ cc98 cache cleanup Remove expired cache entries
79
+ cc98 cache clear Clear all cache
80
+ cc98 vpn login Login to WebVPN (non-campus network)
81
+ cc98 vpn status Show VPN status
82
+ cc98 update Check the latest GitHub Release
83
+
84
+ Options:
85
+ -a, --account <name> Use this account for supported commands
86
+ -h, --help Show this help
87
+ -v, --version Show version
88
+ `);
89
+ }
90
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIpD,MAAM,QAAQ,GAAmC;IAC/C,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,cAAc;IACvB,EAAE,EAAE,SAAS;IACb,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,MAAM;IACX,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,UAAU;CAChB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACzC,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC;IAE9C,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/E,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,gCAAgC,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS;QAChE,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Bb,CAAC,CAAC;AACH,CAAC"}