paperkite 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 (121) hide show
  1. package/README.md +81 -0
  2. package/data/flows.example.yml +65 -0
  3. package/data/settings.example.yml +13 -0
  4. package/dist/data/hooks/weekend-slot.d.ts +12 -0
  5. package/dist/data/hooks/weekend-slot.js +107 -0
  6. package/dist/data/hooks/weekend-slot.js.map +1 -0
  7. package/dist/packages/account-health/src/index.d.ts +8 -0
  8. package/dist/packages/account-health/src/index.js +37 -0
  9. package/dist/packages/account-health/src/index.js.map +1 -0
  10. package/dist/packages/archive/src/archiver.d.ts +98 -0
  11. package/dist/packages/archive/src/archiver.js +399 -0
  12. package/dist/packages/archive/src/archiver.js.map +1 -0
  13. package/dist/packages/archive/src/config.d.ts +22 -0
  14. package/dist/packages/archive/src/config.js +62 -0
  15. package/dist/packages/archive/src/config.js.map +1 -0
  16. package/dist/packages/archive/src/console/live.d.ts +24 -0
  17. package/dist/packages/archive/src/console/live.js +144 -0
  18. package/dist/packages/archive/src/console/live.js.map +1 -0
  19. package/dist/packages/archive/src/console/media.d.ts +66 -0
  20. package/dist/packages/archive/src/console/media.js +368 -0
  21. package/dist/packages/archive/src/console/media.js.map +1 -0
  22. package/dist/packages/archive/src/console/server.d.ts +12 -0
  23. package/dist/packages/archive/src/console/server.js +583 -0
  24. package/dist/packages/archive/src/console/server.js.map +1 -0
  25. package/dist/packages/archive/src/console/service.d.ts +13 -0
  26. package/dist/packages/archive/src/console/service.js +86 -0
  27. package/dist/packages/archive/src/console/service.js.map +1 -0
  28. package/dist/packages/archive/src/storage/index.d.ts +6 -0
  29. package/dist/packages/archive/src/storage/index.js +23 -0
  30. package/dist/packages/archive/src/storage/index.js.map +1 -0
  31. package/dist/packages/archive/src/storage/model.d.ts +296 -0
  32. package/dist/packages/archive/src/storage/model.js +151 -0
  33. package/dist/packages/archive/src/storage/model.js.map +1 -0
  34. package/dist/packages/archive/src/storage/postgres.d.ts +67 -0
  35. package/dist/packages/archive/src/storage/postgres.js +1021 -0
  36. package/dist/packages/archive/src/storage/postgres.js.map +1 -0
  37. package/dist/packages/archive/src/storage/sqlite.d.ts +59 -0
  38. package/dist/packages/archive/src/storage/sqlite.js +981 -0
  39. package/dist/packages/archive/src/storage/sqlite.js.map +1 -0
  40. package/dist/packages/notify-bark/src/index.d.ts +33 -0
  41. package/dist/packages/notify-bark/src/index.js +96 -0
  42. package/dist/packages/notify-bark/src/index.js.map +1 -0
  43. package/dist/packages/runtime-console/src/console/errors.d.ts +5 -0
  44. package/dist/packages/runtime-console/src/console/errors.js +11 -0
  45. package/dist/packages/runtime-console/src/console/errors.js.map +1 -0
  46. package/dist/packages/runtime-console/src/console/logs.d.ts +1 -0
  47. package/dist/packages/runtime-console/src/console/logs.js +27 -0
  48. package/dist/packages/runtime-console/src/console/logs.js.map +1 -0
  49. package/dist/packages/runtime-console/src/console/server.d.ts +6 -0
  50. package/dist/packages/runtime-console/src/console/server.js +182 -0
  51. package/dist/packages/runtime-console/src/console/server.js.map +1 -0
  52. package/dist/packages/runtime-console/src/index.d.ts +10 -0
  53. package/dist/packages/runtime-console/src/index.js +83 -0
  54. package/dist/packages/runtime-console/src/index.js.map +1 -0
  55. package/dist/src/app.d.ts +15 -0
  56. package/dist/src/app.js +34 -0
  57. package/dist/src/app.js.map +1 -0
  58. package/dist/src/cli.d.ts +2 -0
  59. package/dist/src/cli.js +250 -0
  60. package/dist/src/cli.js.map +1 -0
  61. package/dist/src/config/editor.d.ts +2 -0
  62. package/dist/src/config/editor.js +19 -0
  63. package/dist/src/config/editor.js.map +1 -0
  64. package/dist/src/config/loader.d.ts +6 -0
  65. package/dist/src/config/loader.js +188 -0
  66. package/dist/src/config/loader.js.map +1 -0
  67. package/dist/src/config/model.d.ts +71 -0
  68. package/dist/src/config/model.js +97 -0
  69. package/dist/src/config/model.js.map +1 -0
  70. package/dist/src/config/paths.d.ts +3 -0
  71. package/dist/src/config/paths.js +12 -0
  72. package/dist/src/config/paths.js.map +1 -0
  73. package/dist/src/config/settings.d.ts +19 -0
  74. package/dist/src/config/settings.js +44 -0
  75. package/dist/src/config/settings.js.map +1 -0
  76. package/dist/src/control/process-lock.d.ts +4 -0
  77. package/dist/src/control/process-lock.js +57 -0
  78. package/dist/src/control/process-lock.js.map +1 -0
  79. package/dist/src/control/socket.d.ts +14 -0
  80. package/dist/src/control/socket.js +131 -0
  81. package/dist/src/control/socket.js.map +1 -0
  82. package/dist/src/engine/hooks.d.ts +4 -0
  83. package/dist/src/engine/hooks.js +38 -0
  84. package/dist/src/engine/hooks.js.map +1 -0
  85. package/dist/src/engine/logger.d.ts +17 -0
  86. package/dist/src/engine/logger.js +78 -0
  87. package/dist/src/engine/logger.js.map +1 -0
  88. package/dist/src/engine/runtime.d.ts +78 -0
  89. package/dist/src/engine/runtime.js +799 -0
  90. package/dist/src/engine/runtime.js.map +1 -0
  91. package/dist/src/engine/scheduler.d.ts +9 -0
  92. package/dist/src/engine/scheduler.js +58 -0
  93. package/dist/src/engine/scheduler.js.map +1 -0
  94. package/dist/src/extensions/loader.d.ts +11 -0
  95. package/dist/src/extensions/loader.js +202 -0
  96. package/dist/src/extensions/loader.js.map +1 -0
  97. package/dist/src/extensions/manager.d.ts +1 -0
  98. package/dist/src/extensions/manager.js +121 -0
  99. package/dist/src/extensions/manager.js.map +1 -0
  100. package/dist/src/extensions/profile.d.ts +14 -0
  101. package/dist/src/extensions/profile.js +57 -0
  102. package/dist/src/extensions/profile.js.map +1 -0
  103. package/dist/src/extensions/registry.d.ts +19 -0
  104. package/dist/src/extensions/registry.js +62 -0
  105. package/dist/src/extensions/registry.js.map +1 -0
  106. package/dist/src/telegram/client.d.ts +20 -0
  107. package/dist/src/telegram/client.js +54 -0
  108. package/dist/src/telegram/client.js.map +1 -0
  109. package/dist/src/telegram/failure.d.ts +2 -0
  110. package/dist/src/telegram/failure.js +98 -0
  111. package/dist/src/telegram/failure.js.map +1 -0
  112. package/dist/src/telegram/login.d.ts +1 -0
  113. package/dist/src/telegram/login.js +31 -0
  114. package/dist/src/telegram/login.js.map +1 -0
  115. package/dist/src/telegram/pool.d.ts +47 -0
  116. package/dist/src/telegram/pool.js +300 -0
  117. package/dist/src/telegram/pool.js.map +1 -0
  118. package/dist/src/telegram/session-files.d.ts +4 -0
  119. package/dist/src/telegram/session-files.js +34 -0
  120. package/dist/src/telegram/session-files.js.map +1 -0
  121. package/package.json +62 -0
@@ -0,0 +1,583 @@
1
+ import { createReadStream } from "node:fs";
2
+ import fastify from "fastify";
3
+ import { normalizeContextLimit, normalizeDate, normalizeLimit, normalizeOffset, normalizeRecordId, normalizeTimeMode } from "../storage/index.js";
4
+ import { normalizeEntities } from "../archiver.js";
5
+ import { LiveMediaError, LiveMediaStreamer } from "./live.js";
6
+ import { diskMediaInfo, extFromMime, fetchLiveMedia, fetchLiveThumb, fileNameOf, isMissingPeer, isPhotoLike, mimeFromName, parseRange, resolveChatEntity } from "./media.js";
7
+ const CHAT_MAX = 300;
8
+ /** 缩略图成功缓存:同一 recordId 不再反复打 Telegram。 */
9
+ const THUMB_TTL_MS = 60 * 60 * 1_000;
10
+ const THUMB_CACHE_MAX = 512;
11
+ /** 不可达(删除/不可访问)的阴性缓存,避免缩略图反复触发 Telegram 查询。 */
12
+ const THUMB_NEGATIVE_TTL_MS = 30 * 1_000;
13
+ /** 在线说明缓存:同一 recordId 5 分钟内不再重复取回。 */
14
+ const LIVE_TEXT_TTL_MS = 5 * 60 * 1_000;
15
+ export function createArchiveConsoleServer(options) {
16
+ const server = fastify({ logger: false });
17
+ const thumbCache = new Map();
18
+ const negativeCache = new Map();
19
+ const liveTextCache = new Map();
20
+ const live = options.session && options.sessions
21
+ ? new LiveMediaStreamer({
22
+ sessions: options.sessions,
23
+ logger: options.logger
24
+ })
25
+ : undefined;
26
+ server.addHook("onClose", async () => {
27
+ releaseIdleConnections(server);
28
+ });
29
+ server.setErrorHandler((error, _request, reply) => {
30
+ const status = error instanceof HttpError
31
+ ? error.status
32
+ : error.statusCode ?? 500;
33
+ if (status >= 500)
34
+ options.logger.error("archive console request failed", error);
35
+ if (!reply.sent) {
36
+ return reply.code(status).send({ error: error instanceof Error ? error.message : String(error) });
37
+ }
38
+ });
39
+ registerRoutes(server, options, thumbCache, negativeCache, liveTextCache, live);
40
+ return server;
41
+ }
42
+ function registerRoutes(server, options, thumbCache, negativeCache, liveTextCache, live) {
43
+ const { store, mediaDir, session, sessions, logger } = options;
44
+ server.get("/api/state", async () => {
45
+ const blockwords = await store.listBlockwords();
46
+ const blockedUsers = await store.listBlockedUsers();
47
+ return {
48
+ backend: options.backend ?? "sqlite",
49
+ session: session ?? null,
50
+ mediaDir: mediaDir ?? null,
51
+ blockwords: { version: blockwords.version, count: blockwords.words.length },
52
+ blockedUsers: { version: blockedUsers.version, count: blockedUsers.users.length }
53
+ };
54
+ });
55
+ server.get("/api/blockwords", async () => store.listBlockwords());
56
+ server.post("/api/blockwords", async (request, reply) => {
57
+ const { word } = request.body ?? {};
58
+ if (typeof word !== "string")
59
+ throw new HttpError(400, "屏蔽词必须是字符串");
60
+ const result = await store.addBlockword(word);
61
+ if (result === "invalid")
62
+ throw new HttpError(400, "屏蔽词需为 1-64 字符");
63
+ if (result === "exists")
64
+ throw new HttpError(409, "屏蔽词已存在");
65
+ reply.code(201);
66
+ return store.listBlockwords();
67
+ });
68
+ server.delete("/api/blockwords/:word", async (request) => {
69
+ const removed = await store.removeBlockword(request.params.word);
70
+ if (!removed)
71
+ throw new HttpError(404, "屏蔽词不存在");
72
+ return store.listBlockwords();
73
+ });
74
+ server.get("/api/blockedusers", async () => store.listBlockedUsers());
75
+ server.post("/api/blockedusers", async (request, reply) => {
76
+ const { userId, name, username } = request.body ?? {};
77
+ if (typeof userId !== "string")
78
+ throw new HttpError(400, "用户 ID 必须是字符串");
79
+ const result = await store.addBlockedUser({
80
+ userId,
81
+ ...(typeof name === "string" ? { name } : {}),
82
+ ...(typeof username === "string" ? { username } : {})
83
+ });
84
+ if (result === "invalid")
85
+ throw new HttpError(400, "用户 ID 需为 1-64 字符");
86
+ if (result === "exists")
87
+ throw new HttpError(409, "该用户已在屏蔽名单");
88
+ reply.code(201);
89
+ return store.listBlockedUsers();
90
+ });
91
+ server.delete("/api/blockedusers/:id", async (request) => {
92
+ const removed = await store.removeBlockedUser(request.params.id);
93
+ if (!removed)
94
+ throw new HttpError(404, "该用户不在屏蔽名单");
95
+ return store.listBlockedUsers();
96
+ });
97
+ server.get("/api/search", async (request, reply) => {
98
+ try {
99
+ const query = request.query;
100
+ const result = await store.searchStructured({
101
+ keyword: text(query.q),
102
+ excludeKeyword: text(query.exclude),
103
+ chatIds: chatIdsOr(query.chat),
104
+ chatTitle: text(query.chatTitle),
105
+ dateFrom: dateOr(query.from),
106
+ dateTo: dateOr(query.to),
107
+ timeMode: modeOr(query.timeMode),
108
+ senderIds: usersOr(query.users),
109
+ forwardFromId: forwardIdOr(query.forwardFrom),
110
+ forwardFromName: forwardNameOr(query.forwardFrom),
111
+ limit: normalizeLimit(intOr(query.limit)),
112
+ offset: normalizeOffset(intOr(query.offset))
113
+ });
114
+ return result;
115
+ }
116
+ catch (error) {
117
+ return sendError(reply, error, logger);
118
+ }
119
+ });
120
+ server.get("/api/messages/:id", async (request, reply) => {
121
+ try {
122
+ const record = await store.getMessageByRecordId(recordIdOr(request.params.id));
123
+ if (!record)
124
+ throw new HttpError(404, "消息不存在");
125
+ return record;
126
+ }
127
+ catch (error) {
128
+ return sendError(reply, error, logger);
129
+ }
130
+ });
131
+ server.get("/api/messages/:id/context", async (request, reply) => {
132
+ try {
133
+ const recordId = recordIdOr(request.params.id);
134
+ const before = normalizeContextLimit(intOr(request.query.before));
135
+ const after = normalizeContextLimit(intOr(request.query.after));
136
+ const beforeOffset = normalizeOffset(intOr(request.query.beforeOffset));
137
+ const afterOffset = normalizeOffset(intOr(request.query.afterOffset));
138
+ const context = await store.getMessageContext(recordId, before, after, beforeOffset, afterOffset);
139
+ if (!context.anchor)
140
+ throw new HttpError(404, "消息不存在");
141
+ return context;
142
+ }
143
+ catch (error) {
144
+ return sendError(reply, error, logger);
145
+ }
146
+ });
147
+ server.get("/api/chats", async (request, reply) => {
148
+ try {
149
+ const chats = await store.listChatLedger(CHAT_MAX);
150
+ return { chats, capped: chats.length >= CHAT_MAX };
151
+ }
152
+ catch (error) {
153
+ return sendError(reply, error, logger);
154
+ }
155
+ });
156
+ server.get("/api/senders", async (request, reply) => {
157
+ try {
158
+ return await store.searchSenders({
159
+ q: text(request.query.q),
160
+ chatId: text(request.query.chat),
161
+ limit: normalizeLimit(intOr(request.query.limit))
162
+ });
163
+ }
164
+ catch (error) {
165
+ return sendError(reply, error, logger);
166
+ }
167
+ });
168
+ server.get("/api/senders/:id/summary", async (request, reply) => {
169
+ try {
170
+ const summary = await store.getSenderSummary(senderIdOr(request.params.id), text(request.query.chat));
171
+ if (!summary)
172
+ throw new HttpError(404, "没有该发送者的记录");
173
+ return summary;
174
+ }
175
+ catch (error) {
176
+ return sendError(reply, error, logger);
177
+ }
178
+ });
179
+ server.get("/api/messages/:id/replies", async (request, reply) => {
180
+ try {
181
+ const chain = await store.getReplyChain(recordIdOr(request.params.id));
182
+ if (!chain)
183
+ throw new HttpError(404, "消息不存在");
184
+ return chain;
185
+ }
186
+ catch (error) {
187
+ return sendError(reply, error, logger);
188
+ }
189
+ });
190
+ server.get("/api/messages/resolve", async (request, reply) => {
191
+ try {
192
+ const messageId = intOr(request.query.msg) ?? 0;
193
+ if (!Number.isInteger(messageId) || messageId <= 0)
194
+ throw new HttpError(400, "msg 须为正整数");
195
+ const recordId = await store.resolveMessageRef({
196
+ chatId: text(request.query.chat),
197
+ username: text(request.query.username),
198
+ code: text(request.query.code),
199
+ messageId
200
+ });
201
+ if (!recordId)
202
+ throw new HttpError(404, "存档中无此消息");
203
+ return { recordId };
204
+ }
205
+ catch (error) {
206
+ return sendError(reply, error, logger);
207
+ }
208
+ });
209
+ server.get("/api/messages/:id/live-text", async (request, reply) => {
210
+ try {
211
+ if (!session || !sessions)
212
+ throw new HttpError(503, "archive console needs a Telegram session");
213
+ const recordId = recordIdOr(request.params.id);
214
+ const cached = liveTextCacheGet(recordId, liveTextCache);
215
+ if (cached !== undefined)
216
+ return { text: cached.text, entities: cached.entities };
217
+ const record = await store.getMessageByRecordId(recordId);
218
+ if (!record)
219
+ throw new HttpError(404, "消息不存在");
220
+ const caption = await fetchLiveCaptionText(sessions, store, logger, record);
221
+ if (caption === undefined) {
222
+ liveTextCacheNeg(recordId, liveTextCache);
223
+ throw new HttpError(410, "消息已从 Telegram 删除或会话无法访问");
224
+ }
225
+ liveTextCachePut(recordId, caption, liveTextCache);
226
+ return { text: caption.text, entities: caption.entities };
227
+ }
228
+ catch (error) {
229
+ return sendError(reply, error, logger);
230
+ }
231
+ });
232
+ server.get("/api/mediafiles/:id", async (request, reply) => {
233
+ try {
234
+ const file = await store.getMediaFileById(recordIdOr(request.params.id));
235
+ if (!file)
236
+ throw new HttpError(404, "媒体记录不存在");
237
+ return { file, onDisk: (await diskMediaInfo(file, mediaDir)) !== undefined };
238
+ }
239
+ catch (error) {
240
+ return sendError(reply, error, logger);
241
+ }
242
+ });
243
+ server.get("/api/messages/:id/thumb", async (request, reply) => {
244
+ try {
245
+ if (!session || !sessions)
246
+ throw new HttpError(503, "archive console needs a Telegram session");
247
+ const recordId = recordIdOr(request.params.id);
248
+ const record = await store.getMessageByRecordId(recordId);
249
+ if (!record)
250
+ throw new HttpError(404, "消息不存在");
251
+ if (!record.hasMedia)
252
+ throw new HttpError(400, "该消息没有媒体");
253
+ const file = {
254
+ id: record.recordId,
255
+ messageId: record.messageId,
256
+ chatId: record.chatId,
257
+ mediaType: record.mediaType ?? "",
258
+ fileName: `${record.messageId}`,
259
+ mimeType: record.mimeType
260
+ };
261
+ if (request.query.size === "full") {
262
+ if (live === undefined)
263
+ throw new HttpError(503, "archive console needs a Telegram session");
264
+ if (isPhotoLike(file)) {
265
+ return sendLiveFull(reply, file, sessions, store, logger, request.query.download === "1");
266
+ }
267
+ return serveLiveStream(request, reply, live, file, await store.getChatUsername(file.chatId), request.query.download === "1");
268
+ }
269
+ const cached = thumbCacheGet(recordId, thumbCache);
270
+ if (cached) {
271
+ thumbHeaders(reply, cached.mime, cached.bytes.length, record.messageId, request.query.download === "1");
272
+ return reply.send(cached.bytes);
273
+ }
274
+ const negative = negativeCacheGet(recordId, negativeCache);
275
+ if (negative)
276
+ throw new HttpError(negative.status, negative.message);
277
+ const result = await fetchLiveThumb(file, sessions, {
278
+ chatUsername: await store.getChatUsername(file.chatId),
279
+ logger
280
+ });
281
+ if (!result.ok) {
282
+ if (result.missing) {
283
+ negativeCachePut(recordId, 410, "消息已从 Telegram 删除或会话无法访问", negativeCache);
284
+ throw new HttpError(410, "消息已从 Telegram 删除或会话无法访问");
285
+ }
286
+ if (result.noThumb) {
287
+ negativeCachePut(recordId, 404, "该媒体没有可用的缩略图", negativeCache);
288
+ throw new HttpError(404, "该媒体没有可用的缩略图");
289
+ }
290
+ throw new HttpError(404, "无法从 Telegram 取回该媒体");
291
+ }
292
+ thumbCachePut(recordId, result.bytes, result.mime, thumbCache);
293
+ thumbHeaders(reply, result.mime, result.bytes.length, record.messageId, request.query.download === "1");
294
+ return reply.send(result.bytes);
295
+ }
296
+ catch (error) {
297
+ return sendError(reply, error, logger);
298
+ }
299
+ });
300
+ server.get("/api/mediafiles/:id/file", async (request, reply) => {
301
+ try {
302
+ const file = await store.getMediaFileById(recordIdOr(request.params.id));
303
+ if (!file)
304
+ throw new HttpError(404, "媒体记录不存在");
305
+ const info = await diskMediaInfo(file, mediaDir);
306
+ if (!info)
307
+ throw new HttpError(404, "媒体文件未落盘");
308
+ return sendMediaStream(request, reply, file, info.path, info.size, file.mimeType);
309
+ }
310
+ catch (error) {
311
+ return sendError(reply, error, logger);
312
+ }
313
+ });
314
+ server.get("/api/mediafiles/:id/live", async (request, reply) => {
315
+ try {
316
+ if (live === undefined || !session || !sessions)
317
+ throw new HttpError(503, "archive console needs a Telegram session");
318
+ const file = await store.getMediaFileById(recordIdOr(request.params.id));
319
+ if (!file)
320
+ throw new HttpError(404, "媒体记录不存在");
321
+ if (isPhotoLike(file)) {
322
+ return sendLiveFull(reply, file, sessions, store, logger, request.query.download === "1");
323
+ }
324
+ return serveLiveStream(request, reply, live, file, await store.getChatUsername(file.chatId), request.query.download === "1");
325
+ }
326
+ catch (error) {
327
+ return sendError(reply, error, logger);
328
+ }
329
+ });
330
+ }
331
+ async function sendMediaStream(request, reply, file, path, size, storedMime) {
332
+ const mime = storedMime?.trim() || mimeFromName(path);
333
+ const name = fileNameOf(file, path);
334
+ reply.header("content-type", mime);
335
+ reply.header("accept-ranges", "bytes");
336
+ reply.header("cache-control", "private, max-age=300");
337
+ if (request.query.download === "1") {
338
+ reply.header("content-disposition", `attachment; filename="${name}"`);
339
+ }
340
+ const range = request.headers.range;
341
+ if (range) {
342
+ const part = parseRange(range, size);
343
+ if (!part) {
344
+ reply.header("content-type", "application/json; charset=utf-8");
345
+ reply.code(416).header("content-range", `bytes */${size}`);
346
+ return reply.send({ error: "range 请求无效" });
347
+ }
348
+ reply.code(206);
349
+ reply.header("content-range", `bytes ${part.start}-${part.end}/${size}`);
350
+ reply.header("content-length", String(part.end - part.start + 1));
351
+ return reply.send(createReadStream(path, { start: part.start, end: part.end }));
352
+ }
353
+ reply.header("content-length", String(size));
354
+ return reply.send(createReadStream(path));
355
+ }
356
+ function sendDownloadHeaders(reply, file, mime, size, download) {
357
+ reply.header("content-type", mime);
358
+ reply.header("content-length", String(size));
359
+ if (download) {
360
+ const name = fileNameOf(file, "");
361
+ reply.header("content-disposition", `attachment; filename="${name}"`);
362
+ }
363
+ }
364
+ /** 在线媒体直通:字节区间(含渐进整段)直接转发,错误统一映射为 HTTP。 */
365
+ async function serveLiveStream(request, reply, live, file, chatUsername, download) {
366
+ try {
367
+ const stream = await live.serve(request, reply, file, chatUsername, download);
368
+ if (stream === undefined)
369
+ return undefined;
370
+ return reply.send(stream);
371
+ }
372
+ catch (error) {
373
+ if (error instanceof LiveMediaError)
374
+ throw new HttpError(error.status, error.message);
375
+ throw error;
376
+ }
377
+ }
378
+ /** 整图在线取回(预览器用):不经缩略图缓存,直接透传 Telegram 字节。 */
379
+ async function sendLiveFull(reply, file, sessions, store, logger, download) {
380
+ const result = await fetchLiveMedia(file, sessions, {
381
+ chatUsername: await store.getChatUsername(file.chatId),
382
+ logger
383
+ });
384
+ if (!result.ok) {
385
+ throw new HttpError(result.missing ? 410 : 404, result.missing ? "消息已从 Telegram 删除或会话无法访问" : "无法从 Telegram 取回该媒体");
386
+ }
387
+ sendDownloadHeaders(reply, file, result.mime, result.bytes.length, download);
388
+ reply.header("cache-control", "no-store");
389
+ return reply.send(result.bytes);
390
+ }
391
+ function thumbHeaders(reply, mime, size, messageId, download) {
392
+ reply.header("content-type", mime);
393
+ reply.header("content-length", String(size));
394
+ if (download) {
395
+ reply.header("content-disposition", `attachment; filename="${messageId}${extFromMime(mime)}"`);
396
+ }
397
+ reply.header("cache-control", "private, max-age=3600");
398
+ }
399
+ function thumbCacheGet(recordId, cache) {
400
+ const hit = cache.get(recordId);
401
+ if (hit === undefined)
402
+ return undefined;
403
+ if (Date.now() >= hit.expires) {
404
+ cache.delete(recordId);
405
+ return undefined;
406
+ }
407
+ cache.delete(recordId);
408
+ cache.set(recordId, hit);
409
+ return hit;
410
+ }
411
+ function thumbCachePut(recordId, bytes, mime, cache) {
412
+ if (cache.size >= THUMB_CACHE_MAX) {
413
+ const oldest = cache.keys().next().value;
414
+ if (oldest !== undefined)
415
+ cache.delete(oldest);
416
+ }
417
+ cache.set(recordId, { bytes, mime, expires: Date.now() + THUMB_TTL_MS });
418
+ }
419
+ function negativeCacheGet(recordId, cache) {
420
+ const hit = cache.get(recordId);
421
+ if (hit === undefined)
422
+ return undefined;
423
+ if (Date.now() >= hit.expires) {
424
+ cache.delete(recordId);
425
+ return undefined;
426
+ }
427
+ return hit;
428
+ }
429
+ function negativeCachePut(recordId, status, message, cache) {
430
+ cache.set(recordId, { status, message, expires: Date.now() + THUMB_NEGATIVE_TTL_MS });
431
+ }
432
+ function liveTextCacheGet(recordId, cache) {
433
+ const hit = cache.get(recordId);
434
+ if (hit === undefined || Date.now() >= hit.expires) {
435
+ cache.delete(recordId);
436
+ return undefined;
437
+ }
438
+ return hit.text === "" ? undefined : hit;
439
+ }
440
+ function liveTextCachePut(recordId, entry, cache) {
441
+ cache.set(recordId, { ...entry, expires: Date.now() + LIVE_TEXT_TTL_MS });
442
+ }
443
+ function liveTextCacheNeg(recordId, cache) {
444
+ cache.set(recordId, { text: "", entities: [], expires: Date.now() + THUMB_NEGATIVE_TTL_MS });
445
+ }
446
+ /** 在线说明:从 Telegram 实时取回消息原始文本与实体(相册取全部成员的最长文本),原样返回。 */
447
+ async function fetchLiveCaptionText(sessions, store, logger, record) {
448
+ const targets = albumTargetsOf(record);
449
+ try {
450
+ const chatUsername = await store.getChatUsername(record.chatId);
451
+ return await sessions.run(async (client) => {
452
+ const host = client;
453
+ const entity = await resolveChatEntity(host, record.chatId, chatUsername);
454
+ if (entity === undefined)
455
+ return undefined;
456
+ const messages = await host.getMessages(entity, { ids: targets });
457
+ let best;
458
+ for (const message of messages) {
459
+ if (message === undefined || message === null)
460
+ continue;
461
+ const text = String(message.rawText ?? message.message ?? "").trim();
462
+ if (best === undefined || text.length > best.text.length) {
463
+ best = { text, entities: normalizeEntities(message.entities) };
464
+ }
465
+ }
466
+ if (best === undefined || best.text === "")
467
+ return undefined;
468
+ return { text: best.text, entities: best.entities };
469
+ });
470
+ }
471
+ catch (error) {
472
+ if (isMissingPeer(error)) {
473
+ logger.debug("live caption peer missing for message " + record.recordId);
474
+ return undefined;
475
+ }
476
+ throw error;
477
+ }
478
+ }
479
+ /** 相册取全部成员的消息 ID(上限 20),普通消息取自身。 */
480
+ function albumTargetsOf(record) {
481
+ const ids = record.albumRows.length > 0
482
+ ? record.albumRows.map((row) => row.messageId)
483
+ : [record.messageId];
484
+ return [...new Set(ids)].slice(0, 20);
485
+ }
486
+ function sendError(reply, error, logger) {
487
+ if (error instanceof HttpError)
488
+ return reply.code(error.status).send({ error: error.message });
489
+ const message = error instanceof Error ? error.message : String(error);
490
+ logger.error("archive console request failed", error);
491
+ return reply.code(500).send({ error: message });
492
+ }
493
+ class HttpError extends Error {
494
+ status;
495
+ constructor(status, message) {
496
+ super(message);
497
+ this.status = status;
498
+ }
499
+ }
500
+ function recordIdOr(value) {
501
+ try {
502
+ return normalizeRecordId(value);
503
+ }
504
+ catch (error) {
505
+ throw new HttpError(400, errorMessage(error));
506
+ }
507
+ }
508
+ function dateOr(value) {
509
+ try {
510
+ return normalizeDate(value);
511
+ }
512
+ catch (error) {
513
+ throw new HttpError(400, errorMessage(error));
514
+ }
515
+ }
516
+ function modeOr(value) {
517
+ try {
518
+ return normalizeTimeMode(value);
519
+ }
520
+ catch (error) {
521
+ throw new HttpError(400, errorMessage(error));
522
+ }
523
+ }
524
+ function intOr(value) {
525
+ if (value === undefined || value.trim() === "")
526
+ return undefined;
527
+ return Number(value);
528
+ }
529
+ function text(value) {
530
+ const result = value?.trim();
531
+ return result || undefined;
532
+ }
533
+ /** 逗号分隔的用户 ID 列表:trim + 去空,上限 50;空串等价于未指定。 */
534
+ function usersOr(value) {
535
+ if (value === undefined || value.trim() === "")
536
+ return undefined;
537
+ const users = value.split(",").map((part) => part.trim()).filter(Boolean);
538
+ if (users.length > 50)
539
+ throw new HttpError(400, "用户数量超过上限(50)");
540
+ return users;
541
+ }
542
+ /** 逗号分隔的会话 ID 列表:trim + 去空,上限 50;空串等价于未指定。 */
543
+ function chatIdsOr(value) {
544
+ if (value === undefined || value.trim() === "")
545
+ return undefined;
546
+ const chats = value.split(",").map((part) => part.trim()).filter(Boolean);
547
+ if (chats.length > 50)
548
+ throw new HttpError(400, "群组数量超过上限(50)");
549
+ return chats;
550
+ }
551
+ /** 转发来源参数:纯数字按 ID 精确匹配,否则按显示名包含匹配(大小写不敏感)。 */
552
+ function forwardIdOr(value) {
553
+ const result = text(value);
554
+ return result && /^\d+$/.test(result) ? result : undefined;
555
+ }
556
+ function forwardNameOr(value) {
557
+ const result = text(value);
558
+ return result && /^\d+$/.test(result) ? undefined : result;
559
+ }
560
+ /** 发送者 ID:trim + 长度校验(负 ID / 频道 ID 合法,不做数字限制)。 */
561
+ function senderIdOr(value) {
562
+ const result = value.trim();
563
+ if (result === "" || result.length > 64)
564
+ throw new HttpError(400, "用户 ID 需为 1-64 字符");
565
+ return result;
566
+ }
567
+ function errorMessage(error) {
568
+ return error instanceof Error ? error.message : String(error);
569
+ }
570
+ /** 关停时释放 keep-alive 连接,避免 server.close 长期挂起。 */
571
+ function releaseIdleConnections(server) {
572
+ let attempts = 0;
573
+ const tick = () => {
574
+ server.server.closeIdleConnections();
575
+ attempts += 1;
576
+ if (attempts >= 5)
577
+ return;
578
+ const timer = setTimeout(tick, 100);
579
+ timer.unref();
580
+ };
581
+ tick();
582
+ }
583
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../../packages/archive/src/console/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAClJ,OAAO,EAAE,iBAAiB,EAAwB,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAW7K,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB,0CAA0C;AAC1C,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AACrC,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,+CAA+C;AAC/C,MAAM,qBAAqB,GAAG,EAAE,GAAG,KAAK,CAAC;AACzC,sCAAsC;AACtC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAExC,MAAM,UAAU,0BAA0B,CAAC,OAAoC;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;IACvD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ;QAC9C,CAAC,CAAC,IAAI,iBAAiB,CAAC;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACnC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,eAAe,CAAC,CAAC,KAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,KAAK,YAAY,SAAS;YACvC,CAAC,CAAC,KAAK,CAAC,MAAM;YACd,CAAC,CAAE,KAAiC,CAAC,UAAU,IAAI,GAAG,CAAC;QACzD,IAAI,MAAM,IAAI,GAAG;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAChF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CACrB,MAAuB,EACvB,OAAoC,EACpC,UAAoC,EACpC,aAAyC,EACzC,aAA8C,EAC9C,IAAmC;IAEnC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ;YACpC,OAAO,EAAE,OAAO,IAAI,IAAI;YACxB,QAAQ,EAAE,QAAQ,IAAI,IAAI;YAC1B,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE;YAC3E,YAAY,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE;SAClF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAElE,MAAM,CAAC,IAAI,CAA+B,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACpF,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACpE,IAAI,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAA+B,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACrF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEtE,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QACtD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC;YACxC,MAAM;YACN,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAClC,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CAA6B,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACnF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAMP,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC;gBAC1C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBACnC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBAChC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC5B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAChC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC/B,aAAa,EAAE,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC7C,eAAe,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC;gBACjD,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;aAC7C,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CACR,mBAAmB,EACnB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,2BAA2B,EAC3B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YACxE,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YAClG,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CACR,cAAc,EACd,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,aAAa,CAAC;gBAC/B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;gBAChC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,0BAA0B,EAC1B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACtG,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACpD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,2BAA2B,EAC3B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,uBAAuB,EACvB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC1F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC;gBAC7C,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;gBAChC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACtC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9B,SAAS;aACV,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACnD,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,6BAA6B,EAC7B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;YAChG,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACzD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;gBAC1C,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;YACtD,CAAC;YACD,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YACnD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CAA6B,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACrF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CACR,yBAAyB,EACzB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;YAChG,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAoB;gBAC5B,EAAE,EAAE,MAAM,CAAC,QAAQ;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;gBACjC,QAAQ,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE;gBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;YACF,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAClC,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;gBAC7F,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;gBAC5F,CAAC;gBACD,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;YAC/H,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACnD,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;gBACxG,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC3D,IAAI,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;gBAClD,YAAY,EAAE,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;gBACtD,MAAM;aACP,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,yBAAyB,EAAE,aAAa,CAAC,CAAC;oBAC1E,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;oBAC9D,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1C,CAAC;gBACD,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;YACjD,CAAC;YACD,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC/D,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;YACxG,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,0BAA0B,EAC1B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC/C,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,0BAA0B,EAC1B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;YACtH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC/C,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;QAC/H,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAA+D,EAC/D,KAAmB,EACnB,IAAqB,EACrB,IAAY,EACZ,IAAY,EACZ,UAA8B;IAE9B,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACnC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,IAAI,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;QACzE,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAmB,EACnB,IAAqB,EACrB,IAAY,EACZ,IAAY,EACZ,QAAiB;IAEjB,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACnC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,IAAI,GAAG,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,KAAK,UAAU,eAAe,CAC5B,OAA+D,EAC/D,KAAmB,EACnB,IAAuB,EACvB,IAAqB,EACrB,YAAgC,EAChC,QAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC9E,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,cAAc;YAAE,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,6CAA6C;AAC7C,KAAK,UAAU,YAAY,CACzB,KAAmB,EACnB,IAAqB,EACrB,QAAuB,EACvB,KAAmB,EACnB,MAAqB,EACrB,QAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;QAClD,YAAY,EAAE,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QACtD,MAAM;KACP,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CACjB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,oBAAoB,CAClE,CAAC;IACJ,CAAC;IACD,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7E,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CACnB,KAAmB,EACnB,IAAY,EACZ,IAAY,EACZ,SAAiB,EACjB,QAAiB;IAEjB,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACnC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjG,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;AACzD,CAAC;AAQD,SAAS,aAAa,CAAC,QAAgB,EAAE,KAA+B;IACtE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,KAAa,EAAE,IAAY,EAAE,KAA+B;IACnG,IAAI,KAAK,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACzC,IAAI,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;AAC3E,CAAC;AAQD,SAAS,gBAAgB,CAAC,QAAgB,EAAE,KAAiC;IAC3E,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,MAAc,EAAE,OAAe,EAAE,KAAiC;IAC5G,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,EAAE,CAAC,CAAC;AACxF,CAAC;AAQD,SAAS,gBAAgB,CAAC,QAAgB,EAAE,KAAsC;IAChF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACnD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,KAA2D,EAAE,KAAsC;IAC7I,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,KAAsC;IAChF,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED,wDAAwD;AACxD,KAAK,UAAU,oBAAoB,CACjC,QAAuB,EACvB,KAAmB,EACnB,MAAqB,EACrB,MAAqB;IAErB,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,MAA2D,CAAC;YACzE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAC1E,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAClE,IAAI,IAAsE,CAAC;YAC3E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;oBAAE,SAAS;gBACxD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACzD,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjE,CAAC;YACH,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE;gBAAE,OAAO,SAAS,CAAC;YAC7D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,wCAAwC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,SAAS,cAAc,CAAC,MAAqB;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACrC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;QAC9C,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,KAAmB,EAAE,KAAc,EAAE,MAAqB;IAC3E,IAAI,KAAK,YAAY,SAAS;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,SAAU,SAAQ,KAAK;IAEhB,MAAM;IADjB,YACW,MAAc,EACvB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;IAIjB,CAAC;CACF;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC;QACH,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB;IACvC,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB;IACvC,IAAI,CAAC;QACH,OAAO,iBAAiB,CAAC,KAA6B,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,KAAyB;IACtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACjE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,IAAI,CAAC,KAAyB;IACrC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC7B,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED,8CAA8C;AAC9C,SAAS,OAAO,CAAC,KAAyB;IACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8CAA8C;AAC9C,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8CAA8C;AAC9C,SAAS,WAAW,CAAC,KAAyB;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AAC7D,CAAC;AAED,kDAAkD;AAClD,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACtF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,gDAAgD;AAChD,SAAS,sBAAsB,CAAC,MAAuB;IACrD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QACrC,QAAQ,IAAI,CAAC,CAAC;QACd,IAAI,QAAQ,IAAI,CAAC;YAAE,OAAO;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Service } from "@paperkite/sdk";
2
+ export interface ArchiveConsoleWebConfig {
3
+ readonly url?: string;
4
+ readonly schema?: string;
5
+ /** 落盘媒体的解析根目录;相对路径的 file_path 以此为基准。 */
6
+ readonly mediaDir?: string;
7
+ readonly host?: string;
8
+ readonly port?: number;
9
+ readonly publicDir?: string;
10
+ }
11
+ export declare class ArchiveConsoleWebService extends Service<ArchiveConsoleWebConfig> {
12
+ run(): Promise<void>;
13
+ }