@moda-labs/bobi-events-core 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.
- package/LICENSE +201 -0
- package/README.md +32 -0
- package/dist/adapters/chat-sdk-slack.d.ts +18 -0
- package/dist/adapters/chat-sdk-slack.d.ts.map +1 -0
- package/dist/adapters/chat-sdk-slack.js +201 -0
- package/dist/adapters/chat-sdk-slack.js.map +1 -0
- package/dist/adapters/github.d.ts +3 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +114 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/linear.d.ts +3 -0
- package/dist/adapters/linear.d.ts.map +1 -0
- package/dist/adapters/linear.js +47 -0
- package/dist/adapters/linear.js.map +1 -0
- package/dist/adapters/whatsapp.d.ts +25 -0
- package/dist/adapters/whatsapp.d.ts.map +1 -0
- package/dist/adapters/whatsapp.js +96 -0
- package/dist/adapters/whatsapp.js.map +1 -0
- package/dist/channels.d.ts +80 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +499 -0
- package/dist/channels.js.map +1 -0
- package/dist/circuit-breaker.d.ts +79 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +288 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/conversation.d.ts +29 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +86 -0
- package/dist/conversation.js.map +1 -0
- package/dist/core.d.ts +254 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +1775 -0
- package/dist/core.js.map +1 -0
- package/package.json +40 -0
- package/src/adapters/chat-sdk-slack.ts +209 -0
- package/src/adapters/github.ts +111 -0
- package/src/adapters/linear.ts +53 -0
- package/src/adapters/whatsapp.ts +120 -0
- package/src/channels.ts +600 -0
- package/src/circuit-breaker.ts +337 -0
- package/src/conversation.ts +96 -0
- package/src/core.ts +2413 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/adapters/linear.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AAED,SAAS,WAAW,CAAC,MAA2C,EAAE,GAAW;IAC5E,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,OAAgC,EAChC,UAAU,GAAG,EAAE;IAEf,MAAM,MAAM,GAAI,OAAO,CAAC,MAAiB,IAAI,SAAS,CAAC;IACvD,MAAM,QAAQ,GAAI,OAAO,CAAC,IAAe,IAAI,SAAS,CAAC;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GACZ,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;IAC7F,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAElE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IAE9C,MAAM,MAAM,GAA8C,EAAE,MAAM,EAAE,CAAC;IACrE,IAAI,IAAI,EAAE,CAAC;QACV,IAAI,UAAU;YAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/C,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAChC,IAAI,SAAS;YAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;QACxC,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,MAAM,IAAI,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;IAE5E,OAAO;QACN,CAAC,EAAE,CAAC;QACJ,EAAE,EAAE,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE;QACrC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,UAAU,QAAQ,IAAI,MAAM,EAAE;QACpC,MAAM;QACN,QAAQ,EAAE,MAAM;QAChB,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;KACP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WhatsApp (Meta Cloud API) inbound normalizer (#656, epic #190 Phase 3).
|
|
3
|
+
*
|
|
4
|
+
* Hand-rolled: the Cloud API surface used here (webhook parse, text send,
|
|
5
|
+
* media upload) is small enough not to earn the @chat-adapter/whatsapp
|
|
6
|
+
* dependency; re-evaluate it when template messaging is built.
|
|
7
|
+
* Meta POSTs webhook payloads shaped
|
|
8
|
+
* `{object, entry: [{changes: [{field, value}]}]}`; the `messages` field
|
|
9
|
+
* carries user messages, `statuses` carries delivery receipts (skipped).
|
|
10
|
+
*
|
|
11
|
+
* One inbound user message becomes one NormalizedEvent on the global topic
|
|
12
|
+
* `whatsapp:<phone_number_id>` with the reply address
|
|
13
|
+
* `whatsapp:<pnid>:dm:<wa_id>` (the grammar in ../conversation.ts).
|
|
14
|
+
*/
|
|
15
|
+
import type { NormalizedEvent } from "../core.js";
|
|
16
|
+
export interface WhatsAppNormalization {
|
|
17
|
+
events: NormalizedEvent[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Normalize one Meta webhook payload into NormalizedEvents. Never throws on
|
|
21
|
+
* malformed input - unknown shapes yield zero events (the route must still
|
|
22
|
+
* 200 so Meta does not retry forever).
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeWhatsAppWebhook(payload: Record<string, unknown>): WhatsAppNormalization;
|
|
25
|
+
//# sourceMappingURL=whatsapp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../src/adapters/whatsapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B;AAeD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,qBAAqB,CA8EvB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { buildConversation } from "../conversation.js";
|
|
2
|
+
/** Human-readable fallback text for non-text message types. */
|
|
3
|
+
function messageText(msg) {
|
|
4
|
+
const type = msg.type || "unknown";
|
|
5
|
+
if (type === "text") {
|
|
6
|
+
return msg.text?.body || "";
|
|
7
|
+
}
|
|
8
|
+
// Media messages carry an optional caption; surface it with a type marker
|
|
9
|
+
// so the agent knows a non-text payload arrived.
|
|
10
|
+
const media = msg[type];
|
|
11
|
+
const caption = media?.caption || "";
|
|
12
|
+
return caption ? `[${type}] ${caption}` : `[${type} message]`;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Normalize one Meta webhook payload into NormalizedEvents. Never throws on
|
|
16
|
+
* malformed input - unknown shapes yield zero events (the route must still
|
|
17
|
+
* 200 so Meta does not retry forever).
|
|
18
|
+
*/
|
|
19
|
+
export function normalizeWhatsAppWebhook(payload) {
|
|
20
|
+
const events = [];
|
|
21
|
+
const entries = Array.isArray(payload.entry) ? payload.entry : [];
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
const changes = Array.isArray(entry?.changes) ? entry.changes : [];
|
|
24
|
+
for (const change of changes) {
|
|
25
|
+
if (change?.field !== "messages")
|
|
26
|
+
continue;
|
|
27
|
+
const value = change.value || {};
|
|
28
|
+
const metadata = value.metadata || {};
|
|
29
|
+
const pnid = metadata.phone_number_id || "";
|
|
30
|
+
if (!pnid)
|
|
31
|
+
continue;
|
|
32
|
+
// Delivery receipts (value.statuses) intentionally produce nothing.
|
|
33
|
+
const messages = Array.isArray(value.messages) ? value.messages : [];
|
|
34
|
+
const contacts = Array.isArray(value.contacts) ? value.contacts : [];
|
|
35
|
+
for (const msg of messages) {
|
|
36
|
+
// Runtime type check, not a cast: a numeric `from` would throw
|
|
37
|
+
// on .includes and turn the webhook into a retried 5xx.
|
|
38
|
+
const waId = typeof msg.from === "string" ? msg.from : "";
|
|
39
|
+
if (!waId || waId.includes(":"))
|
|
40
|
+
continue;
|
|
41
|
+
const text = messageText(msg).slice(0, 4000);
|
|
42
|
+
const contact = contacts.find((c) => c?.wa_id === waId);
|
|
43
|
+
const profileName = contact?.profile?.name || "";
|
|
44
|
+
let conversation;
|
|
45
|
+
try {
|
|
46
|
+
conversation = buildConversation({
|
|
47
|
+
source: "whatsapp", scope: pnid, chatType: "dm", chatId: waId,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
continue; // an id carrying ":" cannot be addressed - drop, never 500
|
|
52
|
+
}
|
|
53
|
+
const fields = {
|
|
54
|
+
user_id: waId,
|
|
55
|
+
phone_number_id: pnid,
|
|
56
|
+
message_type: msg.type || "unknown",
|
|
57
|
+
};
|
|
58
|
+
if (msg.id)
|
|
59
|
+
fields.message_id = String(msg.id);
|
|
60
|
+
if (profileName)
|
|
61
|
+
fields.profile_name = profileName;
|
|
62
|
+
// Meta stamps each message with unix seconds. Carry it so the
|
|
63
|
+
// 24h-window bookkeeping records the message's own time, not
|
|
64
|
+
// our arrival time - redeliveries can arrive days late.
|
|
65
|
+
const tsSec = Number(msg.timestamp);
|
|
66
|
+
if (Number.isFinite(tsSec) && tsSec > 0) {
|
|
67
|
+
fields.message_timestamp = new Date(tsSec * 1000).toISOString();
|
|
68
|
+
}
|
|
69
|
+
events.push({
|
|
70
|
+
v: 2,
|
|
71
|
+
// Meta retries deliveries with the same message id; using it as
|
|
72
|
+
// the event id gives downstream consumers a stable dedup key.
|
|
73
|
+
id: msg.id || crypto.randomUUID(),
|
|
74
|
+
source: "whatsapp",
|
|
75
|
+
type: "whatsapp.message",
|
|
76
|
+
topics: [`whatsapp:${pnid}`],
|
|
77
|
+
delivery: "chat",
|
|
78
|
+
text,
|
|
79
|
+
conversation,
|
|
80
|
+
fields,
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
payload: {
|
|
83
|
+
user_id: waId,
|
|
84
|
+
phone_number_id: pnid,
|
|
85
|
+
text,
|
|
86
|
+
message_type: msg.type || "unknown",
|
|
87
|
+
...(msg.id ? { message_id: String(msg.id) } : {}),
|
|
88
|
+
...(profileName ? { profile_name: profileName } : {}),
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { events };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=whatsapp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../src/adapters/whatsapp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Conversation } from "./conversation.js";
|
|
2
|
+
export interface CredentialSpec {
|
|
3
|
+
env: string;
|
|
4
|
+
secret: boolean;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function setSlackApiUrl(url: string | undefined): void;
|
|
8
|
+
export declare function slackApiUrl(): string;
|
|
9
|
+
export declare function setWhatsAppApiUrl(url: string | undefined): void;
|
|
10
|
+
export declare function whatsappApiUrl(): string;
|
|
11
|
+
export interface ChannelCapabilities {
|
|
12
|
+
edit: boolean;
|
|
13
|
+
typing: boolean;
|
|
14
|
+
streaming: "native" | "edit-fallback" | "none";
|
|
15
|
+
threads: boolean;
|
|
16
|
+
files: boolean;
|
|
17
|
+
/** Outbound message budget; text beyond it is truncated with a marker. */
|
|
18
|
+
maxLength: number;
|
|
19
|
+
lengthUnit: "chars" | "utf16";
|
|
20
|
+
messageWindow?: {
|
|
21
|
+
hours: number;
|
|
22
|
+
outsideWindow: "template" | "blocked";
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* One struct declaring a channel's entire integration surface, so adding a
|
|
27
|
+
* channel means one adapter module and one registry entry, with zero core
|
|
28
|
+
* edits (epic #190 design).
|
|
29
|
+
*/
|
|
30
|
+
export interface ChannelDescriptor {
|
|
31
|
+
name: string;
|
|
32
|
+
topicShape: string;
|
|
33
|
+
transport: "webhook" | "socket";
|
|
34
|
+
capabilities: ChannelCapabilities;
|
|
35
|
+
credentials: CredentialSpec[];
|
|
36
|
+
promptHint: string;
|
|
37
|
+
setupSkill: string;
|
|
38
|
+
}
|
|
39
|
+
export interface SendResult {
|
|
40
|
+
ok: boolean;
|
|
41
|
+
/** Platform message id of the posted/updated message (Slack: ts). */
|
|
42
|
+
ts?: string;
|
|
43
|
+
error?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface OutboundFile {
|
|
46
|
+
name: string;
|
|
47
|
+
data: Uint8Array<ArrayBuffer>;
|
|
48
|
+
title?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ConversationMessage {
|
|
51
|
+
user: string;
|
|
52
|
+
text: string;
|
|
53
|
+
ts: string;
|
|
54
|
+
files?: Array<Record<string, string>>;
|
|
55
|
+
}
|
|
56
|
+
export interface ChannelAdapter {
|
|
57
|
+
descriptor: ChannelDescriptor;
|
|
58
|
+
send(token: string, conv: Conversation, text: string): Promise<SendResult>;
|
|
59
|
+
update?(token: string, conv: Conversation, messageId: string, text: string): Promise<SendResult>;
|
|
60
|
+
/** Set (on) or clear (off) the channel's thinking/typing indicator. Best-effort. */
|
|
61
|
+
typing?(token: string, conv: Conversation, on: boolean): Promise<void>;
|
|
62
|
+
fetchConversation?(token: string, conv: Conversation, limit?: number): Promise<ConversationMessage[]>;
|
|
63
|
+
uploadFiles?(token: string, conv: Conversation, files: OutboundFile[], comment?: string): Promise<SendResult>;
|
|
64
|
+
}
|
|
65
|
+
export declare function truncateForChannel(text: string, caps: ChannelCapabilities): string;
|
|
66
|
+
/**
|
|
67
|
+
* Split over-budget text into channel-sized chunks at natural boundaries:
|
|
68
|
+
* paragraph break, then line break, then a hard (surrogate-safe) cut. A split
|
|
69
|
+
* inside a code fence closes the fence at the chunk end and reopens it (with
|
|
70
|
+
* its info string) at the start of the next chunk, so every chunk renders.
|
|
71
|
+
* Within-budget text comes back as a single chunk, byte-identical.
|
|
72
|
+
*/
|
|
73
|
+
export declare function chunkForChannel(text: string, caps: ChannelCapabilities): string[];
|
|
74
|
+
export declare function whatsappApi(token: string, path: string, init: {
|
|
75
|
+
method?: string;
|
|
76
|
+
json?: unknown;
|
|
77
|
+
form?: FormData;
|
|
78
|
+
}): Promise<Record<string, unknown>>;
|
|
79
|
+
export declare function getChannelAdapter(source: string): ChannelAdapter | undefined;
|
|
80
|
+
//# sourceMappingURL=channels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd;AASD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE5D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAQD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE/D;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,QAAQ,GAAG,eAAe,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,UAAU,GAAG,SAAS,CAAA;KAAE,CAAC;CACzE;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,GAAG,QAAQ,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IAGb,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3E,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjG,oFAAoF;IACpF,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,iBAAiB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACtG,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC9G;AAiDD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAMlF;AA2BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAgDjF;AAwKD,wBAAsB,WAAW,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,GACxD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkBlC;AAuJD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE5E"}
|