@agentlensai/server 0.8.0 → 0.9.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/dist/db/anonymous-id-manager.d.ts +44 -0
- package/dist/db/anonymous-id-manager.d.ts.map +1 -0
- package/dist/db/anonymous-id-manager.js +90 -0
- package/dist/db/anonymous-id-manager.js.map +1 -0
- package/dist/db/capability-store.d.ts +78 -0
- package/dist/db/capability-store.d.ts.map +1 -0
- package/dist/db/capability-store.js +201 -0
- package/dist/db/capability-store.js.map +1 -0
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +136 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.sqlite.d.ts +1663 -2
- package/dist/db/schema.sqlite.d.ts.map +1 -1
- package/dist/db/schema.sqlite.js +135 -1
- package/dist/db/schema.sqlite.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/redaction/human-review-layer.d.ts +37 -0
- package/dist/lib/redaction/human-review-layer.d.ts.map +1 -0
- package/dist/lib/redaction/human-review-layer.js +62 -0
- package/dist/lib/redaction/human-review-layer.js.map +1 -0
- package/dist/lib/redaction/index.d.ts +12 -0
- package/dist/lib/redaction/index.d.ts.map +1 -0
- package/dist/lib/redaction/index.js +12 -0
- package/dist/lib/redaction/index.js.map +1 -0
- package/dist/lib/redaction/pii-detection-layer.d.ts +30 -0
- package/dist/lib/redaction/pii-detection-layer.d.ts.map +1 -0
- package/dist/lib/redaction/pii-detection-layer.js +183 -0
- package/dist/lib/redaction/pii-detection-layer.js.map +1 -0
- package/dist/lib/redaction/pipeline.d.ts +26 -0
- package/dist/lib/redaction/pipeline.d.ts.map +1 -0
- package/dist/lib/redaction/pipeline.js +91 -0
- package/dist/lib/redaction/pipeline.js.map +1 -0
- package/dist/lib/redaction/secret-detection-layer.d.ts +10 -0
- package/dist/lib/redaction/secret-detection-layer.d.ts.map +1 -0
- package/dist/lib/redaction/secret-detection-layer.js +79 -0
- package/dist/lib/redaction/secret-detection-layer.js.map +1 -0
- package/dist/lib/redaction/secret-patterns.d.ts +29 -0
- package/dist/lib/redaction/secret-patterns.d.ts.map +1 -0
- package/dist/lib/redaction/secret-patterns.js +133 -0
- package/dist/lib/redaction/secret-patterns.js.map +1 -0
- package/dist/lib/redaction/semantic-denylist-layer.d.ts +10 -0
- package/dist/lib/redaction/semantic-denylist-layer.d.ts.map +1 -0
- package/dist/lib/redaction/semantic-denylist-layer.js +64 -0
- package/dist/lib/redaction/semantic-denylist-layer.js.map +1 -0
- package/dist/lib/redaction/tenant-deidentification-layer.d.ts +10 -0
- package/dist/lib/redaction/tenant-deidentification-layer.d.ts.map +1 -0
- package/dist/lib/redaction/tenant-deidentification-layer.js +64 -0
- package/dist/lib/redaction/tenant-deidentification-layer.js.map +1 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.d.ts +14 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.d.ts.map +1 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.js +156 -0
- package/dist/lib/redaction/url-path-scrubbing-layer.js.map +1 -0
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +3 -9
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/audit.d.ts +15 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +177 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/capabilities.d.ts +15 -0
- package/dist/routes/capabilities.d.ts.map +1 -0
- package/dist/routes/capabilities.js +86 -0
- package/dist/routes/capabilities.js.map +1 -0
- package/dist/routes/community.d.ts +24 -0
- package/dist/routes/community.d.ts.map +1 -0
- package/dist/routes/community.js +190 -0
- package/dist/routes/community.js.map +1 -0
- package/dist/routes/delegation.d.ts +20 -0
- package/dist/routes/delegation.d.ts.map +1 -0
- package/dist/routes/delegation.js +108 -0
- package/dist/routes/delegation.js.map +1 -0
- package/dist/routes/discovery.d.ts +19 -0
- package/dist/routes/discovery.d.ts.map +1 -0
- package/dist/routes/discovery.js +96 -0
- package/dist/routes/discovery.js.map +1 -0
- package/dist/routes/redaction-test.d.ts +14 -0
- package/dist/routes/redaction-test.d.ts.map +1 -0
- package/dist/routes/redaction-test.js +33 -0
- package/dist/routes/redaction-test.js.map +1 -0
- package/dist/routes/trust.d.ts +16 -0
- package/dist/routes/trust.d.ts.map +1 -0
- package/dist/routes/trust.js +23 -0
- package/dist/routes/trust.js.map +1 -0
- package/dist/services/community-service.d.ts +277 -0
- package/dist/services/community-service.d.ts.map +1 -0
- package/dist/services/community-service.js +785 -0
- package/dist/services/community-service.js.map +1 -0
- package/dist/services/delegation-service.d.ts +149 -0
- package/dist/services/delegation-service.d.ts.map +1 -0
- package/dist/services/delegation-service.js +605 -0
- package/dist/services/delegation-service.js.map +1 -0
- package/dist/services/discovery-service.d.ts +39 -0
- package/dist/services/discovery-service.d.ts.map +1 -0
- package/dist/services/discovery-service.js +186 -0
- package/dist/services/discovery-service.js.map +1 -0
- package/dist/services/trust-service.d.ts +59 -0
- package/dist/services/trust-service.d.ts.map +1 -0
- package/dist/services/trust-service.js +139 -0
- package/dist/services/trust-service.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Service (Stories 6.1 + 6.2 — Delegation Core & Inbox)
|
|
3
|
+
*
|
|
4
|
+
* Implements the 4-phase delegation protocol: REQUEST → ACCEPT → EXECUTE → RETURN
|
|
5
|
+
* Uses a PoolTransport interface for communication (LocalPoolTransport for testing).
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { eq, and } from 'drizzle-orm';
|
|
9
|
+
import { delegationLog, capabilityRegistry } from '../db/schema.sqlite.js';
|
|
10
|
+
import { AnonymousIdManager } from '../db/anonymous-id-manager.js';
|
|
11
|
+
import { DiscoveryService, RateLimiter } from './discovery-service.js';
|
|
12
|
+
import { TrustService } from './trust-service.js';
|
|
13
|
+
import { RedactionPipeline } from '../lib/redaction/pipeline.js';
|
|
14
|
+
import { createRawLessonContent } from '@agentlensai/core';
|
|
15
|
+
// ─── Local Pool Transport (in-memory, for testing) ────────
|
|
16
|
+
export class LocalPoolTransport {
|
|
17
|
+
requests = new Map();
|
|
18
|
+
async sendDelegationRequest(request) {
|
|
19
|
+
this.requests.set(request.requestId, { ...request });
|
|
20
|
+
}
|
|
21
|
+
async pollDelegationInbox(targetAnonymousId) {
|
|
22
|
+
const results = [];
|
|
23
|
+
for (const req of this.requests.values()) {
|
|
24
|
+
if (req.targetAnonymousId === targetAnonymousId && req.status === 'request') {
|
|
25
|
+
results.push({ ...req });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return results;
|
|
29
|
+
}
|
|
30
|
+
async updateDelegationStatus(requestId, status, output) {
|
|
31
|
+
const req = this.requests.get(requestId);
|
|
32
|
+
if (!req)
|
|
33
|
+
return null;
|
|
34
|
+
req.status = status;
|
|
35
|
+
if (output !== undefined)
|
|
36
|
+
req.output = output;
|
|
37
|
+
if (status === 'completed' || status === 'rejected' || status === 'timeout' || status === 'error') {
|
|
38
|
+
req.completedAt = new Date().toISOString();
|
|
39
|
+
}
|
|
40
|
+
return { ...req };
|
|
41
|
+
}
|
|
42
|
+
async getDelegationRequest(requestId) {
|
|
43
|
+
const req = this.requests.get(requestId);
|
|
44
|
+
return req ? { ...req } : null;
|
|
45
|
+
}
|
|
46
|
+
/** Reset for testing */
|
|
47
|
+
clear() {
|
|
48
|
+
this.requests.clear();
|
|
49
|
+
}
|
|
50
|
+
/** Get all requests (for testing inspection) */
|
|
51
|
+
getAll() {
|
|
52
|
+
return Array.from(this.requests.values());
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ─── Delegation Service ───────────────────────────────────
|
|
56
|
+
export class DelegationService {
|
|
57
|
+
db;
|
|
58
|
+
transport;
|
|
59
|
+
anonIdManager;
|
|
60
|
+
discoveryService;
|
|
61
|
+
trustService;
|
|
62
|
+
redactionPipeline;
|
|
63
|
+
defaultTimeoutMs;
|
|
64
|
+
acceptTimeoutMs;
|
|
65
|
+
now;
|
|
66
|
+
inboundLimiter = new RateLimiter();
|
|
67
|
+
constructor(db, transport, options) {
|
|
68
|
+
this.db = db;
|
|
69
|
+
this.transport = transport;
|
|
70
|
+
this.anonIdManager = new AnonymousIdManager(db);
|
|
71
|
+
this.discoveryService = new DiscoveryService(db);
|
|
72
|
+
this.trustService = new TrustService(db);
|
|
73
|
+
this.redactionPipeline = new RedactionPipeline(options?.redactionConfig);
|
|
74
|
+
this.defaultTimeoutMs = options?.defaultTimeoutMs ?? 30_000;
|
|
75
|
+
this.acceptTimeoutMs = options?.acceptTimeoutMs ?? 5_000;
|
|
76
|
+
this.now = options?.now ?? (() => new Date());
|
|
77
|
+
}
|
|
78
|
+
// ─── Outbound: delegate() ─────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Send a delegation request to a target agent (outbound).
|
|
81
|
+
* Implements the 4-phase protocol: REQUEST → ACCEPT → EXECUTE → RETURN
|
|
82
|
+
* Supports fallback: on failure/timeout, retries with next-ranked discovery result.
|
|
83
|
+
*/
|
|
84
|
+
async delegate(tenantId, agentId, request) {
|
|
85
|
+
const fallbackEnabled = request.fallbackEnabled ?? false;
|
|
86
|
+
const maxRetries = Math.min(request.maxRetries ?? 3, 10);
|
|
87
|
+
// Build list of targets to try: primary target first, then fallback candidates
|
|
88
|
+
const targets = [request.targetAnonymousId];
|
|
89
|
+
if (fallbackEnabled && maxRetries > 0) {
|
|
90
|
+
// Discover alternative targets for fallback
|
|
91
|
+
const alternatives = this.discoveryService.discover(tenantId, {
|
|
92
|
+
taskType: request.taskType,
|
|
93
|
+
scope: 'internal',
|
|
94
|
+
limit: maxRetries + 5,
|
|
95
|
+
});
|
|
96
|
+
for (const alt of alternatives) {
|
|
97
|
+
if (alt.anonymousAgentId !== request.targetAnonymousId && !targets.includes(alt.anonymousAgentId)) {
|
|
98
|
+
targets.push(alt.anonymousAgentId);
|
|
99
|
+
}
|
|
100
|
+
if (targets.length >= maxRetries + 1)
|
|
101
|
+
break; // +1 for original
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
let retriesUsed = 0;
|
|
105
|
+
let lastResult;
|
|
106
|
+
for (let attempt = 0; attempt < targets.length; attempt++) {
|
|
107
|
+
const targetAnonId = targets[attempt];
|
|
108
|
+
const result = await this.delegateSingle(tenantId, agentId, {
|
|
109
|
+
...request,
|
|
110
|
+
targetAnonymousId: targetAnonId,
|
|
111
|
+
requestId: attempt === 0 ? request.requestId : undefined,
|
|
112
|
+
});
|
|
113
|
+
// Update trust after each delegation outcome
|
|
114
|
+
this.updateTrustAfterDelegation(tenantId, agentId);
|
|
115
|
+
lastResult = result;
|
|
116
|
+
if (result.status === 'success') {
|
|
117
|
+
return { ...result, retriesUsed };
|
|
118
|
+
}
|
|
119
|
+
// If fallback not enabled or this was the last attempt, return
|
|
120
|
+
if (!fallbackEnabled || attempt >= targets.length - 1) {
|
|
121
|
+
return { ...result, retriesUsed };
|
|
122
|
+
}
|
|
123
|
+
retriesUsed++;
|
|
124
|
+
}
|
|
125
|
+
return { ...lastResult, retriesUsed };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Execute a single delegation attempt (no fallback).
|
|
129
|
+
*/
|
|
130
|
+
async delegateSingle(tenantId, agentId, request) {
|
|
131
|
+
const requestId = request.requestId ?? randomUUID();
|
|
132
|
+
const timeoutMs = request.timeoutMs ?? this.defaultTimeoutMs;
|
|
133
|
+
const startTime = this.now().getTime();
|
|
134
|
+
// 1. Check delegation is enabled at tenant level
|
|
135
|
+
const config = this.discoveryService.getDiscoveryConfig(tenantId);
|
|
136
|
+
if (!config.delegationEnabled) {
|
|
137
|
+
return {
|
|
138
|
+
requestId,
|
|
139
|
+
status: 'rejected',
|
|
140
|
+
output: 'Delegation is disabled for this tenant',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// 2. Check outbound rate limit
|
|
144
|
+
const agentCaps = this.getAgentCapabilities(tenantId, agentId);
|
|
145
|
+
const outboundLimit = agentCaps?.outboundRateLimit ?? 20;
|
|
146
|
+
if (!this.discoveryService.checkOutboundRateLimit(agentId, outboundLimit)) {
|
|
147
|
+
this.logDelegation(tenantId, {
|
|
148
|
+
id: requestId,
|
|
149
|
+
direction: 'outbound',
|
|
150
|
+
agentId,
|
|
151
|
+
anonymousTargetId: request.targetAnonymousId,
|
|
152
|
+
taskType: request.taskType,
|
|
153
|
+
status: 'error',
|
|
154
|
+
createdAt: this.now().toISOString(),
|
|
155
|
+
completedAt: this.now().toISOString(),
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
requestId,
|
|
159
|
+
status: 'error',
|
|
160
|
+
output: 'Outbound rate limit exceeded',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// 3. Check trust threshold (H5 FIX: now actually computes trust)
|
|
164
|
+
const trustOk = this.checkTrustThreshold(tenantId, request.targetAnonymousId, agentId);
|
|
165
|
+
if (!trustOk) {
|
|
166
|
+
this.logDelegation(tenantId, {
|
|
167
|
+
id: requestId,
|
|
168
|
+
direction: 'outbound',
|
|
169
|
+
agentId,
|
|
170
|
+
anonymousTargetId: request.targetAnonymousId,
|
|
171
|
+
taskType: request.taskType,
|
|
172
|
+
status: 'rejected',
|
|
173
|
+
createdAt: this.now().toISOString(),
|
|
174
|
+
completedAt: this.now().toISOString(),
|
|
175
|
+
});
|
|
176
|
+
return {
|
|
177
|
+
requestId,
|
|
178
|
+
status: 'rejected',
|
|
179
|
+
output: 'Target does not meet minimum trust threshold',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// 4. Get anonymous ID for the requesting agent
|
|
183
|
+
const requesterAnonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
|
|
184
|
+
// 4b. H2 FIX: Redact delegation input before sending to pool
|
|
185
|
+
let redactedInput = request.input;
|
|
186
|
+
try {
|
|
187
|
+
const inputStr = typeof request.input === 'string' ? request.input : JSON.stringify(request.input);
|
|
188
|
+
const rawContent = createRawLessonContent('delegation-input', inputStr, {});
|
|
189
|
+
const redactionResult = await this.redactionPipeline.process(rawContent, {
|
|
190
|
+
tenantId,
|
|
191
|
+
agentId,
|
|
192
|
+
category: 'delegation',
|
|
193
|
+
denyListPatterns: [],
|
|
194
|
+
knownTenantTerms: [],
|
|
195
|
+
});
|
|
196
|
+
if (redactionResult.status === 'redacted') {
|
|
197
|
+
redactedInput = redactionResult.content.content;
|
|
198
|
+
}
|
|
199
|
+
else if (redactionResult.status === 'blocked') {
|
|
200
|
+
return {
|
|
201
|
+
requestId,
|
|
202
|
+
status: 'rejected',
|
|
203
|
+
output: `Delegation input blocked by redaction: ${redactionResult.reason}`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// On error, fall through with original input (fail-open for delegation usability)
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Redaction failure should not block delegation
|
|
210
|
+
}
|
|
211
|
+
// 5. Send request to pool transport
|
|
212
|
+
const poolRequest = {
|
|
213
|
+
requestId,
|
|
214
|
+
requesterAnonymousId: requesterAnonId,
|
|
215
|
+
targetAnonymousId: request.targetAnonymousId,
|
|
216
|
+
taskType: request.taskType,
|
|
217
|
+
input: redactedInput,
|
|
218
|
+
timeoutMs,
|
|
219
|
+
status: 'request',
|
|
220
|
+
createdAt: this.now().toISOString(),
|
|
221
|
+
};
|
|
222
|
+
await this.transport.sendDelegationRequest(poolRequest);
|
|
223
|
+
// Log the outbound delegation
|
|
224
|
+
this.logDelegation(tenantId, {
|
|
225
|
+
id: requestId,
|
|
226
|
+
direction: 'outbound',
|
|
227
|
+
agentId,
|
|
228
|
+
anonymousTargetId: request.targetAnonymousId,
|
|
229
|
+
taskType: request.taskType,
|
|
230
|
+
status: 'request',
|
|
231
|
+
requestSizeBytes: JSON.stringify(request.input).length,
|
|
232
|
+
createdAt: this.now().toISOString(),
|
|
233
|
+
});
|
|
234
|
+
// 6. Wait for result (poll-based with timeout)
|
|
235
|
+
const result = await this.waitForResult(requestId, timeoutMs, startTime);
|
|
236
|
+
// 7. Update delegation log
|
|
237
|
+
const executionTimeMs = this.now().getTime() - startTime;
|
|
238
|
+
this.updateDelegationLog(tenantId, requestId, {
|
|
239
|
+
status: result.status === 'success' ? 'completed' : result.status,
|
|
240
|
+
executionTimeMs,
|
|
241
|
+
responseSizeBytes: result.output ? JSON.stringify(result.output).length : undefined,
|
|
242
|
+
completedAt: this.now().toISOString(),
|
|
243
|
+
});
|
|
244
|
+
return {
|
|
245
|
+
...result,
|
|
246
|
+
requestId,
|
|
247
|
+
executionTimeMs,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Update trust score after a delegation outcome.
|
|
252
|
+
*/
|
|
253
|
+
updateTrustAfterDelegation(tenantId, agentId) {
|
|
254
|
+
try {
|
|
255
|
+
this.trustService.updateAfterDelegation(tenantId, agentId);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// Trust updates should not break delegation
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// ─── Inbound: inbox & acceptance ──────────────────────
|
|
262
|
+
/**
|
|
263
|
+
* Poll the inbox for pending delegation requests targeting this agent.
|
|
264
|
+
*/
|
|
265
|
+
async getInbox(tenantId, agentId) {
|
|
266
|
+
const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
|
|
267
|
+
const pending = await this.transport.pollDelegationInbox(anonId);
|
|
268
|
+
// Filter out expired requests (accept timeout)
|
|
269
|
+
const now = this.now().getTime();
|
|
270
|
+
const valid = [];
|
|
271
|
+
for (const req of pending) {
|
|
272
|
+
const createdAt = new Date(req.createdAt).getTime();
|
|
273
|
+
if (now - createdAt > this.acceptTimeoutMs) {
|
|
274
|
+
// Auto-reject expired requests
|
|
275
|
+
await this.transport.updateDelegationStatus(req.requestId, 'timeout');
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
valid.push(req);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return valid;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Accept a delegation request.
|
|
285
|
+
*/
|
|
286
|
+
async acceptDelegation(tenantId, agentId, requestId) {
|
|
287
|
+
// Check acceptDelegations toggle
|
|
288
|
+
const caps = this.getAgentCapabilities(tenantId, agentId);
|
|
289
|
+
if (!caps?.acceptDelegations) {
|
|
290
|
+
// Reject — acceptDelegations is disabled
|
|
291
|
+
await this.transport.updateDelegationStatus(requestId, 'rejected');
|
|
292
|
+
return { ok: false, error: 'Agent does not accept delegations' };
|
|
293
|
+
}
|
|
294
|
+
// Check inbound rate limit
|
|
295
|
+
const inboundLimit = caps.inboundRateLimit ?? 10;
|
|
296
|
+
if (!this.inboundLimiter.check(`inbound:${agentId}`, inboundLimit)) {
|
|
297
|
+
await this.transport.updateDelegationStatus(requestId, 'rejected');
|
|
298
|
+
return { ok: false, error: 'Inbound rate limit exceeded' };
|
|
299
|
+
}
|
|
300
|
+
// Check the request exists and is in 'request' status
|
|
301
|
+
const req = await this.transport.getDelegationRequest(requestId);
|
|
302
|
+
if (!req) {
|
|
303
|
+
return { ok: false, error: 'Delegation request not found' };
|
|
304
|
+
}
|
|
305
|
+
// Check accept timeout
|
|
306
|
+
const createdAt = new Date(req.createdAt).getTime();
|
|
307
|
+
const now = this.now().getTime();
|
|
308
|
+
if (now - createdAt > this.acceptTimeoutMs) {
|
|
309
|
+
await this.transport.updateDelegationStatus(requestId, 'timeout');
|
|
310
|
+
return { ok: false, error: 'Accept timeout exceeded' };
|
|
311
|
+
}
|
|
312
|
+
if (req.status !== 'request') {
|
|
313
|
+
return { ok: false, error: `Cannot accept delegation in status: ${req.status}` };
|
|
314
|
+
}
|
|
315
|
+
// Verify the target matches this agent's anonymous ID
|
|
316
|
+
const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
|
|
317
|
+
if (req.targetAnonymousId !== anonId) {
|
|
318
|
+
return { ok: false, error: 'Delegation request is not targeted at this agent' };
|
|
319
|
+
}
|
|
320
|
+
await this.transport.updateDelegationStatus(requestId, 'accepted');
|
|
321
|
+
// Log inbound delegation
|
|
322
|
+
this.logDelegation(tenantId, {
|
|
323
|
+
id: requestId,
|
|
324
|
+
direction: 'inbound',
|
|
325
|
+
agentId,
|
|
326
|
+
anonymousSourceId: req.requesterAnonymousId,
|
|
327
|
+
taskType: req.taskType,
|
|
328
|
+
status: 'accepted',
|
|
329
|
+
requestSizeBytes: JSON.stringify(req.input).length,
|
|
330
|
+
createdAt: req.createdAt,
|
|
331
|
+
});
|
|
332
|
+
return { ok: true };
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Reject a delegation request.
|
|
336
|
+
*/
|
|
337
|
+
async rejectDelegation(tenantId, agentId, requestId, reason) {
|
|
338
|
+
const req = await this.transport.getDelegationRequest(requestId);
|
|
339
|
+
if (!req) {
|
|
340
|
+
return { ok: false, error: 'Delegation request not found' };
|
|
341
|
+
}
|
|
342
|
+
if (req.status !== 'request' && req.status !== 'accepted') {
|
|
343
|
+
return { ok: false, error: `Cannot reject delegation in status: ${req.status}` };
|
|
344
|
+
}
|
|
345
|
+
// Verify the target matches this agent
|
|
346
|
+
const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
|
|
347
|
+
if (req.targetAnonymousId !== anonId) {
|
|
348
|
+
return { ok: false, error: 'Delegation request is not targeted at this agent' };
|
|
349
|
+
}
|
|
350
|
+
await this.transport.updateDelegationStatus(requestId, 'rejected');
|
|
351
|
+
// Log
|
|
352
|
+
this.logDelegation(tenantId, {
|
|
353
|
+
id: requestId,
|
|
354
|
+
direction: 'inbound',
|
|
355
|
+
agentId,
|
|
356
|
+
anonymousSourceId: req.requesterAnonymousId,
|
|
357
|
+
taskType: req.taskType,
|
|
358
|
+
status: 'rejected',
|
|
359
|
+
createdAt: req.createdAt,
|
|
360
|
+
completedAt: this.now().toISOString(),
|
|
361
|
+
});
|
|
362
|
+
return { ok: true };
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Complete a delegation request with a result.
|
|
366
|
+
*/
|
|
367
|
+
async completeDelegation(tenantId, agentId, requestId, output) {
|
|
368
|
+
const req = await this.transport.getDelegationRequest(requestId);
|
|
369
|
+
if (!req) {
|
|
370
|
+
return { ok: false, error: 'Delegation request not found' };
|
|
371
|
+
}
|
|
372
|
+
if (req.status !== 'accepted' && req.status !== 'executing') {
|
|
373
|
+
return { ok: false, error: `Cannot complete delegation in status: ${req.status}` };
|
|
374
|
+
}
|
|
375
|
+
// Verify the target matches this agent
|
|
376
|
+
const anonId = this.anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
|
|
377
|
+
if (req.targetAnonymousId !== anonId) {
|
|
378
|
+
return { ok: false, error: 'Delegation request is not targeted at this agent' };
|
|
379
|
+
}
|
|
380
|
+
await this.transport.updateDelegationStatus(requestId, 'completed', output);
|
|
381
|
+
// Update log
|
|
382
|
+
const completedAt = this.now().toISOString();
|
|
383
|
+
this.updateDelegationLog(tenantId, requestId, {
|
|
384
|
+
status: 'completed',
|
|
385
|
+
responseSizeBytes: JSON.stringify(output).length,
|
|
386
|
+
completedAt,
|
|
387
|
+
});
|
|
388
|
+
return { ok: true };
|
|
389
|
+
}
|
|
390
|
+
// ─── Helpers ──────────────────────────────────────────
|
|
391
|
+
getAgentCapabilities(tenantId, agentId) {
|
|
392
|
+
// Query capability_registry for the agent's permission settings
|
|
393
|
+
const rows = this.db
|
|
394
|
+
.select()
|
|
395
|
+
.from(capabilityRegistry)
|
|
396
|
+
.where(and(eq(capabilityRegistry.tenantId, tenantId), eq(capabilityRegistry.agentId, agentId)))
|
|
397
|
+
.all();
|
|
398
|
+
if (rows.length === 0)
|
|
399
|
+
return null;
|
|
400
|
+
// Use the first capability's settings (all caps for an agent share settings)
|
|
401
|
+
const row = rows[0];
|
|
402
|
+
return {
|
|
403
|
+
outboundRateLimit: row.outboundRateLimit,
|
|
404
|
+
inboundRateLimit: row.inboundRateLimit,
|
|
405
|
+
acceptDelegations: row.acceptDelegations,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* H5 FIX: Actually check trust threshold using the TrustService.
|
|
410
|
+
* Computes the requesting agent's trust score on-the-fly and compares
|
|
411
|
+
* against the tenant's minimum trust threshold.
|
|
412
|
+
*/
|
|
413
|
+
checkTrustThreshold(tenantId, _targetAnonymousId, agentId) {
|
|
414
|
+
if (!agentId)
|
|
415
|
+
return true; // Can't check without agentId
|
|
416
|
+
try {
|
|
417
|
+
const config = this.discoveryService.getDiscoveryConfig(tenantId);
|
|
418
|
+
const trustScore = this.trustService.getTrustScore(tenantId, agentId);
|
|
419
|
+
return trustScore.percentile >= config.minTrustThreshold;
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
// If trust computation fails, fail-open to avoid breaking delegation
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
async waitForResult(requestId, timeoutMs, startTime) {
|
|
427
|
+
// Poll for result with small intervals
|
|
428
|
+
const pollInterval = 50; // ms
|
|
429
|
+
while (true) {
|
|
430
|
+
const elapsed = this.now().getTime() - startTime;
|
|
431
|
+
if (elapsed >= timeoutMs) {
|
|
432
|
+
await this.transport.updateDelegationStatus(requestId, 'timeout');
|
|
433
|
+
return { requestId, status: 'timeout' };
|
|
434
|
+
}
|
|
435
|
+
const req = await this.transport.getDelegationRequest(requestId);
|
|
436
|
+
if (!req) {
|
|
437
|
+
return { requestId, status: 'error', output: 'Request not found' };
|
|
438
|
+
}
|
|
439
|
+
if (req.status === 'completed') {
|
|
440
|
+
return { requestId, status: 'success', output: req.output };
|
|
441
|
+
}
|
|
442
|
+
if (req.status === 'rejected') {
|
|
443
|
+
return { requestId, status: 'rejected' };
|
|
444
|
+
}
|
|
445
|
+
if (req.status === 'timeout') {
|
|
446
|
+
return { requestId, status: 'timeout' };
|
|
447
|
+
}
|
|
448
|
+
if (req.status === 'error') {
|
|
449
|
+
return { requestId, status: 'error', output: req.output };
|
|
450
|
+
}
|
|
451
|
+
// Wait before next poll
|
|
452
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
logDelegation(tenantId, data) {
|
|
456
|
+
try {
|
|
457
|
+
// Check if entry already exists (upsert logic)
|
|
458
|
+
const existing = this.db
|
|
459
|
+
.select()
|
|
460
|
+
.from(delegationLog)
|
|
461
|
+
.where(eq(delegationLog.id, data.id))
|
|
462
|
+
.get();
|
|
463
|
+
if (existing) {
|
|
464
|
+
// Update existing
|
|
465
|
+
this.updateDelegationLog(tenantId, data.id, {
|
|
466
|
+
status: data.status,
|
|
467
|
+
responseSizeBytes: data.responseSizeBytes,
|
|
468
|
+
executionTimeMs: data.executionTimeMs,
|
|
469
|
+
completedAt: data.completedAt,
|
|
470
|
+
});
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
this.db.insert(delegationLog).values({
|
|
474
|
+
id: data.id,
|
|
475
|
+
tenantId,
|
|
476
|
+
direction: data.direction,
|
|
477
|
+
agentId: data.agentId,
|
|
478
|
+
anonymousTargetId: data.anonymousTargetId ?? null,
|
|
479
|
+
anonymousSourceId: data.anonymousSourceId ?? null,
|
|
480
|
+
taskType: data.taskType,
|
|
481
|
+
status: data.status,
|
|
482
|
+
requestSizeBytes: data.requestSizeBytes ?? null,
|
|
483
|
+
responseSizeBytes: data.responseSizeBytes ?? null,
|
|
484
|
+
executionTimeMs: data.executionTimeMs ?? null,
|
|
485
|
+
costUsd: data.costUsd ?? null,
|
|
486
|
+
createdAt: data.createdAt,
|
|
487
|
+
completedAt: data.completedAt ?? null,
|
|
488
|
+
}).run();
|
|
489
|
+
}
|
|
490
|
+
catch {
|
|
491
|
+
// Log failures should not break delegation
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
updateDelegationLog(tenantId, requestId, updates) {
|
|
495
|
+
try {
|
|
496
|
+
const setObj = {};
|
|
497
|
+
if (updates.status !== undefined)
|
|
498
|
+
setObj.status = updates.status;
|
|
499
|
+
if (updates.responseSizeBytes !== undefined)
|
|
500
|
+
setObj.responseSizeBytes = updates.responseSizeBytes;
|
|
501
|
+
if (updates.executionTimeMs !== undefined)
|
|
502
|
+
setObj.executionTimeMs = updates.executionTimeMs;
|
|
503
|
+
if (updates.completedAt !== undefined)
|
|
504
|
+
setObj.completedAt = updates.completedAt;
|
|
505
|
+
if (Object.keys(setObj).length > 0) {
|
|
506
|
+
this.db
|
|
507
|
+
.update(delegationLog)
|
|
508
|
+
.set(setObj)
|
|
509
|
+
.where(and(eq(delegationLog.id, requestId), eq(delegationLog.tenantId, tenantId)))
|
|
510
|
+
.run();
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
// Log failures should not break delegation
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Get delegation logs for a tenant (for auditing/dashboard).
|
|
519
|
+
*/
|
|
520
|
+
getDelegationLogs(tenantId, agentId) {
|
|
521
|
+
if (agentId) {
|
|
522
|
+
return this.db
|
|
523
|
+
.select()
|
|
524
|
+
.from(delegationLog)
|
|
525
|
+
.where(and(eq(delegationLog.tenantId, tenantId), eq(delegationLog.agentId, agentId)))
|
|
526
|
+
.all();
|
|
527
|
+
}
|
|
528
|
+
return this.db
|
|
529
|
+
.select()
|
|
530
|
+
.from(delegationLog)
|
|
531
|
+
.where(eq(delegationLog.tenantId, tenantId))
|
|
532
|
+
.all();
|
|
533
|
+
}
|
|
534
|
+
// ─── Story 6.5: Delegation Audit & Logging ────────────
|
|
535
|
+
/**
|
|
536
|
+
* Get delegations for a specific agent with filters.
|
|
537
|
+
*/
|
|
538
|
+
getDelegationsForAgent(tenantId, agentId, filters) {
|
|
539
|
+
let rows = this.db
|
|
540
|
+
.select()
|
|
541
|
+
.from(delegationLog)
|
|
542
|
+
.where(and(eq(delegationLog.tenantId, tenantId), eq(delegationLog.agentId, agentId)))
|
|
543
|
+
.all();
|
|
544
|
+
if (filters?.direction) {
|
|
545
|
+
rows = rows.filter((r) => r.direction === filters.direction);
|
|
546
|
+
}
|
|
547
|
+
if (filters?.status) {
|
|
548
|
+
rows = rows.filter((r) => r.status === filters.status);
|
|
549
|
+
}
|
|
550
|
+
if (filters?.dateFrom) {
|
|
551
|
+
rows = rows.filter((r) => r.createdAt >= filters.dateFrom);
|
|
552
|
+
}
|
|
553
|
+
if (filters?.dateTo) {
|
|
554
|
+
rows = rows.filter((r) => r.createdAt <= filters.dateTo);
|
|
555
|
+
}
|
|
556
|
+
return rows;
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Export delegation logs as JSON for a tenant.
|
|
560
|
+
*/
|
|
561
|
+
exportDelegationLogs(tenantId) {
|
|
562
|
+
const logs = this.getDelegationLogs(tenantId);
|
|
563
|
+
return JSON.stringify(logs, null, 2);
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Cleanup delegation logs older than retention period.
|
|
567
|
+
* Default: 90 days. Configurable via retentionDays parameter.
|
|
568
|
+
*/
|
|
569
|
+
cleanupOldLogs(tenantId, retentionDays = 90) {
|
|
570
|
+
const cutoff = new Date(this.now().getTime() - retentionDays * 24 * 60 * 60 * 1000);
|
|
571
|
+
const cutoffIso = cutoff.toISOString();
|
|
572
|
+
// Get count before delete
|
|
573
|
+
const oldLogs = this.db
|
|
574
|
+
.select()
|
|
575
|
+
.from(delegationLog)
|
|
576
|
+
.where(eq(delegationLog.tenantId, tenantId))
|
|
577
|
+
.all()
|
|
578
|
+
.filter((r) => r.createdAt < cutoffIso);
|
|
579
|
+
for (const log of oldLogs) {
|
|
580
|
+
this.db
|
|
581
|
+
.delete(delegationLog)
|
|
582
|
+
.where(and(eq(delegationLog.id, log.id), eq(delegationLog.tenantId, tenantId)))
|
|
583
|
+
.run();
|
|
584
|
+
}
|
|
585
|
+
return oldLogs.length;
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Detect volume alerts: >100 delegations/hour triggers alert flag.
|
|
589
|
+
* Returns true if alert should fire.
|
|
590
|
+
*/
|
|
591
|
+
checkVolumeAlert(tenantId, threshold = 100) {
|
|
592
|
+
const oneHourAgo = new Date(this.now().getTime() - 60 * 60 * 1000).toISOString();
|
|
593
|
+
const recentLogs = this.db
|
|
594
|
+
.select()
|
|
595
|
+
.from(delegationLog)
|
|
596
|
+
.where(eq(delegationLog.tenantId, tenantId))
|
|
597
|
+
.all()
|
|
598
|
+
.filter((r) => r.createdAt >= oneHourAgo);
|
|
599
|
+
return {
|
|
600
|
+
alert: recentLogs.length > threshold,
|
|
601
|
+
count: recentLogs.length,
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=delegation-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-service.js","sourceRoot":"","sources":["../../src/services/delegation-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAgC,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAoC3D,6DAA6D;AAE7D,MAAM,OAAO,kBAAkB;IACrB,QAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC;IAE5D,KAAK,CAAC,qBAAqB,CAAC,OAA8B;QACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,iBAAyB;QACjD,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,GAAG,CAAC,iBAAiB,KAAK,iBAAiB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,SAAiB,EACjB,MAAuB,EACvB,MAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,IAAI,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QAC9C,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YAClG,GAAG,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,SAAiB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,wBAAwB;IACxB,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,gDAAgD;IAChD,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF;AAeD,6DAA6D;AAE7D,MAAM,OAAO,iBAAiB;IAWT;IACA;IAXF,aAAa,CAAqB;IAClC,gBAAgB,CAAmB;IACnC,YAAY,CAAe;IAC3B,iBAAiB,CAAoB;IACrC,gBAAgB,CAAS;IACzB,eAAe,CAAS;IACxB,GAAG,CAAa;IACxB,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC;IAE5C,YACmB,EAAY,EACZ,SAAwB,EACzC,OAAkC;QAFjB,OAAE,GAAF,EAAE,CAAU;QACZ,cAAS,GAAT,SAAS,CAAe;QAGzC,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACzE,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,MAAM,CAAC;QAC5D,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,KAAK,CAAC;QACzD,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,yDAAyD;IAEzD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,OAAe,EACf,OAAsE;QAEtE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEzD,+EAA+E;QAC/E,MAAM,OAAO,GAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEtD,IAAI,eAAe,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACtC,4CAA4C;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBAC5D,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,UAAU,GAAG,CAAC;aACtB,CAAC,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,IAAI,GAAG,CAAC,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAClG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBACrC,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,GAAG,CAAC;oBAAE,MAAM,CAAC,kBAAkB;YACjE,CAAC;QACH,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,UAAwC,CAAC;QAE7C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;YAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE;gBAC1D,GAAG,OAAO;gBACV,iBAAiB,EAAE,YAAY;gBAC/B,SAAS,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;aACzD,CAAC,CAAC;YAEH,6CAA6C;YAC7C,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEnD,UAAU,GAAG,MAAM,CAAC;YAEpB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;YACpC,CAAC;YAED,+DAA+D;YAC/D,IAAI,CAAC,eAAe,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;YACpC,CAAC;YAED,WAAW,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,EAAE,GAAG,UAAW,EAAE,WAAW,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAC1B,QAAgB,EAChB,OAAe,EACf,OAAsE;QAEtE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAEvC,iDAAiD;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC9B,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,wCAAwC;aACjD,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAG,SAAS,EAAE,iBAAiB,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;YAC1E,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC3B,EAAE,EAAE,SAAS;gBACb,SAAS,EAAE,UAAU;gBACrB,OAAO;gBACP,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;gBACnC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC,CAAC;YACH,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,8BAA8B;aACvC,CAAC;QACJ,CAAC;QAED,iEAAiE;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACvF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC3B,EAAE,EAAE,SAAS;gBACb,SAAS,EAAE,UAAU;gBACrB,OAAO;gBACP,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;gBACnC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC,CAAC;YACH,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,8CAA8C;aACvD,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAErF,6DAA6D;QAC7D,IAAI,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACnG,MAAM,UAAU,GAAG,sBAAsB,CAAC,kBAAkB,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC5E,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE;gBACvE,QAAQ;gBACR,OAAO;gBACP,QAAQ,EAAE,YAAY;gBACtB,gBAAgB,EAAE,EAAE;gBACpB,gBAAgB,EAAE,EAAE;aACrB,CAAC,CAAC;YACH,IAAI,eAAe,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1C,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;YAClD,CAAC;iBAAM,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChD,OAAO;oBACL,SAAS;oBACT,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,0CAA0C,eAAe,CAAC,MAAM,EAAE;iBAC3E,CAAC;YACJ,CAAC;YACD,kFAAkF;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;QAED,oCAAoC;QACpC,MAAM,WAAW,GAA0B;YACzC,SAAS;YACT,oBAAoB,EAAE,eAAe;YACrC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,aAAa;YACpB,SAAS;YACT,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAExD,8BAA8B;QAC9B,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3B,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,UAAU;YACrB,OAAO;YACP,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,SAAS;YACjB,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM;YACtD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAEzE,2BAA2B;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC;QACzD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE;YAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;YACjE,eAAe;YACf,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACnF,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,MAAM;YACT,SAAS;YACT,eAAe;SAChB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,0BAA0B,CAAC,QAAgB,EAAE,OAAe;QAClE,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED,yDAAyD;IAEzD;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,OAAe;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjE,+CAA+C;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC3C,+BAA+B;gBAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,QAAgB,EAChB,OAAe,EACf,SAAiB;QAEjB,iCAAiC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;YAC7B,yCAAyC;YACzC,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACnE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;QACnE,CAAC;QAED,2BAA2B;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACnE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;QAC7D,CAAC;QAED,sDAAsD;QACtD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;QAC9D,CAAC;QAED,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QACzD,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACnF,CAAC;QAED,sDAAsD;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAEnE,yBAAyB;QACzB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3B,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,SAAS;YACpB,OAAO;YACP,iBAAiB,EAAE,GAAG,CAAC,oBAAoB;YAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,UAAU;YAClB,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM;YAClD,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,QAAgB,EAChB,OAAe,EACf,SAAiB,EACjB,MAAe;QAEf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;QAC9D,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACnF,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM;QACN,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3B,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,SAAS;YACpB,OAAO;YACP,iBAAiB,EAAE,GAAG,CAAC,oBAAoB;YAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC;QAEH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,OAAe,EACf,SAAiB,EACjB,MAAe;QAEf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;QAC9D,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yCAAyC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACrF,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAE5E,aAAa;QACb,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE;YAC5C,MAAM,EAAE,WAAW;YACnB,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM;YAChD,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,yDAAyD;IAEjD,oBAAoB,CAAC,QAAgB,EAAE,OAAe;QAK5D,gEAAgE;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,MAAM,EAAE;aACR,IAAI,CAAC,kBAAkB,CAAC;aACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACzC,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CACxC,CACF;aACA,GAAG,EAAE,CAAC;QAET,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEnC,6EAA6E;QAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO;YACL,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;SACzC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,mBAAmB,CAAC,QAAgB,EAAE,kBAA0B,EAAE,OAAgB;QACxF,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtE,OAAO,UAAU,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,SAAiB,EACjB,SAAiB,EACjB,SAAiB;QAEjB,uCAAuC;QACvC,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC,KAAK;QAC9B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC;YACjD,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAClE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YACrE,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;YAC9D,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC3C,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC1C,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5D,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAEO,aAAa,CACnB,QAAgB,EAChB,IAcC;QAED,IAAI,CAAC;YACH,+CAA+C;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE;iBACrB,MAAM,EAAE;iBACR,IAAI,CAAC,aAAa,CAAC;iBACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;iBACpC,GAAG,EAAE,CAAC;YAET,IAAI,QAAQ,EAAE,CAAC;gBACb,kBAAkB;gBAClB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;oBAC1C,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;oBACzC,eAAe,EAAE,IAAI,CAAC,eAAe;oBACrC,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;gBACnC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ;gBACR,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI;gBACjD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI;gBACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;gBAC/C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI;gBACjD,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI;gBAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;aACtC,CAAC,CAAC,GAAG,EAAE,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAEO,mBAAmB,CACzB,QAAgB,EAChB,SAAiB,EACjB,OAKC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACjE,IAAI,OAAO,CAAC,iBAAiB,KAAK,SAAS;gBAAE,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAClG,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;gBAAE,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;YAC5F,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;gBAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YAEhF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,EAAE;qBACJ,MAAM,CAAC,aAAa,CAAC;qBACrB,GAAG,CAAC,MAAM,CAAC;qBACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;qBACjF,GAAG,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAgB,EAAE,OAAgB;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,EAAE;iBACX,MAAM,EAAE;iBACR,IAAI,CAAC,aAAa,CAAC;iBACnB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;iBACpF,GAAG,EAAE,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,EAAE;aACX,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC3C,GAAG,EAAE,CAAC;IACX,CAAC;IAED,yDAAyD;IAEzD;;OAEG;IACH,sBAAsB,CACpB,QAAgB,EAChB,OAAe,EACf,OAKC;QAED,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE;aACf,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;aACpF,GAAG,EAAE,CAAC;QAET,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,QAAS,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,MAAO,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,QAAgB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,QAAgB,EAAE,gBAAwB,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAEvC,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC3C,GAAG,EAAE;aACL,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;QAE1C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,EAAE;iBACJ,MAAM,CAAC,aAAa,CAAC;iBACrB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;iBAC9E,GAAG,EAAE,CAAC;QACX,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,QAAgB,EAAE,YAAoB,GAAG;QACxD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACjF,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC3C,GAAG,EAAE;aACL,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC;QAE5C,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,SAAS;YACpC,KAAK,EAAE,UAAU,CAAC,MAAM;SACzB,CAAC;IACJ,CAAC;CACF"}
|