@aigne/afs-dingtalk 1.11.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,298 @@
1
+ const require_client = require('./client.cjs');
2
+ const require_decorate = require('./_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs');
3
+ let _aigne_afs_provider = require("@aigne/afs/provider");
4
+ let _aigne_afs_messaging = require("@aigne/afs-messaging");
5
+
6
+ //#region src/index.ts
7
+ var AFSDingTalk = class extends _aigne_afs_messaging.BaseMessageProvider {
8
+ static manifest() {
9
+ return {
10
+ name: "dingtalk",
11
+ description: "DingTalk (钉钉) messaging — webhook or bot API with auto token refresh.\n- Webhook mode for simple outbound notifications\n- Bot mode with app credentials for bidirectional messaging\n- Path: /:bot/conversations/:convId/messages/:msgId",
12
+ uriTemplate: "dingtalk://{appKey}",
13
+ category: "messaging",
14
+ schema: {
15
+ type: "object",
16
+ properties: {
17
+ appKey: {
18
+ type: "string",
19
+ description: "DingTalk App Key"
20
+ },
21
+ appSecret: {
22
+ type: "string",
23
+ description: "DingTalk App Secret",
24
+ sensitive: true
25
+ },
26
+ webhook: {
27
+ type: "string",
28
+ description: "Webhook access token for outbound-only mode",
29
+ sensitive: true
30
+ },
31
+ conversations: {
32
+ type: "array",
33
+ items: { type: "string" },
34
+ description: "Conversation IDs"
35
+ }
36
+ }
37
+ },
38
+ tags: [
39
+ "dingtalk",
40
+ "messaging",
41
+ "chat",
42
+ "enterprise"
43
+ ],
44
+ capabilityTags: [
45
+ "read-write",
46
+ "crud",
47
+ "search",
48
+ "auth:token",
49
+ "remote",
50
+ "http",
51
+ "real-time",
52
+ "rate-limited"
53
+ ],
54
+ security: {
55
+ riskLevel: "external",
56
+ resourceAccess: ["internet"],
57
+ notes: ["Connects to DingTalk API — requires app credentials or webhook token"]
58
+ },
59
+ capabilities: { network: {
60
+ egress: true,
61
+ allowedDomains: ["oapi.dingtalk.com", "api.dingtalk.com"]
62
+ } }
63
+ };
64
+ }
65
+ static treeSchema() {
66
+ return {
67
+ operations: [
68
+ "list",
69
+ "read",
70
+ "exec",
71
+ "stat",
72
+ "explain"
73
+ ],
74
+ tree: {
75
+ "/": {
76
+ kind: "messaging:root",
77
+ operations: ["list", "exec"],
78
+ actions: [
79
+ "add-bot",
80
+ "remove-bot",
81
+ "process-event"
82
+ ]
83
+ },
84
+ "/{bot}": {
85
+ kind: "messaging:bot",
86
+ operations: ["list", "read"]
87
+ },
88
+ "/{bot}/ctl": {
89
+ kind: "messaging:status",
90
+ operations: ["read"]
91
+ },
92
+ "/{bot}/conversations": {
93
+ kind: "messaging:conversations",
94
+ operations: ["list"]
95
+ },
96
+ "/{bot}/conversations/{convId}": {
97
+ kind: "messaging:conversation",
98
+ operations: ["list"]
99
+ },
100
+ "/{bot}/conversations/{convId}/messages": {
101
+ kind: "messaging:messages",
102
+ operations: ["list", "exec"],
103
+ actions: ["send"]
104
+ },
105
+ "/{bot}/conversations/{convId}/messages/{msgId}": {
106
+ kind: "messaging:message",
107
+ operations: ["read"]
108
+ }
109
+ },
110
+ auth: {
111
+ type: "custom",
112
+ env: ["DINGTALK_APP_KEY", "DINGTALK_APP_SECRET"]
113
+ },
114
+ bestFor: [
115
+ "enterprise messaging",
116
+ "workflow alerts",
117
+ "team notifications"
118
+ ],
119
+ notFor: ["file storage", "database queries"]
120
+ };
121
+ }
122
+ providerName = "dingtalk";
123
+ eventPrefix = "dingtalk";
124
+ constructor(options) {
125
+ let bots;
126
+ if (options.bots) bots = options.bots;
127
+ else {
128
+ if (!options.webhook && !options.appKey) throw new Error("AFSDingTalk requires either webhook or appKey + appSecret");
129
+ bots = [{
130
+ name: "default",
131
+ webhook: options.webhook,
132
+ appKey: options.appKey,
133
+ appSecret: options.appSecret,
134
+ conversations: options.conversations ?? [],
135
+ legacyApiBase: options.legacyApiBase,
136
+ newApiBase: options.newApiBase
137
+ }];
138
+ }
139
+ super({
140
+ bots,
141
+ bufferSize: options.bufferSize
142
+ });
143
+ }
144
+ getMessageCapabilities() {
145
+ return {
146
+ formats: {
147
+ send: ["text", "markdown"],
148
+ receive: ["text"]
149
+ },
150
+ maxMessageLength: 2e4,
151
+ features: {
152
+ edit: false,
153
+ delete: false,
154
+ reply: false,
155
+ thread: false,
156
+ reaction: false,
157
+ inlineKeyboard: true
158
+ },
159
+ limits: {
160
+ messagesPerSecond: 20,
161
+ messagesPerMinute: 600
162
+ }
163
+ };
164
+ }
165
+ createBotClient(config) {
166
+ const webhook = config.webhook;
167
+ const appKey = config.appKey;
168
+ const appSecret = config.appSecret;
169
+ const legacyApiBase = config.legacyApiBase;
170
+ const newApiBase = config.newApiBase;
171
+ if (appKey && appSecret) return require_client.DingTalkClient.bot({
172
+ appKey,
173
+ appSecret,
174
+ legacyApiBase,
175
+ newApiBase
176
+ });
177
+ if (webhook) return require_client.DingTalkClient.webhook(webhook);
178
+ throw new Error(`DingTalk bot "${config.name}" requires webhook or appKey + appSecret`);
179
+ }
180
+ async sendMessage(client, convId, text, _opts) {
181
+ const dc = client;
182
+ if (dc.mode === "bot") {
183
+ await dc.sendGroupMessage(convId, text);
184
+ return { messageId: String(Date.now()) };
185
+ }
186
+ await dc.sendWebhook(text);
187
+ return { messageId: String(Date.now()) };
188
+ }
189
+ async sendTypingIndicator(_client, _convId) {}
190
+ normalizeMessage(raw) {
191
+ const msg = raw;
192
+ return {
193
+ id: String(msg.msgId ?? msg.id ?? "0"),
194
+ text: String(msg.content ?? msg.text?.content ?? ""),
195
+ from: this.normalizeSender({
196
+ id: msg.senderStaffId,
197
+ name: msg.senderNick
198
+ }),
199
+ timestamp: msg.createAt ? Math.floor(Number(msg.createAt) / 1e3) : Math.floor(Date.now() / 1e3),
200
+ conversationId: String(msg.conversationId ?? ""),
201
+ platform: {
202
+ conversationType: msg.conversationType,
203
+ msgtype: msg.msgtype
204
+ }
205
+ };
206
+ }
207
+ normalizeSender(raw) {
208
+ return {
209
+ id: String(raw.id ?? raw.senderStaffId ?? "0"),
210
+ name: String(raw.name ?? raw.senderNick ?? ""),
211
+ isBot: raw.isBot
212
+ };
213
+ }
214
+ async listRootActions(_ctx) {
215
+ return { data: [
216
+ this.buildEntry("/.actions/add-bot", { meta: { description: "Add a bot instance at runtime" } }),
217
+ this.buildEntry("/.actions/remove-bot", { meta: { description: "Remove a bot instance" } }),
218
+ this.buildEntry("/.actions/process-event", { meta: { description: "Process an incoming DingTalk outgoing webhook callback" } })
219
+ ] };
220
+ }
221
+ async execProcessEvent(_ctx, args) {
222
+ this._processEvent(args);
223
+ return {
224
+ success: true,
225
+ data: { ok: true }
226
+ };
227
+ }
228
+ /** Process a DingTalk outgoing webhook payload — delegates to emitMessageReceived(). */
229
+ _processEvent(payload) {
230
+ const parsed = require_client.DingTalkClient.parseEvent(payload);
231
+ if (!parsed) return;
232
+ const { msgId, content, conversationId, senderStaffId, senderNick, createAt } = parsed;
233
+ const botName = this._botOrder[0] ?? "default";
234
+ this.emitMessageReceived(botName, {
235
+ id: msgId,
236
+ text: content,
237
+ from: {
238
+ id: senderStaffId,
239
+ name: senderNick
240
+ },
241
+ timestamp: Math.floor(createAt / 1e3),
242
+ conversationId,
243
+ platform: { conversationType: parsed.conversationType }
244
+ });
245
+ }
246
+ /** Add a conversation to a bot. Defaults to first bot. */
247
+ addConversation(conversationId, botName) {
248
+ const name = botName ?? this._botOrder[0];
249
+ if (!name) return;
250
+ const convs = this._botConversations.get(name);
251
+ if (!convs || convs.has(conversationId)) return;
252
+ convs.add(conversationId);
253
+ const buffers = this._botBuffers.get(name);
254
+ if (buffers && !buffers.has(conversationId)) buffers.set(conversationId, []);
255
+ }
256
+ /** Remove a conversation from a bot. */
257
+ removeConversation(conversationId, botName) {
258
+ const name = botName ?? this._botOrder[0];
259
+ if (!name) return;
260
+ const convs = this._botConversations.get(name);
261
+ if (convs) convs.delete(conversationId);
262
+ const buffers = this._botBuffers.get(name);
263
+ if (buffers) buffers.delete(conversationId);
264
+ }
265
+ /** Add a message to the ring buffer directly. Public for testing/conformance. */
266
+ _addToBuffer(conversationId, msg) {
267
+ const botName = this._botOrder[0] ?? "default";
268
+ const convs = this._botConversations.get(botName);
269
+ if (convs && !convs.has(conversationId)) convs.add(conversationId);
270
+ let botBuffers = this._botBuffers.get(botName);
271
+ if (!botBuffers) {
272
+ botBuffers = /* @__PURE__ */ new Map();
273
+ this._botBuffers.set(botName, botBuffers);
274
+ }
275
+ let buffer = botBuffers.get(conversationId);
276
+ if (!buffer) {
277
+ buffer = [];
278
+ botBuffers.set(conversationId, buffer);
279
+ }
280
+ buffer.push({
281
+ id: msg.msgId,
282
+ text: msg.content,
283
+ from: {
284
+ id: msg.senderStaffId,
285
+ name: msg.senderNick
286
+ },
287
+ timestamp: msg.createAt ? Math.floor(msg.createAt / 1e3) : Math.floor(Date.now() / 1e3),
288
+ conversationId,
289
+ platform: {}
290
+ });
291
+ while (buffer.length > this._bufferSize) buffer.shift();
292
+ }
293
+ };
294
+ require_decorate.__decorate([(0, _aigne_afs_provider.Actions)("/")], AFSDingTalk.prototype, "listRootActions", null);
295
+ require_decorate.__decorate([_aigne_afs_provider.Actions.Exec("/", "process-event")], AFSDingTalk.prototype, "execProcessEvent", null);
296
+
297
+ //#endregion
298
+ exports.AFSDingTalk = AFSDingTalk;
@@ -0,0 +1,107 @@
1
+ import { DingTalkClient, DingTalkEvent } from "./client.cjs";
2
+ import { AFSExecResult, AFSListResult, ProviderTreeSchema } from "@aigne/afs";
3
+ import { RouteContext } from "@aigne/afs/provider";
4
+ import { BaseMessageProvider, BotConfig, BufferedMessage, MessageCapabilities, MessageSender, SendOptions } from "@aigne/afs-messaging";
5
+
6
+ //#region src/index.d.ts
7
+ interface AFSDingTalkOptions {
8
+ /** Multi-bot config */
9
+ bots?: Array<{
10
+ name: string; /** Webhook access token (Custom Robot mode) */
11
+ webhook?: string; /** App key (Enterprise Internal Bot mode) */
12
+ appKey?: string; /** App secret (Enterprise Internal Bot mode) */
13
+ appSecret?: string;
14
+ conversations?: string[];
15
+ legacyApiBase?: string;
16
+ newApiBase?: string;
17
+ }>;
18
+ /** Single-bot shorthand: webhook access token */
19
+ webhook?: string;
20
+ /** Single-bot shorthand: app key (bot mode) */
21
+ appKey?: string;
22
+ /** Single-bot shorthand: app secret (bot mode) */
23
+ appSecret?: string;
24
+ /** Single-bot shorthand: conversation IDs */
25
+ conversations?: string[];
26
+ legacyApiBase?: string;
27
+ newApiBase?: string;
28
+ bufferSize?: number;
29
+ }
30
+ declare class AFSDingTalk extends BaseMessageProvider {
31
+ static manifest(): {
32
+ name: string;
33
+ description: string;
34
+ uriTemplate: string;
35
+ category: string;
36
+ schema: {
37
+ type: string;
38
+ properties: {
39
+ appKey: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ appSecret: {
44
+ type: string;
45
+ description: string;
46
+ sensitive: boolean;
47
+ };
48
+ webhook: {
49
+ type: string;
50
+ description: string;
51
+ sensitive: boolean;
52
+ };
53
+ conversations: {
54
+ type: string;
55
+ items: {
56
+ type: string;
57
+ };
58
+ description: string;
59
+ };
60
+ };
61
+ };
62
+ tags: string[];
63
+ capabilityTags: string[];
64
+ security: {
65
+ riskLevel: string;
66
+ resourceAccess: string[];
67
+ notes: string[];
68
+ };
69
+ capabilities: {
70
+ network: {
71
+ egress: boolean;
72
+ allowedDomains: string[];
73
+ };
74
+ };
75
+ };
76
+ static treeSchema(): ProviderTreeSchema;
77
+ readonly providerName = "dingtalk";
78
+ readonly eventPrefix = "dingtalk";
79
+ constructor(options: AFSDingTalkOptions);
80
+ getMessageCapabilities(): MessageCapabilities;
81
+ createBotClient(config: BotConfig): DingTalkClient;
82
+ sendMessage(client: unknown, convId: string, text: string, _opts?: SendOptions): Promise<{
83
+ messageId: string;
84
+ }>;
85
+ sendTypingIndicator(_client: unknown, _convId: string): Promise<void>;
86
+ normalizeMessage(raw: Record<string, unknown>): BufferedMessage;
87
+ normalizeSender(raw: Record<string, unknown>): MessageSender;
88
+ listRootActions(_ctx: RouteContext): Promise<AFSListResult>;
89
+ execProcessEvent(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult>;
90
+ /** Process a DingTalk outgoing webhook payload — delegates to emitMessageReceived(). */
91
+ _processEvent(payload: any): void;
92
+ /** Add a conversation to a bot. Defaults to first bot. */
93
+ addConversation(conversationId: string, botName?: string): void;
94
+ /** Remove a conversation from a bot. */
95
+ removeConversation(conversationId: string, botName?: string): void;
96
+ /** Add a message to the ring buffer directly. Public for testing/conformance. */
97
+ _addToBuffer(conversationId: string, msg: {
98
+ msgId: string;
99
+ content: string;
100
+ senderStaffId: string;
101
+ senderNick: string;
102
+ createAt?: number;
103
+ }): void;
104
+ }
105
+ //#endregion
106
+ export { AFSDingTalk, AFSDingTalkOptions, type DingTalkClient, type DingTalkEvent };
107
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,kBAAA;EA2BJ;EAzBX,IAAA,GAAO,KAAA;IACL,IAAA,UAuEmB;IArEnB,OAAA,WA+HwB;IA7HxB,MAAA,WAmJkC;IAjJlC,SAAA;IACA,aAAA;IACA,aAAA;IACA,UAAA;EAAA;EAsMmB;EAnMrB,OAAA;EA8M4B;EA5M5B,MAAA;EA4M2C;EA1M3C,SAAA;EA6NQ;EA3NR,aAAA;EACA,aAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,cAGW,WAAA,SAAoB,mBAAA;EAAA,OACxB,QAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA8CA,UAAA,CAAA,GAAc,kBAAA;EAAA,SA6BZ,YAAA;EAAA,SACA,WAAA;cAEG,OAAA,EAAS,kBAAA;EA0BrB,sBAAA,CAAA,GAA0B,mBAAA;EAsB1B,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,cAAA;EAgB9B,WAAA,CACJ,MAAA,WACA,MAAA,UACA,IAAA,UACA,KAAA,GAAQ,WAAA,GACP,OAAA;IAAU,SAAA;EAAA;EAaP,mBAAA,CAAoB,OAAA,WAAkB,OAAA,WAAkB,OAAA;EAE9D,gBAAA,CAAiB,GAAA,EAAK,MAAA,oBAA0B,eAAA;EAoBhD,eAAA,CAAgB,GAAA,EAAK,MAAA,oBAA0B,aAAA;EAWzC,eAAA,CAAgB,IAAA,EAAM,YAAA,GAAe,OAAA,CAAQ,aAAA;EAiB7C,gBAAA,CACJ,IAAA,EAAM,YAAA,EACN,IAAA,EAAM,MAAA,oBACL,OAAA,CAAQ,aAAA;EAnDX;EA2DA,aAAA,CAAc,OAAA;EA3DG;EAiFjB,eAAA,CAAgB,cAAA,UAAwB,OAAA;EA7DxC;EA0EA,kBAAA,CAAmB,cAAA,UAAwB,OAAA;EA1E3B;EAoFhB,YAAA,CACE,cAAA,UACA,GAAA;IACE,KAAA;IACA,OAAA;IACA,aAAA;IACA,UAAA;IACA,QAAA;EAAA;AAAA"}
@@ -0,0 +1,107 @@
1
+ import { DingTalkClient, DingTalkEvent } from "./client.mjs";
2
+ import { RouteContext } from "@aigne/afs/provider";
3
+ import { BaseMessageProvider, BotConfig, BufferedMessage, MessageCapabilities, MessageSender, SendOptions } from "@aigne/afs-messaging";
4
+ import { AFSExecResult, AFSListResult, ProviderTreeSchema } from "@aigne/afs";
5
+
6
+ //#region src/index.d.ts
7
+ interface AFSDingTalkOptions {
8
+ /** Multi-bot config */
9
+ bots?: Array<{
10
+ name: string; /** Webhook access token (Custom Robot mode) */
11
+ webhook?: string; /** App key (Enterprise Internal Bot mode) */
12
+ appKey?: string; /** App secret (Enterprise Internal Bot mode) */
13
+ appSecret?: string;
14
+ conversations?: string[];
15
+ legacyApiBase?: string;
16
+ newApiBase?: string;
17
+ }>;
18
+ /** Single-bot shorthand: webhook access token */
19
+ webhook?: string;
20
+ /** Single-bot shorthand: app key (bot mode) */
21
+ appKey?: string;
22
+ /** Single-bot shorthand: app secret (bot mode) */
23
+ appSecret?: string;
24
+ /** Single-bot shorthand: conversation IDs */
25
+ conversations?: string[];
26
+ legacyApiBase?: string;
27
+ newApiBase?: string;
28
+ bufferSize?: number;
29
+ }
30
+ declare class AFSDingTalk extends BaseMessageProvider {
31
+ static manifest(): {
32
+ name: string;
33
+ description: string;
34
+ uriTemplate: string;
35
+ category: string;
36
+ schema: {
37
+ type: string;
38
+ properties: {
39
+ appKey: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ appSecret: {
44
+ type: string;
45
+ description: string;
46
+ sensitive: boolean;
47
+ };
48
+ webhook: {
49
+ type: string;
50
+ description: string;
51
+ sensitive: boolean;
52
+ };
53
+ conversations: {
54
+ type: string;
55
+ items: {
56
+ type: string;
57
+ };
58
+ description: string;
59
+ };
60
+ };
61
+ };
62
+ tags: string[];
63
+ capabilityTags: string[];
64
+ security: {
65
+ riskLevel: string;
66
+ resourceAccess: string[];
67
+ notes: string[];
68
+ };
69
+ capabilities: {
70
+ network: {
71
+ egress: boolean;
72
+ allowedDomains: string[];
73
+ };
74
+ };
75
+ };
76
+ static treeSchema(): ProviderTreeSchema;
77
+ readonly providerName = "dingtalk";
78
+ readonly eventPrefix = "dingtalk";
79
+ constructor(options: AFSDingTalkOptions);
80
+ getMessageCapabilities(): MessageCapabilities;
81
+ createBotClient(config: BotConfig): DingTalkClient;
82
+ sendMessage(client: unknown, convId: string, text: string, _opts?: SendOptions): Promise<{
83
+ messageId: string;
84
+ }>;
85
+ sendTypingIndicator(_client: unknown, _convId: string): Promise<void>;
86
+ normalizeMessage(raw: Record<string, unknown>): BufferedMessage;
87
+ normalizeSender(raw: Record<string, unknown>): MessageSender;
88
+ listRootActions(_ctx: RouteContext): Promise<AFSListResult>;
89
+ execProcessEvent(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult>;
90
+ /** Process a DingTalk outgoing webhook payload — delegates to emitMessageReceived(). */
91
+ _processEvent(payload: any): void;
92
+ /** Add a conversation to a bot. Defaults to first bot. */
93
+ addConversation(conversationId: string, botName?: string): void;
94
+ /** Remove a conversation from a bot. */
95
+ removeConversation(conversationId: string, botName?: string): void;
96
+ /** Add a message to the ring buffer directly. Public for testing/conformance. */
97
+ _addToBuffer(conversationId: string, msg: {
98
+ msgId: string;
99
+ content: string;
100
+ senderStaffId: string;
101
+ senderNick: string;
102
+ createAt?: number;
103
+ }): void;
104
+ }
105
+ //#endregion
106
+ export { AFSDingTalk, AFSDingTalkOptions, type DingTalkClient, type DingTalkEvent };
107
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,kBAAA;EA2BJ;EAzBX,IAAA,GAAO,KAAA;IACL,IAAA,UAuEmB;IArEnB,OAAA,WA+HwB;IA7HxB,MAAA,WAmJkC;IAjJlC,SAAA;IACA,aAAA;IACA,aAAA;IACA,UAAA;EAAA;EAsMmB;EAnMrB,OAAA;EA8M4B;EA5M5B,MAAA;EA4M2C;EA1M3C,SAAA;EA6NQ;EA3NR,aAAA;EACA,aAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,cAGW,WAAA,SAAoB,mBAAA;EAAA,OACxB,QAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA8CA,UAAA,CAAA,GAAc,kBAAA;EAAA,SA6BZ,YAAA;EAAA,SACA,WAAA;cAEG,OAAA,EAAS,kBAAA;EA0BrB,sBAAA,CAAA,GAA0B,mBAAA;EAsB1B,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,cAAA;EAgB9B,WAAA,CACJ,MAAA,WACA,MAAA,UACA,IAAA,UACA,KAAA,GAAQ,WAAA,GACP,OAAA;IAAU,SAAA;EAAA;EAaP,mBAAA,CAAoB,OAAA,WAAkB,OAAA,WAAkB,OAAA;EAE9D,gBAAA,CAAiB,GAAA,EAAK,MAAA,oBAA0B,eAAA;EAoBhD,eAAA,CAAgB,GAAA,EAAK,MAAA,oBAA0B,aAAA;EAWzC,eAAA,CAAgB,IAAA,EAAM,YAAA,GAAe,OAAA,CAAQ,aAAA;EAiB7C,gBAAA,CACJ,IAAA,EAAM,YAAA,EACN,IAAA,EAAM,MAAA,oBACL,OAAA,CAAQ,aAAA;EAnDX;EA2DA,aAAA,CAAc,OAAA;EA3DG;EAiFjB,eAAA,CAAgB,cAAA,UAAwB,OAAA;EA7DxC;EA0EA,kBAAA,CAAmB,cAAA,UAAwB,OAAA;EA1E3B;EAoFhB,YAAA,CACE,cAAA,UACA,GAAA;IACE,KAAA;IACA,OAAA;IACA,aAAA;IACA,UAAA;IACA,QAAA;EAAA;AAAA"}