@slashfi/agents-sdk 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 +21 -0
- package/README.md +274 -0
- package/dist/auth.d.ts +109 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +329 -0
- package/dist/auth.js.map +1 -0
- package/dist/build.d.ts +68 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +159 -0
- package/dist/build.js.map +1 -0
- package/dist/define.d.ts +87 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +71 -0
- package/dist/define.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +48 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +274 -0
- package/dist/registry.js.map +1 -0
- package/dist/server.d.ts +66 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +308 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +389 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
- package/src/auth.ts +493 -0
- package/src/build.ts +238 -0
- package/src/define.ts +153 -0
- package/src/index.ts +111 -0
- package/src/registry.ts +403 -0
- package/src/server.ts +460 -0
- package/src/types.ts +524 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Server
|
|
3
|
+
*
|
|
4
|
+
* HTTP server that exposes the agent registry via JSON-RPC endpoints.
|
|
5
|
+
* Compatible with MCP (Model Context Protocol) over HTTP.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* - POST /call - Execute agent actions (execute_tool, describe_tools, load)
|
|
9
|
+
* - GET /list - List registered agents
|
|
10
|
+
* - POST /oauth/token - OAuth2 token endpoint (when @auth is registered)
|
|
11
|
+
*
|
|
12
|
+
* Auth Integration:
|
|
13
|
+
* When an `@auth` agent is registered, the server automatically:
|
|
14
|
+
* - Validates Bearer tokens on requests
|
|
15
|
+
* - Resolves tokens to identity + scopes
|
|
16
|
+
* - Populates callerId, callerType in the request context
|
|
17
|
+
* - Recognizes the root key for admin access
|
|
18
|
+
* - Mounts the /oauth/token endpoint
|
|
19
|
+
*/
|
|
20
|
+
// ============================================
|
|
21
|
+
// Response Helpers
|
|
22
|
+
// ============================================
|
|
23
|
+
function jsonResponse(data, status = 200) {
|
|
24
|
+
return new Response(JSON.stringify(data), {
|
|
25
|
+
status,
|
|
26
|
+
headers: {
|
|
27
|
+
"Content-Type": "application/json",
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function corsHeaders() {
|
|
32
|
+
return {
|
|
33
|
+
"Access-Control-Allow-Origin": "*",
|
|
34
|
+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
35
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// ============================================
|
|
39
|
+
// Auth Detection
|
|
40
|
+
// ============================================
|
|
41
|
+
function detectAuth(registry) {
|
|
42
|
+
const authAgent = registry.get("@auth");
|
|
43
|
+
if (!authAgent?.__authStore || !authAgent.__rootKey)
|
|
44
|
+
return null;
|
|
45
|
+
return {
|
|
46
|
+
store: authAgent.__authStore,
|
|
47
|
+
rootKey: authAgent.__rootKey,
|
|
48
|
+
tokenTtl: authAgent.__tokenTtl ?? 3600,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function resolveAuth(req, authConfig) {
|
|
52
|
+
const authHeader = req.headers.get("Authorization");
|
|
53
|
+
if (!authHeader)
|
|
54
|
+
return null;
|
|
55
|
+
const [scheme, credential] = authHeader.split(" ", 2);
|
|
56
|
+
if (scheme?.toLowerCase() !== "bearer" || !credential)
|
|
57
|
+
return null;
|
|
58
|
+
// Check root key
|
|
59
|
+
if (credential === authConfig.rootKey) {
|
|
60
|
+
return {
|
|
61
|
+
callerId: "root",
|
|
62
|
+
callerType: "system",
|
|
63
|
+
scopes: ["*"],
|
|
64
|
+
isRoot: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Validate token
|
|
68
|
+
const token = await authConfig.store.validateToken(credential);
|
|
69
|
+
if (!token)
|
|
70
|
+
return null;
|
|
71
|
+
// Look up client name
|
|
72
|
+
const client = await authConfig.store.getClient(token.clientId);
|
|
73
|
+
return {
|
|
74
|
+
callerId: client?.name ?? token.clientId,
|
|
75
|
+
callerType: "agent",
|
|
76
|
+
scopes: token.scopes,
|
|
77
|
+
isRoot: false,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// ============================================
|
|
81
|
+
// Visibility Filtering for /list
|
|
82
|
+
// ============================================
|
|
83
|
+
function canSeeAgent(agent, auth) {
|
|
84
|
+
const visibility = agent.visibility ?? "internal";
|
|
85
|
+
if (auth?.isRoot)
|
|
86
|
+
return true;
|
|
87
|
+
if (visibility === "public")
|
|
88
|
+
return true;
|
|
89
|
+
if (visibility === "internal" && auth)
|
|
90
|
+
return true;
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
// ============================================
|
|
94
|
+
// Create Server
|
|
95
|
+
// ============================================
|
|
96
|
+
/**
|
|
97
|
+
* Create an HTTP server for the agent registry.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const registry = createAgentRegistry();
|
|
102
|
+
* registry.register(createAuthAgent({ rootKey: 'rk_xxx' }));
|
|
103
|
+
* registry.register(myAgent);
|
|
104
|
+
*
|
|
105
|
+
* const server = createAgentServer(registry, { port: 3000 });
|
|
106
|
+
* await server.start();
|
|
107
|
+
* // POST /call - Execute agent actions
|
|
108
|
+
* // GET /list - List agents (filtered by auth)
|
|
109
|
+
* // POST /oauth/token - OAuth2 token endpoint
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function createAgentServer(registry, options = {}) {
|
|
113
|
+
const { port = 3000, hostname = "localhost", basePath = "", cors = true, onNotFound, } = options;
|
|
114
|
+
let serverInstance = null;
|
|
115
|
+
let serverUrl = null;
|
|
116
|
+
// Detect auth configuration
|
|
117
|
+
const authConfig = detectAuth(registry);
|
|
118
|
+
/**
|
|
119
|
+
* Handle incoming requests.
|
|
120
|
+
*/
|
|
121
|
+
async function fetch(req) {
|
|
122
|
+
const url = new URL(req.url);
|
|
123
|
+
const path = url.pathname.replace(basePath, "") || "/";
|
|
124
|
+
// Handle CORS preflight
|
|
125
|
+
if (cors && req.method === "OPTIONS") {
|
|
126
|
+
return new Response(null, {
|
|
127
|
+
status: 204,
|
|
128
|
+
headers: corsHeaders(),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// Add CORS headers to response
|
|
132
|
+
const addCors = (response) => {
|
|
133
|
+
if (!cors)
|
|
134
|
+
return response;
|
|
135
|
+
const headers = new Headers(response.headers);
|
|
136
|
+
for (const [key, value] of Object.entries(corsHeaders())) {
|
|
137
|
+
headers.set(key, value);
|
|
138
|
+
}
|
|
139
|
+
return new Response(response.body, {
|
|
140
|
+
status: response.status,
|
|
141
|
+
statusText: response.statusText,
|
|
142
|
+
headers,
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
// Resolve auth on every request
|
|
146
|
+
const auth = authConfig ? await resolveAuth(req, authConfig) : null;
|
|
147
|
+
try {
|
|
148
|
+
// POST /oauth/token - Standard OAuth2 endpoint
|
|
149
|
+
if (path === "/oauth/token" && req.method === "POST" && authConfig) {
|
|
150
|
+
const contentType = req.headers.get("Content-Type") ?? "";
|
|
151
|
+
let grantType;
|
|
152
|
+
let clientId;
|
|
153
|
+
let clientSecret;
|
|
154
|
+
if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
155
|
+
const body = await req.text();
|
|
156
|
+
const params = new URLSearchParams(body);
|
|
157
|
+
grantType = params.get("grant_type") ?? "";
|
|
158
|
+
clientId = params.get("client_id") ?? "";
|
|
159
|
+
clientSecret = params.get("client_secret") ?? "";
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const body = (await req.json());
|
|
163
|
+
grantType = body.grant_type ?? "";
|
|
164
|
+
clientId = body.client_id ?? "";
|
|
165
|
+
clientSecret = body.client_secret ?? "";
|
|
166
|
+
}
|
|
167
|
+
if (grantType !== "client_credentials") {
|
|
168
|
+
return addCors(jsonResponse({
|
|
169
|
+
error: "unsupported_grant_type",
|
|
170
|
+
error_description: "Only client_credentials is supported",
|
|
171
|
+
}, 400));
|
|
172
|
+
}
|
|
173
|
+
if (!clientId || !clientSecret) {
|
|
174
|
+
return addCors(jsonResponse({
|
|
175
|
+
error: "invalid_request",
|
|
176
|
+
error_description: "Missing client_id or client_secret",
|
|
177
|
+
}, 400));
|
|
178
|
+
}
|
|
179
|
+
const client = await authConfig.store.validateClient(clientId, clientSecret);
|
|
180
|
+
if (!client) {
|
|
181
|
+
return addCors(jsonResponse({
|
|
182
|
+
error: "invalid_client",
|
|
183
|
+
error_description: "Invalid client credentials",
|
|
184
|
+
}, 401));
|
|
185
|
+
}
|
|
186
|
+
// Generate token
|
|
187
|
+
const tokenString = `at_${Array.from({ length: 48 }, () => "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(Math.random() * 62)]).join("")}`;
|
|
188
|
+
const token = {
|
|
189
|
+
token: tokenString,
|
|
190
|
+
clientId: client.clientId,
|
|
191
|
+
scopes: client.scopes,
|
|
192
|
+
issuedAt: Date.now(),
|
|
193
|
+
expiresAt: Date.now() + authConfig.tokenTtl * 1000,
|
|
194
|
+
};
|
|
195
|
+
await authConfig.store.storeToken(token);
|
|
196
|
+
// Standard OAuth2 response
|
|
197
|
+
return addCors(jsonResponse({
|
|
198
|
+
access_token: token.token,
|
|
199
|
+
token_type: "bearer",
|
|
200
|
+
expires_in: authConfig.tokenTtl,
|
|
201
|
+
scope: client.scopes.join(" "),
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
// POST /call - Execute agent action
|
|
205
|
+
if (path === "/call" && req.method === "POST") {
|
|
206
|
+
const body = (await req.json());
|
|
207
|
+
if (!body.path || !body.action) {
|
|
208
|
+
return addCors(jsonResponse({
|
|
209
|
+
success: false,
|
|
210
|
+
error: "Missing required fields: path, action",
|
|
211
|
+
code: "INVALID_REQUEST",
|
|
212
|
+
}, 400));
|
|
213
|
+
}
|
|
214
|
+
// Inject auth context into request
|
|
215
|
+
if (auth) {
|
|
216
|
+
body.callerId = auth.callerId;
|
|
217
|
+
body.callerType = auth.callerType;
|
|
218
|
+
if (!body.metadata)
|
|
219
|
+
body.metadata = {};
|
|
220
|
+
body.metadata.scopes = auth.scopes;
|
|
221
|
+
body.metadata.isRoot = auth.isRoot;
|
|
222
|
+
}
|
|
223
|
+
// Root key bypasses all access checks
|
|
224
|
+
if (auth?.isRoot) {
|
|
225
|
+
body.callerType = "system";
|
|
226
|
+
}
|
|
227
|
+
const result = await registry.call(body);
|
|
228
|
+
const status = "success" in result && result.success ? 200 : 400;
|
|
229
|
+
return addCors(jsonResponse(result, status));
|
|
230
|
+
}
|
|
231
|
+
// GET /list - List agents (filtered by visibility)
|
|
232
|
+
if (path === "/list" && req.method === "GET") {
|
|
233
|
+
const agents = registry.list();
|
|
234
|
+
const visible = agents.filter((agent) => canSeeAgent(agent, auth));
|
|
235
|
+
return addCors(jsonResponse({
|
|
236
|
+
success: true,
|
|
237
|
+
agents: visible.map((agent) => ({
|
|
238
|
+
path: agent.path,
|
|
239
|
+
name: agent.config?.name,
|
|
240
|
+
description: agent.config?.description,
|
|
241
|
+
supportedActions: agent.config?.supportedActions,
|
|
242
|
+
tools: agent.tools
|
|
243
|
+
.filter((t) => {
|
|
244
|
+
const tv = t.visibility ?? "internal";
|
|
245
|
+
if (auth?.isRoot)
|
|
246
|
+
return true;
|
|
247
|
+
if (tv === "public")
|
|
248
|
+
return true;
|
|
249
|
+
if (tv === "internal" && auth)
|
|
250
|
+
return true;
|
|
251
|
+
return false;
|
|
252
|
+
})
|
|
253
|
+
.map((t) => t.name),
|
|
254
|
+
})),
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
// Not found
|
|
258
|
+
if (onNotFound) {
|
|
259
|
+
return addCors(await onNotFound(req));
|
|
260
|
+
}
|
|
261
|
+
return addCors(jsonResponse({
|
|
262
|
+
success: false,
|
|
263
|
+
error: `Not found: ${req.method} ${path}`,
|
|
264
|
+
code: "NOT_FOUND",
|
|
265
|
+
}, 404));
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
return addCors(jsonResponse({
|
|
269
|
+
success: false,
|
|
270
|
+
error: err instanceof Error ? err.message : String(err),
|
|
271
|
+
code: "INTERNAL_ERROR",
|
|
272
|
+
}, 500));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const server = {
|
|
276
|
+
async start() {
|
|
277
|
+
if (serverInstance) {
|
|
278
|
+
throw new Error("Server is already running");
|
|
279
|
+
}
|
|
280
|
+
serverInstance = Bun.serve({
|
|
281
|
+
port,
|
|
282
|
+
hostname,
|
|
283
|
+
fetch,
|
|
284
|
+
});
|
|
285
|
+
serverUrl = `http://${hostname}:${port}${basePath}`;
|
|
286
|
+
console.log(`Agent server running at ${serverUrl}`);
|
|
287
|
+
console.log(` POST ${basePath}/call - Execute agent actions`);
|
|
288
|
+
console.log(` GET ${basePath}/list - List agents`);
|
|
289
|
+
if (authConfig) {
|
|
290
|
+
console.log(` POST ${basePath}/oauth/token - OAuth2 token endpoint`);
|
|
291
|
+
console.log(" Auth: enabled (root key configured)");
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
async stop() {
|
|
295
|
+
if (serverInstance) {
|
|
296
|
+
serverInstance.stop();
|
|
297
|
+
serverInstance = null;
|
|
298
|
+
serverUrl = null;
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
fetch,
|
|
302
|
+
get url() {
|
|
303
|
+
return serverUrl;
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
return server;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAgEH,+CAA+C;AAC/C,mBAAmB;AACnB,+CAA+C;AAE/C,SAAS,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IAC/C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;QACL,6BAA6B,EAAE,GAAG;QAClC,8BAA8B,EAAE,oBAAoB;QACpD,8BAA8B,EAAE,6BAA6B;KAC9D,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,iBAAiB;AACjB,+CAA+C;AAE/C,SAAS,UAAU,CAAC,QAAuB;IACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAMzB,CAAC;IAEd,IAAI,CAAC,SAAS,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEjE,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,WAAW;QAC5B,OAAO,EAAE,SAAS,CAAC,SAAS;QAC5B,QAAQ,EAAE,SAAS,CAAC,UAAU,IAAI,IAAI;KACvC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,GAAY,EACZ,UAAsB;IAEtB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtD,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAEnE,iBAAiB;IACjB,IAAI,UAAU,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,CAAC,GAAG,CAAC;YACb,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,sBAAsB;IACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEhE,OAAO;QACL,QAAQ,EAAE,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,QAAQ;QACxC,UAAU,EAAE,OAAO;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,iCAAiC;AACjC,+CAA+C;AAE/C,SAAS,WAAW,CAClB,KAAsB,EACtB,IAAyB;IAEzB,MAAM,UAAU,GAAe,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC;IAE9D,IAAI,IAAI,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,UAAU,KAAK,UAAU,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+CAA+C;AAC/C,gBAAgB;AAChB,+CAA+C;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAuB,EACvB,UAA8B,EAAE;IAEhC,MAAM,EACJ,IAAI,GAAG,IAAI,EACX,QAAQ,GAAG,WAAW,EACtB,QAAQ,GAAG,EAAE,EACb,IAAI,GAAG,IAAI,EACX,UAAU,GACX,GAAG,OAAO,CAAC;IAEZ,IAAI,cAAc,GAAwC,IAAI,CAAC;IAC/D,IAAI,SAAS,GAAkB,IAAI,CAAC;IAEpC,4BAA4B;IAC5B,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAExC;;OAEG;IACH,KAAK,UAAU,KAAK,CAAC,GAAY;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;QAEvD,wBAAwB;QACxB,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACxB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,WAAW,EAAE;aACvB,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAY,EAAE;YAC/C,IAAI,CAAC,IAAI;gBAAE,OAAO,QAAQ,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO;aACR,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,gCAAgC;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpE,IAAI,CAAC;YACH,+CAA+C;YAC/C,IAAI,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,EAAE,CAAC;gBACnE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC1D,IAAI,SAAiB,CAAC;gBACtB,IAAI,QAAgB,CAAC;gBACrB,IAAI,YAAoB,CAAC;gBAEzB,IAAI,WAAW,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;oBAC9D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;oBACzC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;oBAC3C,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;oBACzC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2B,CAAC;oBAC1D,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;oBAClC,QAAQ,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;oBAChC,YAAY,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;gBAC1C,CAAC;gBAED,IAAI,SAAS,KAAK,oBAAoB,EAAE,CAAC;oBACvC,OAAO,OAAO,CACZ,YAAY,CACV;wBACE,KAAK,EAAE,wBAAwB;wBAC/B,iBAAiB,EAAE,sCAAsC;qBAC1D,EACD,GAAG,CACJ,CACF,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC/B,OAAO,OAAO,CACZ,YAAY,CACV;wBACE,KAAK,EAAE,iBAAiB;wBACxB,iBAAiB,EAAE,oCAAoC;qBACxD,EACD,GAAG,CACJ,CACF,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,cAAc,CAClD,QAAQ,EACR,YAAY,CACb,CAAC;gBACF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,OAAO,CACZ,YAAY,CACV;wBACE,KAAK,EAAE,gBAAgB;wBACvB,iBAAiB,EAAE,4BAA4B;qBAChD,EACD,GAAG,CACJ,CACF,CAAC;gBACJ,CAAC;gBAED,iBAAiB;gBACjB,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,gEAAgE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxK,MAAM,KAAK,GAAG;oBACZ,KAAK,EAAE,WAAW;oBAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;oBACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,QAAQ,GAAG,IAAI;iBACnD,CAAC;gBACF,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAEzC,2BAA2B;gBAC3B,OAAO,OAAO,CACZ,YAAY,CAAC;oBACX,YAAY,EAAE,KAAK,CAAC,KAAK;oBACzB,UAAU,EAAE,QAAQ;oBACpB,UAAU,EAAE,UAAU,CAAC,QAAQ;oBAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;iBAC/B,CAAC,CACH,CAAC;YACJ,CAAC;YAED,oCAAoC;YACpC,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9C,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB,CAAC;gBAEpD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC/B,OAAO,OAAO,CACZ,YAAY,CACV;wBACE,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,uCAAuC;wBAC9C,IAAI,EAAE,iBAAiB;qBACxB,EACD,GAAG,CACJ,CACF,CAAC;gBACJ,CAAC;gBAED,mCAAmC;gBACnC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;oBAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;oBAClC,IAAI,CAAC,IAAI,CAAC,QAAQ;wBAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;oBACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBACrC,CAAC;gBAED,sCAAsC;gBACtC,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;gBAC7B,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBACjE,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,mDAAmD;YACnD,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;gBAEnE,OAAO,OAAO,CACZ,YAAY,CAAC;oBACX,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI;wBACxB,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW;wBACtC,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB;wBAChD,KAAK,EAAE,KAAK,CAAC,KAAK;6BACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;4BACZ,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC;4BACtC,IAAI,IAAI,EAAE,MAAM;gCAAE,OAAO,IAAI,CAAC;4BAC9B,IAAI,EAAE,KAAK,QAAQ;gCAAE,OAAO,IAAI,CAAC;4BACjC,IAAI,EAAE,KAAK,UAAU,IAAI,IAAI;gCAAE,OAAO,IAAI,CAAC;4BAC3C,OAAO,KAAK,CAAC;wBACf,CAAC,CAAC;6BACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBACtB,CAAC,CAAC;iBACJ,CAAC,CACH,CAAC;YACJ,CAAC;YAED,YAAY;YACZ,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,OAAO,CACZ,YAAY,CACV;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE;gBACzC,IAAI,EAAE,WAAW;aAClB,EACD,GAAG,CACJ,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,OAAO,CACZ,YAAY,CACV;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACvD,IAAI,EAAE,gBAAgB;aACvB,EACD,GAAG,CACJ,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAgB;QAC1B,KAAK,CAAC,KAAK;YACT,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC;gBACzB,IAAI;gBACJ,QAAQ;gBACR,KAAK;aACN,CAAC,CAAC;YAEH,SAAS,GAAG,UAAU,QAAQ,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,+BAA+B,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,qBAAqB,CAAC,CAAC;YACrD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,sCAAsC,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI;YACR,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,IAAI,EAAE,CAAC;gBACtB,cAAc,GAAG,IAAI,CAAC;gBACtB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QAED,KAAK;QAEL,IAAI,GAAG;YACL,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|