@flowajs/chat-service 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/dist/artifact.d.ts +87 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +99 -0
- package/dist/artifact.js.map +1 -0
- package/dist/audit.d.ts +28 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +73 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth/jwt.d.ts +18 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +23 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/oidc.d.ts +30 -0
- package/dist/auth/oidc.d.ts.map +1 -0
- package/dist/auth/oidc.js +58 -0
- package/dist/auth/oidc.js.map +1 -0
- package/dist/chat.d.ts +161 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +636 -0
- package/dist/chat.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +47 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation.d.ts +31 -0
- package/dist/instrumentation.d.ts.map +1 -0
- package/dist/instrumentation.js +151 -0
- package/dist/instrumentation.js.map +1 -0
- package/dist/llm/anthropic.d.ts +22 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +40 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/bedrock.d.ts +34 -0
- package/dist/llm/bedrock.d.ts.map +1 -0
- package/dist/llm/bedrock.js +54 -0
- package/dist/llm/bedrock.js.map +1 -0
- package/dist/llm/factory.d.ts +3 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +59 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/google-gla.d.ts +22 -0
- package/dist/llm/google-gla.d.ts.map +1 -0
- package/dist/llm/google-gla.js +29 -0
- package/dist/llm/google-gla.js.map +1 -0
- package/dist/llm/google-vertex.d.ts +21 -0
- package/dist/llm/google-vertex.d.ts.map +1 -0
- package/dist/llm/google-vertex.js +28 -0
- package/dist/llm/google-vertex.js.map +1 -0
- package/dist/llm/interface.d.ts +45 -0
- package/dist/llm/interface.d.ts.map +1 -0
- package/dist/llm/interface.js +2 -0
- package/dist/llm/interface.js.map +1 -0
- package/dist/llm/openai.d.ts +19 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +25 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/prompts.d.ts +7 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +17 -0
- package/dist/prompts.js.map +1 -0
- package/dist/server.d.ts +39 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +106 -0
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts +68 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +245 -0
- package/dist/session.js.map +1 -0
- package/dist/storage/factory.d.ts +28 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +33 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/fs.d.ts +14 -0
- package/dist/storage/fs.d.ts.map +1 -0
- package/dist/storage/fs.js +116 -0
- package/dist/storage/fs.js.map +1 -0
- package/dist/storage/gcs.d.ts +27 -0
- package/dist/storage/gcs.d.ts.map +1 -0
- package/dist/storage/gcs.js +81 -0
- package/dist/storage/gcs.js.map +1 -0
- package/dist/storage/interface.d.ts +33 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +12 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/s3.d.ts +29 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +109 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage-keys.d.ts +33 -0
- package/dist/storage-keys.d.ts.map +1 -0
- package/dist/storage-keys.js +76 -0
- package/dist/storage-keys.js.map +1 -0
- package/dist/telemetry.d.ts +29 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +116 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/yaml.d.ts +42 -0
- package/dist/yaml.d.ts.map +1 -0
- package/dist/yaml.js +121 -0
- package/dist/yaml.js.map +1 -0
- package/package.json +124 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createRemoteJWKSet, jwtVerify } from "jose";
|
|
2
|
+
const jwksCache = new Map();
|
|
3
|
+
function getJwks(url) {
|
|
4
|
+
let jwks = jwksCache.get(url);
|
|
5
|
+
if (!jwks) {
|
|
6
|
+
jwks = createRemoteJWKSet(new URL(url));
|
|
7
|
+
jwksCache.set(url, jwks);
|
|
8
|
+
}
|
|
9
|
+
return jwks;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate a Bearer token from an Authorization header against an OIDC
|
|
13
|
+
* IDP. Returns the decoded claims on success; throws on missing header,
|
|
14
|
+
* malformed token, or signature/audience/issuer mismatch.
|
|
15
|
+
*
|
|
16
|
+
* Generic over IDP — works against any OIDC-compliant provider (Auth0,
|
|
17
|
+
* Keycloak, Okta, GitHub, etc.).
|
|
18
|
+
*/
|
|
19
|
+
export async function validateOidcToken(authHeader, config) {
|
|
20
|
+
if (config.devMode && process.env.NODE_ENV === "production") {
|
|
21
|
+
// Hard fail rather than degrade to insecure validation in prod.
|
|
22
|
+
throw new Error("OIDC devMode is enabled but NODE_ENV=production. Refusing to bypass JWT verification.");
|
|
23
|
+
}
|
|
24
|
+
if (!authHeader?.startsWith("Bearer ")) {
|
|
25
|
+
throw new Error("Missing or invalid Authorization header");
|
|
26
|
+
}
|
|
27
|
+
const token = authHeader.slice(7);
|
|
28
|
+
if (config.devMode) {
|
|
29
|
+
const [, payloadB64] = token.split(".");
|
|
30
|
+
if (!payloadB64)
|
|
31
|
+
throw new Error("Invalid token format");
|
|
32
|
+
return JSON.parse(Buffer.from(payloadB64, "base64url").toString());
|
|
33
|
+
}
|
|
34
|
+
const { payload } = await jwtVerify(token, getJwks(config.jwksUrl), {
|
|
35
|
+
audience: config.audience,
|
|
36
|
+
issuer: config.issuer,
|
|
37
|
+
});
|
|
38
|
+
return payload;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hono middleware factory that validates the Authorization header against
|
|
42
|
+
* the configured OIDC IDP. The decoded claims are stored on the context
|
|
43
|
+
* variable `oidcClaims` for downstream handlers to read via
|
|
44
|
+
* `c.get("oidcClaims")`.
|
|
45
|
+
*/
|
|
46
|
+
export function createOidcMiddleware(config) {
|
|
47
|
+
return async (c, next) => {
|
|
48
|
+
try {
|
|
49
|
+
const claims = await validateOidcToken(c.req.header("Authorization"), config);
|
|
50
|
+
c.set("oidcClaims", claims);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return c.json({ error: "Unauthorized" }, 401);
|
|
54
|
+
}
|
|
55
|
+
return next();
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=oidc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc.js","sourceRoot":"","sources":["../../src/auth/oidc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAmB,MAAM,MAAM,CAAC;AAetE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiD,CAAC;AAE3E,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAA8B,EAC9B,MAA2B;IAE3B,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC5D,gEAAgE;QAChE,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAClC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA2B;IAE3B,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,EAC7B,MAAM,CACP,CAAC;YACF,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/chat.d.ts
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/** Main streaming chat endpoint. */
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { type SessionContext } from "./session.js";
|
|
4
|
+
import type { Artifact } from "./artifact.js";
|
|
5
|
+
import type { LlmProvider } from "./llm/interface.js";
|
|
6
|
+
import type { Storage } from "./storage/interface.js";
|
|
7
|
+
import { artifactToYaml } from "./yaml.js";
|
|
8
|
+
export declare const TriageStateSchema: z.ZodObject<{
|
|
9
|
+
version_id: z.ZodOptional<z.ZodString>;
|
|
10
|
+
accepted: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
11
|
+
paper_id: z.ZodString;
|
|
12
|
+
claim_index: z.ZodNumber;
|
|
13
|
+
}, z.core.$strip>>>;
|
|
14
|
+
rejected: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
15
|
+
paper_id: z.ZodString;
|
|
16
|
+
claim_index: z.ZodNumber;
|
|
17
|
+
}, z.core.$strip>>>;
|
|
18
|
+
papers_done: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
19
|
+
comments: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
20
|
+
paper_id: z.ZodString;
|
|
21
|
+
claim_index: z.ZodNumber;
|
|
22
|
+
body: z.ZodString;
|
|
23
|
+
}, z.core.$strip>>>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export type TriageState = z.infer<typeof TriageStateSchema>;
|
|
26
|
+
/**
|
|
27
|
+
* Render the `{triage_state}` prompt block. Resolves each claim identified
|
|
28
|
+
* by `(paper_id, claim_index)` to human-readable form using the current
|
|
29
|
+
* artifact, which has the same claim order the client observed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function renderTriageStateBlock(artifact: Artifact, state: TriageState | null | undefined): string;
|
|
32
|
+
/**
|
|
33
|
+
* Validate claim/paper integrity and citation fidelity. Returns an array
|
|
34
|
+
* of error messages; empty array means the artifact passes.
|
|
35
|
+
*
|
|
36
|
+
* `validPaperIds`, when provided, is the set of paper IDs known to the
|
|
37
|
+
* session (from aggregate.paper_id_mapping). Every paper in
|
|
38
|
+
* `artifact.papers[]` must be a member.
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateArtifactContent(artifact: Artifact, validPaperIds?: Set<string>): string[];
|
|
41
|
+
/** Shared validation + commit for str_replace, insert, and write. */
|
|
42
|
+
declare function validateAndCommit(session: SessionContext, schema: z.ZodType<Artifact>, updatedYaml: string, tool: "str_replace" | "insert" | "write"): string | {
|
|
43
|
+
error: string;
|
|
44
|
+
is_error: true;
|
|
45
|
+
};
|
|
46
|
+
interface ChatBuildContext {
|
|
47
|
+
session: SessionContext;
|
|
48
|
+
storage: Storage;
|
|
49
|
+
provider: LlmProvider;
|
|
50
|
+
schema: z.ZodType<Artifact>;
|
|
51
|
+
}
|
|
52
|
+
export declare function buildTools(ctx: ChatBuildContext): {
|
|
53
|
+
loadPaperExtracts: {
|
|
54
|
+
description: string;
|
|
55
|
+
inputSchema: z.ZodObject<{
|
|
56
|
+
paperIds: z.ZodArray<z.ZodString>;
|
|
57
|
+
}, z.core.$strip>;
|
|
58
|
+
execute: (args: {
|
|
59
|
+
paperIds: string[];
|
|
60
|
+
}) => Promise<{
|
|
61
|
+
paperId: string;
|
|
62
|
+
extraction: unknown;
|
|
63
|
+
}[] | {
|
|
64
|
+
error: string;
|
|
65
|
+
}>;
|
|
66
|
+
};
|
|
67
|
+
loadFullPaper: {
|
|
68
|
+
description: string;
|
|
69
|
+
inputSchema: z.ZodObject<{
|
|
70
|
+
paperId: z.ZodString;
|
|
71
|
+
}, z.core.$strip>;
|
|
72
|
+
execute: (args: {
|
|
73
|
+
paperId: string;
|
|
74
|
+
}) => Promise<string | {
|
|
75
|
+
error: string;
|
|
76
|
+
}>;
|
|
77
|
+
};
|
|
78
|
+
queryPapers: {
|
|
79
|
+
description: string;
|
|
80
|
+
inputSchema: z.ZodObject<{
|
|
81
|
+
question: z.ZodString;
|
|
82
|
+
paperIds: z.ZodArray<z.ZodString>;
|
|
83
|
+
}, z.core.$strip>;
|
|
84
|
+
execute: (args: {
|
|
85
|
+
question: string;
|
|
86
|
+
paperIds: string[];
|
|
87
|
+
}) => Promise<string | {
|
|
88
|
+
error: string;
|
|
89
|
+
}>;
|
|
90
|
+
};
|
|
91
|
+
view: {
|
|
92
|
+
description: string;
|
|
93
|
+
inputSchema: z.ZodObject<{
|
|
94
|
+
view_range: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
95
|
+
}, z.core.$strip>;
|
|
96
|
+
execute: (args: {
|
|
97
|
+
view_range?: [number, number];
|
|
98
|
+
}) => Promise<string | {
|
|
99
|
+
error: string;
|
|
100
|
+
}>;
|
|
101
|
+
};
|
|
102
|
+
search: {
|
|
103
|
+
description: string;
|
|
104
|
+
inputSchema: z.ZodObject<{
|
|
105
|
+
pattern: z.ZodString;
|
|
106
|
+
}, z.core.$strip>;
|
|
107
|
+
execute: (args: {
|
|
108
|
+
pattern: string;
|
|
109
|
+
}) => Promise<string | {
|
|
110
|
+
error: string;
|
|
111
|
+
}>;
|
|
112
|
+
};
|
|
113
|
+
str_replace: {
|
|
114
|
+
description: string;
|
|
115
|
+
inputSchema: z.ZodObject<{
|
|
116
|
+
old_str: z.ZodString;
|
|
117
|
+
new_str: z.ZodString;
|
|
118
|
+
}, z.core.$strip>;
|
|
119
|
+
execute: (args: {
|
|
120
|
+
old_str: string;
|
|
121
|
+
new_str: string;
|
|
122
|
+
}) => Promise<string | {
|
|
123
|
+
error: string;
|
|
124
|
+
is_error: boolean;
|
|
125
|
+
}>;
|
|
126
|
+
};
|
|
127
|
+
insert: {
|
|
128
|
+
description: string;
|
|
129
|
+
inputSchema: z.ZodObject<{
|
|
130
|
+
insert_line: z.ZodNumber;
|
|
131
|
+
new_str: z.ZodString;
|
|
132
|
+
}, z.core.$strip>;
|
|
133
|
+
execute: (args: {
|
|
134
|
+
insert_line: number;
|
|
135
|
+
new_str: string;
|
|
136
|
+
}) => Promise<string | {
|
|
137
|
+
error: string;
|
|
138
|
+
is_error: boolean;
|
|
139
|
+
}>;
|
|
140
|
+
};
|
|
141
|
+
write: {
|
|
142
|
+
description: string;
|
|
143
|
+
inputSchema: z.ZodObject<{
|
|
144
|
+
artifact_yaml: z.ZodString;
|
|
145
|
+
}, z.core.$strip>;
|
|
146
|
+
execute: (args: {
|
|
147
|
+
artifact_yaml: string;
|
|
148
|
+
}) => Promise<string | {
|
|
149
|
+
error: string;
|
|
150
|
+
is_error: true;
|
|
151
|
+
}>;
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
export interface HandleChatContext {
|
|
155
|
+
storage: Storage;
|
|
156
|
+
provider: LlmProvider;
|
|
157
|
+
schema: z.ZodType<Artifact>;
|
|
158
|
+
}
|
|
159
|
+
export declare function handleChat(ctx: HandleChatContext, req: Request, session: SessionContext): Promise<Response>;
|
|
160
|
+
export { validateAndCommit, artifactToYaml };
|
|
161
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAapC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,cAAc,CAAC;AAY1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAOL,cAAc,EACf,MAAM,WAAW,CAAC;AA8BnB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;iBAiC5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACpC,MAAM,CA4ER;AAQD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC1B,MAAM,EAAE,CA8GV;AAED,qEAAqE;AACrE,iBAAS,iBAAiB,CACxB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC3B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,GACvC,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CAiD5C;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7B;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,gBAAgB;;;;;;;sBAeF,MAAM,EAAE;;;;;;;;;;;;;;qBAyBf,MAAM;;;;;;;;;;;;sBA4BzB,MAAM;sBACN,MAAM,EAAE;;;;;;;;;;;yBAkEkB,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;;;;;;;qBA2BvB,MAAM;;;;;;;;;;;;qBAkCG,MAAM;qBAAW,MAAM;;;;;;;;;;;;;yBA2ChD,MAAM;qBACV,MAAM;;;;;;;;;;;;2BA6B0B,MAAM;;mBAvUpC,MAAM;sBAAY,IAAI;;;EA6U1C;AAOD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7B;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,CAAC,CAwMnB;AAGD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC"}
|