@stackbilt/llm-providers 1.0.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.
Files changed (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +261 -0
  3. package/dist/errors.d.ts +79 -0
  4. package/dist/errors.d.ts.map +1 -0
  5. package/dist/errors.js +183 -0
  6. package/dist/errors.js.map +1 -0
  7. package/dist/factory.d.ts +95 -0
  8. package/dist/factory.d.ts.map +1 -0
  9. package/dist/factory.js +418 -0
  10. package/dist/factory.js.map +1 -0
  11. package/dist/index.d.ts +137 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +263 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/providers/anthropic.d.ts +38 -0
  16. package/dist/providers/anthropic.d.ts.map +1 -0
  17. package/dist/providers/anthropic.js +378 -0
  18. package/dist/providers/anthropic.js.map +1 -0
  19. package/dist/providers/base.d.ts +107 -0
  20. package/dist/providers/base.d.ts.map +1 -0
  21. package/dist/providers/base.js +230 -0
  22. package/dist/providers/base.js.map +1 -0
  23. package/dist/providers/cerebras.d.ts +30 -0
  24. package/dist/providers/cerebras.d.ts.map +1 -0
  25. package/dist/providers/cerebras.js +292 -0
  26. package/dist/providers/cerebras.js.map +1 -0
  27. package/dist/providers/cloudflare.d.ts +47 -0
  28. package/dist/providers/cloudflare.d.ts.map +1 -0
  29. package/dist/providers/cloudflare.js +544 -0
  30. package/dist/providers/cloudflare.js.map +1 -0
  31. package/dist/providers/groq.d.ts +30 -0
  32. package/dist/providers/groq.d.ts.map +1 -0
  33. package/dist/providers/groq.js +222 -0
  34. package/dist/providers/groq.js.map +1 -0
  35. package/dist/providers/openai.d.ts +36 -0
  36. package/dist/providers/openai.d.ts.map +1 -0
  37. package/dist/providers/openai.js +331 -0
  38. package/dist/providers/openai.js.map +1 -0
  39. package/dist/types.d.ts +238 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +6 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/utils/circuit-breaker.d.ts +111 -0
  44. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  45. package/dist/utils/circuit-breaker.js +365 -0
  46. package/dist/utils/circuit-breaker.js.map +1 -0
  47. package/dist/utils/cost-tracker.d.ts +130 -0
  48. package/dist/utils/cost-tracker.d.ts.map +1 -0
  49. package/dist/utils/cost-tracker.js +272 -0
  50. package/dist/utils/cost-tracker.js.map +1 -0
  51. package/dist/utils/credit-ledger.d.ts +161 -0
  52. package/dist/utils/credit-ledger.d.ts.map +1 -0
  53. package/dist/utils/credit-ledger.js +463 -0
  54. package/dist/utils/credit-ledger.js.map +1 -0
  55. package/dist/utils/retry.d.ts +46 -0
  56. package/dist/utils/retry.d.ts.map +1 -0
  57. package/dist/utils/retry.js +125 -0
  58. package/dist/utils/retry.js.map +1 -0
  59. package/package.json +57 -0
@@ -0,0 +1,463 @@
1
+ /**
2
+ * Credit Ledger — single source of truth for LLM spend across the ecosystem.
3
+ *
4
+ * Tracks per-provider, per-model spend with budgets, rate limits, and
5
+ * threshold events. Persistence-agnostic: holds state in memory, serializes
6
+ * via snapshot()/restore() for any storage backend (D1, KV, R2, etc.).
7
+ */
8
+ // ─── Constants ──────────────────────────────────────────────
9
+ const DEFAULT_THRESHOLDS = {
10
+ warning: 0.80,
11
+ critical: 0.90,
12
+ emergency: 0.95,
13
+ };
14
+ const MINUTE_MS = 60_000;
15
+ const HOUR_MS = 3_600_000;
16
+ const DAY_MS = 86_400_000;
17
+ /** Default ring buffer capacity: 2000 entries ≈ a few days of heavy usage. */
18
+ const DEFAULT_RING_BUFFER_SIZE = 2000;
19
+ /** Default burn rate window: 24 hours. */
20
+ const DEFAULT_BURN_RATE_WINDOW_MS = 24 * HOUR_MS;
21
+ /** Depletion projection thresholds (days remaining). */
22
+ const DEPLETION_THRESHOLDS = {
23
+ depletion_warning: 7,
24
+ depletion_critical: 3,
25
+ depletion_emergency: 1,
26
+ };
27
+ const DEPLETION_SEVERITY = {
28
+ depletion_warning: 1,
29
+ depletion_critical: 2,
30
+ depletion_emergency: 3,
31
+ };
32
+ const WINDOW_DURATIONS = {
33
+ rpm: MINUTE_MS,
34
+ rpd: DAY_MS,
35
+ tpm: MINUTE_MS,
36
+ tpd: DAY_MS,
37
+ };
38
+ // ─── Helpers ────────────────────────────────────────────────
39
+ function createModelAccumulator() {
40
+ return { spend: 0, inputTokens: 0, outputTokens: 0, requestCount: 0, lastRecordedAt: 0 };
41
+ }
42
+ function createProviderAccumulator(budget = null) {
43
+ return { ...createModelAccumulator(), models: {}, budget, rateLimits: {} };
44
+ }
45
+ function evaluateTier(spend, budget, thresholds) {
46
+ if (budget <= 0)
47
+ return null;
48
+ const ratio = spend / budget;
49
+ if (ratio >= thresholds.emergency)
50
+ return 'emergency';
51
+ if (ratio >= thresholds.critical)
52
+ return 'critical';
53
+ if (ratio >= thresholds.warning)
54
+ return 'warning';
55
+ return null;
56
+ }
57
+ const TIER_SEVERITY = { warning: 1, critical: 2, emergency: 3 };
58
+ // ─── CreditLedger ───────────────────────────────────────────
59
+ export class CreditLedger {
60
+ providers = new Map();
61
+ thresholds;
62
+ budgets = [];
63
+ listeners = [];
64
+ periodStart;
65
+ lastFiredTier = new Map(); // provider → last tier fired
66
+ lastFiredDepletionTier = new Map();
67
+ spendHistory = [];
68
+ ringBufferSize;
69
+ constructor(config) {
70
+ this.thresholds = { ...DEFAULT_THRESHOLDS, ...config?.thresholds };
71
+ this.periodStart = Date.now();
72
+ this.ringBufferSize = config?.ringBufferSize ?? DEFAULT_RING_BUFFER_SIZE;
73
+ if (config?.budgets) {
74
+ for (const b of config.budgets)
75
+ this.setBudget(b);
76
+ }
77
+ }
78
+ // ─── Core recording ─────────────────────────────────────
79
+ record(provider, model, cost, inputTokens, outputTokens) {
80
+ const now = Date.now();
81
+ const acc = this.getOrCreateProvider(provider);
82
+ const totalTokens = inputTokens + outputTokens;
83
+ // Update provider-level accumulators
84
+ acc.spend += cost;
85
+ acc.inputTokens += inputTokens;
86
+ acc.outputTokens += outputTokens;
87
+ acc.requestCount++;
88
+ acc.lastRecordedAt = now;
89
+ // Update model-level accumulators
90
+ if (!acc.models[model])
91
+ acc.models[model] = createModelAccumulator();
92
+ const ma = acc.models[model];
93
+ ma.spend += cost;
94
+ ma.inputTokens += inputTokens;
95
+ ma.outputTokens += outputTokens;
96
+ ma.requestCount++;
97
+ ma.lastRecordedAt = now;
98
+ // Update rate limits (auto-reset stale windows)
99
+ for (const [dim, window] of Object.entries(acc.rateLimits)) {
100
+ const duration = WINDOW_DURATIONS[dim];
101
+ if (now - window.windowStart >= duration) {
102
+ window.used = 0;
103
+ window.windowStart = now;
104
+ }
105
+ if (dim === 'rpm' || dim === 'rpd') {
106
+ window.used++;
107
+ }
108
+ else {
109
+ window.used += totalTokens;
110
+ }
111
+ }
112
+ // Record spend entry for burn rate calculation
113
+ this.spendHistory.push({ timestamp: now, provider, cost });
114
+ if (this.spendHistory.length > this.ringBufferSize) {
115
+ this.spendHistory.shift();
116
+ }
117
+ // Check budget thresholds
118
+ if (acc.budget !== null && acc.budget > 0) {
119
+ const tier = evaluateTier(acc.spend, acc.budget, this.thresholds);
120
+ if (tier) {
121
+ const lastTier = this.lastFiredTier.get(provider);
122
+ // Only fire if we crossed into a new (higher) tier
123
+ if (!lastTier || TIER_SEVERITY[tier] > TIER_SEVERITY[lastTier]) {
124
+ this.lastFiredTier.set(provider, tier);
125
+ this.emit({
126
+ type: 'threshold_crossed',
127
+ provider,
128
+ model,
129
+ tier,
130
+ spend: acc.spend,
131
+ budget: acc.budget,
132
+ utilizationPct: acc.spend / acc.budget,
133
+ });
134
+ }
135
+ }
136
+ // Check depletion projections
137
+ const estimate = this.getDepletionEstimate(provider);
138
+ if (estimate?.daysRemaining !== null && estimate?.daysRemaining !== undefined) {
139
+ let depletionTier = null;
140
+ if (estimate.daysRemaining <= DEPLETION_THRESHOLDS.depletion_emergency) {
141
+ depletionTier = 'depletion_emergency';
142
+ }
143
+ else if (estimate.daysRemaining <= DEPLETION_THRESHOLDS.depletion_critical) {
144
+ depletionTier = 'depletion_critical';
145
+ }
146
+ else if (estimate.daysRemaining <= DEPLETION_THRESHOLDS.depletion_warning) {
147
+ depletionTier = 'depletion_warning';
148
+ }
149
+ if (depletionTier) {
150
+ const lastDep = this.lastFiredDepletionTier.get(provider);
151
+ if (!lastDep || DEPLETION_SEVERITY[depletionTier] > DEPLETION_SEVERITY[lastDep]) {
152
+ this.lastFiredDepletionTier.set(provider, depletionTier);
153
+ this.emit({
154
+ type: 'depletion_projected',
155
+ provider,
156
+ tier: depletionTier,
157
+ daysRemaining: estimate.daysRemaining,
158
+ projectedDepletionDate: estimate.projectedDepletionDate,
159
+ burnRate: estimate.burnRate,
160
+ });
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+ // ─── Budget management ──────────────────────────────────
167
+ setBudget(config) {
168
+ // Remove existing budget for this provider/model combo
169
+ this.budgets = this.budgets.filter(b => !(b.provider === config.provider && b.model === config.model));
170
+ this.budgets.push(config);
171
+ const acc = this.getOrCreateProvider(config.provider);
172
+ // Provider-level budget
173
+ if (config.monthlyBudget !== undefined && !config.model) {
174
+ acc.budget = config.monthlyBudget;
175
+ }
176
+ // Rate limits
177
+ if (config.rateLimits) {
178
+ for (const [dim, limit] of Object.entries(config.rateLimits)) {
179
+ if (limit === undefined)
180
+ continue;
181
+ if (!acc.rateLimits[dim]) {
182
+ acc.rateLimits[dim] = { used: 0, limit, windowStart: Date.now() };
183
+ }
184
+ else {
185
+ acc.rateLimits[dim].limit = limit;
186
+ }
187
+ }
188
+ }
189
+ }
190
+ removeBudget(provider, model) {
191
+ this.budgets = this.budgets.filter(b => !(b.provider === provider && b.model === model));
192
+ const acc = this.providers.get(provider);
193
+ if (acc && !model) {
194
+ acc.budget = null;
195
+ }
196
+ }
197
+ // ─── Queries ────────────────────────────────────────────
198
+ remainingBalance(provider, model) {
199
+ const acc = this.providers.get(provider);
200
+ if (!acc)
201
+ return null;
202
+ if (model) {
203
+ // Per-model budget from budgets array
204
+ const modelBudget = this.budgets.find(b => b.provider === provider && b.model === model);
205
+ if (!modelBudget?.monthlyBudget)
206
+ return null;
207
+ const modelAcc = acc.models[model];
208
+ return modelBudget.monthlyBudget - (modelAcc?.spend ?? 0);
209
+ }
210
+ if (acc.budget === null)
211
+ return null;
212
+ return acc.budget - acc.spend;
213
+ }
214
+ utilizationPct(provider, model) {
215
+ const acc = this.providers.get(provider);
216
+ if (!acc)
217
+ return 0;
218
+ if (model) {
219
+ const modelBudget = this.budgets.find(b => b.provider === provider && b.model === model);
220
+ if (!modelBudget?.monthlyBudget || modelBudget.monthlyBudget <= 0)
221
+ return 0;
222
+ const modelAcc = acc.models[model];
223
+ return (modelAcc?.spend ?? 0) / modelBudget.monthlyBudget;
224
+ }
225
+ if (acc.budget === null || acc.budget <= 0)
226
+ return 0;
227
+ return acc.spend / acc.budget;
228
+ }
229
+ getProviderAccumulator(provider) {
230
+ return this.providers.get(provider);
231
+ }
232
+ getModelAccumulator(provider, model) {
233
+ return this.providers.get(provider)?.models[model];
234
+ }
235
+ totalSpend() {
236
+ let sum = 0;
237
+ for (const acc of this.providers.values())
238
+ sum += acc.spend;
239
+ return sum;
240
+ }
241
+ breakdown() {
242
+ const result = {};
243
+ for (const [name, acc] of this.providers) {
244
+ result[name] = { ...acc, models: { ...acc.models }, rateLimits: { ...acc.rateLimits } };
245
+ }
246
+ return result;
247
+ }
248
+ // ─── Burn rate & depletion projection ───────────────────
249
+ /**
250
+ * Calculate burn rate for a provider over a rolling window.
251
+ * Default window: 24 hours.
252
+ */
253
+ getBurnRate(provider, windowMs = DEFAULT_BURN_RATE_WINDOW_MS) {
254
+ const now = Date.now();
255
+ const cutoff = now - windowMs;
256
+ const entries = this.spendHistory.filter(e => e.provider === provider && e.timestamp >= cutoff);
257
+ const totalCost = entries.reduce((sum, e) => sum + e.cost, 0);
258
+ const windowHours = windowMs / HOUR_MS;
259
+ const windowDays = windowMs / DAY_MS;
260
+ return {
261
+ costPerHour: windowHours > 0 ? totalCost / windowHours : 0,
262
+ costPerDay: windowDays > 0 ? totalCost / windowDays : 0,
263
+ windowMs,
264
+ sampleCount: entries.length,
265
+ };
266
+ }
267
+ /**
268
+ * Project when a provider's budget will be depleted at the current burn rate.
269
+ * Returns null if the provider has no budget or no spend history.
270
+ */
271
+ getDepletionEstimate(provider, windowMs) {
272
+ const acc = this.providers.get(provider);
273
+ if (!acc || acc.budget === null || acc.budget <= 0)
274
+ return null;
275
+ const remaining = acc.budget - acc.spend;
276
+ if (remaining <= 0) {
277
+ return {
278
+ remainingBudget: 0,
279
+ burnRate: this.getBurnRate(provider, windowMs),
280
+ projectedDepletionDate: new Date(),
281
+ daysRemaining: 0,
282
+ };
283
+ }
284
+ const burnRate = this.getBurnRate(provider, windowMs);
285
+ if (burnRate.costPerDay <= 0) {
286
+ return {
287
+ remainingBudget: remaining,
288
+ burnRate,
289
+ projectedDepletionDate: null,
290
+ daysRemaining: null,
291
+ };
292
+ }
293
+ const daysRemaining = remaining / burnRate.costPerDay;
294
+ const depletionMs = daysRemaining * DAY_MS;
295
+ return {
296
+ remainingBudget: remaining,
297
+ burnRate,
298
+ projectedDepletionDate: new Date(Date.now() + depletionMs),
299
+ daysRemaining,
300
+ };
301
+ }
302
+ /**
303
+ * Get windowed spend summary for a provider.
304
+ */
305
+ getSpendSummary(provider, windowMs) {
306
+ const now = Date.now();
307
+ const cutoff = now - windowMs;
308
+ const entries = this.spendHistory.filter(e => e.provider === provider && e.timestamp >= cutoff);
309
+ return {
310
+ provider,
311
+ spend: entries.reduce((sum, e) => sum + e.cost, 0),
312
+ requestCount: entries.length,
313
+ inputTokens: 0, // ring buffer tracks cost, not tokens — use accumulator for totals
314
+ outputTokens: 0,
315
+ windowMs,
316
+ };
317
+ }
318
+ /**
319
+ * Get spend breakdown for all providers over a window.
320
+ */
321
+ getSpendBreakdown(windowMs) {
322
+ const providers = new Set(this.spendHistory.map(e => e.provider));
323
+ return Array.from(providers).map(p => this.getSpendSummary(p, windowMs));
324
+ }
325
+ // ─── Rate limit tracking ────────────────────────────────
326
+ checkRateLimit(provider, dimension) {
327
+ const acc = this.providers.get(provider);
328
+ if (!acc)
329
+ return { allowed: true, used: 0, limit: 0 };
330
+ const window = acc.rateLimits[dimension];
331
+ if (!window)
332
+ return { allowed: true, used: 0, limit: 0 };
333
+ // Auto-reset stale windows
334
+ const now = Date.now();
335
+ const duration = WINDOW_DURATIONS[dimension];
336
+ if (now - window.windowStart >= duration) {
337
+ window.used = 0;
338
+ window.windowStart = now;
339
+ }
340
+ return {
341
+ allowed: window.used < window.limit,
342
+ used: window.used,
343
+ limit: window.limit,
344
+ };
345
+ }
346
+ // ─── Persistence ────────────────────────────────────────
347
+ snapshot() {
348
+ const providers = {};
349
+ for (const [name, acc] of this.providers) {
350
+ providers[name] = {
351
+ spend: acc.spend,
352
+ inputTokens: acc.inputTokens,
353
+ outputTokens: acc.outputTokens,
354
+ requestCount: acc.requestCount,
355
+ lastRecordedAt: acc.lastRecordedAt,
356
+ budget: acc.budget,
357
+ models: { ...acc.models },
358
+ rateLimits: { ...acc.rateLimits },
359
+ };
360
+ }
361
+ return {
362
+ version: 1,
363
+ periodStart: this.periodStart,
364
+ providers,
365
+ thresholds: { ...this.thresholds },
366
+ budgets: this.budgets.map(b => ({ ...b })),
367
+ exportedAt: Date.now(),
368
+ spendHistory: this.spendHistory.map(e => ({ ...e })),
369
+ };
370
+ }
371
+ restore(snapshot) {
372
+ if (snapshot.version !== 1) {
373
+ console.warn(`[CreditLedger] Unknown snapshot version ${snapshot.version}, skipping restore`);
374
+ return;
375
+ }
376
+ this.periodStart = snapshot.periodStart;
377
+ this.thresholds = { ...DEFAULT_THRESHOLDS, ...snapshot.thresholds };
378
+ this.budgets = snapshot.budgets.map(b => ({ ...b }));
379
+ this.providers.clear();
380
+ this.lastFiredTier.clear();
381
+ this.lastFiredDepletionTier.clear();
382
+ this.spendHistory = (snapshot.spendHistory ?? []).map(e => ({ ...e }));
383
+ for (const [name, data] of Object.entries(snapshot.providers)) {
384
+ const acc = createProviderAccumulator(data.budget);
385
+ acc.spend = data.spend;
386
+ acc.inputTokens = data.inputTokens;
387
+ acc.outputTokens = data.outputTokens;
388
+ acc.requestCount = data.requestCount;
389
+ acc.lastRecordedAt = data.lastRecordedAt;
390
+ acc.models = { ...data.models };
391
+ acc.rateLimits = { ...data.rateLimits };
392
+ this.providers.set(name, acc);
393
+ // Re-evaluate last fired tier so we don't re-fire on next record
394
+ if (acc.budget !== null && acc.budget > 0) {
395
+ const tier = evaluateTier(acc.spend, acc.budget, this.thresholds);
396
+ if (tier)
397
+ this.lastFiredTier.set(name, tier);
398
+ }
399
+ }
400
+ }
401
+ // ─── Period management ──────────────────────────────────
402
+ resetPeriod() {
403
+ this.periodStart = Date.now();
404
+ this.lastFiredTier.clear();
405
+ this.lastFiredDepletionTier.clear();
406
+ this.spendHistory = [];
407
+ for (const acc of this.providers.values()) {
408
+ acc.spend = 0;
409
+ acc.inputTokens = 0;
410
+ acc.outputTokens = 0;
411
+ acc.requestCount = 0;
412
+ acc.lastRecordedAt = 0;
413
+ for (const model of Object.keys(acc.models)) {
414
+ acc.models[model] = createModelAccumulator();
415
+ }
416
+ for (const window of Object.values(acc.rateLimits)) {
417
+ if (window) {
418
+ window.used = 0;
419
+ window.windowStart = Date.now();
420
+ }
421
+ }
422
+ }
423
+ }
424
+ // ─── Event system ───────────────────────────────────────
425
+ on(listener) {
426
+ this.listeners.push(listener);
427
+ return () => {
428
+ this.listeners = this.listeners.filter(l => l !== listener);
429
+ };
430
+ }
431
+ // ─── Internals ──────────────────────────────────────────
432
+ getOrCreateProvider(name) {
433
+ let acc = this.providers.get(name);
434
+ if (!acc) {
435
+ const budgetConfig = this.budgets.find(b => b.provider === name && !b.model);
436
+ acc = createProviderAccumulator(budgetConfig?.monthlyBudget ?? null);
437
+ // Initialize rate limit windows from budget config
438
+ const rlConfigs = this.budgets.filter(b => b.provider === name && b.rateLimits);
439
+ for (const rl of rlConfigs) {
440
+ if (!rl.rateLimits)
441
+ continue;
442
+ for (const [dim, limit] of Object.entries(rl.rateLimits)) {
443
+ if (limit === undefined)
444
+ continue;
445
+ acc.rateLimits[dim] = { used: 0, limit, windowStart: Date.now() };
446
+ }
447
+ }
448
+ this.providers.set(name, acc);
449
+ }
450
+ return acc;
451
+ }
452
+ emit(event) {
453
+ for (const listener of this.listeners) {
454
+ try {
455
+ listener(event);
456
+ }
457
+ catch (err) {
458
+ console.warn('[CreditLedger] Listener error:', err instanceof Error ? err.message : String(err));
459
+ }
460
+ }
461
+ }
462
+ }
463
+ //# sourceMappingURL=credit-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credit-ledger.js","sourceRoot":"","sources":["../../src/utils/credit-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8HH,+DAA+D;AAE/D,MAAM,kBAAkB,GAAoB;IAC1C,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,8EAA8E;AAC9E,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,0CAA0C;AAC1C,MAAM,2BAA2B,GAAG,EAAE,GAAG,OAAO,CAAC;AAEjD,wDAAwD;AACxD,MAAM,oBAAoB,GAAG;IAC3B,iBAAiB,EAAE,CAAC;IACpB,kBAAkB,EAAE,CAAC;IACrB,mBAAmB,EAAE,CAAC;CACd,CAAC;AAEX,MAAM,kBAAkB,GAAkC;IACxD,iBAAiB,EAAE,CAAC;IACpB,kBAAkB,EAAE,CAAC;IACrB,mBAAmB,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,gBAAgB,GAAuC;IAC3D,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF,+DAA+D;AAE/D,SAAS,sBAAsB;IAC7B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAwB,IAAI;IAC7D,OAAO,EAAE,GAAG,sBAAsB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,MAAc,EAAE,UAA2B;IAC9E,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,IAAI,KAAK,IAAI,UAAU,CAAC,SAAS;QAAE,OAAO,WAAW,CAAC;IACtD,IAAI,KAAK,IAAI,UAAU,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAC;IACpD,IAAI,KAAK,IAAI,UAAU,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,aAAa,GAAkC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAE/F,+DAA+D;AAE/D,MAAM,OAAO,YAAY;IACf,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IACnD,UAAU,CAAkB;IAC5B,OAAO,GAAmB,EAAE,CAAC;IAC7B,SAAS,GAAqB,EAAE,CAAC;IACjC,WAAW,CAAS;IACpB,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC,CAAC,6BAA6B;IAC/E,sBAAsB,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1D,YAAY,GAAiB,EAAE,CAAC;IAChC,cAAc,CAAS;IAE/B,YAAY,MAIX;QACC,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;QACnE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,wBAAwB,CAAC;QACzE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;gBAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,2DAA2D;IAE3D,MAAM,CAAC,QAAgB,EAAE,KAAa,EAAE,IAAY,EAAE,WAAmB,EAAE,YAAoB;QAC7F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;QAE/C,qCAAqC;QACrC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;QAClB,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC;QAC/B,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC;QACjC,GAAG,CAAC,YAAY,EAAE,CAAC;QACnB,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;QAEzB,kCAAkC;QAClC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,sBAAsB,EAAE,CAAC;QACrE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC;QACjB,EAAE,CAAC,WAAW,IAAI,WAAW,CAAC;QAC9B,EAAE,CAAC,YAAY,IAAI,YAAY,CAAC;QAChC,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,cAAc,GAAG,GAAG,CAAC;QAExB,gDAAgD;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAiD,EAAE,CAAC;YAC3G,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;gBAChB,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC;YAC3B,CAAC;YACD,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,0BAA0B;QAC1B,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAClE,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAClD,mDAAmD;gBACnD,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBACvC,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,mBAAmB;wBACzB,QAAQ;wBACR,KAAK;wBACL,IAAI;wBACJ,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,cAAc,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM;qBACvC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,QAAQ,EAAE,aAAa,KAAK,IAAI,IAAI,QAAQ,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;gBAC9E,IAAI,aAAa,GAAyB,IAAI,CAAC;gBAC/C,IAAI,QAAQ,CAAC,aAAa,IAAI,oBAAoB,CAAC,mBAAmB,EAAE,CAAC;oBACvE,aAAa,GAAG,qBAAqB,CAAC;gBACxC,CAAC;qBAAM,IAAI,QAAQ,CAAC,aAAa,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,CAAC;oBAC7E,aAAa,GAAG,oBAAoB,CAAC;gBACvC,CAAC;qBAAM,IAAI,QAAQ,CAAC,aAAa,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,CAAC;oBAC5E,aAAa,GAAG,mBAAmB,CAAC;gBACtC,CAAC;gBAED,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC1D,IAAI,CAAC,OAAO,IAAI,kBAAkB,CAAC,aAAa,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;wBAChF,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;wBACzD,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,qBAAqB;4BAC3B,QAAQ;4BACR,IAAI,EAAE,aAAa;4BACnB,aAAa,EAAE,QAAQ,CAAC,aAAa;4BACrC,sBAAsB,EAAE,QAAQ,CAAC,sBAAuB;4BACxD,QAAQ,EAAE,QAAQ,CAAC,QAAQ;yBAC5B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAE3D,SAAS,CAAC,MAAoB;QAC5B,uDAAuD;QACvD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAC9D,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEtD,wBAAwB;QACxB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACxD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QACpC,CAAC;QAED,cAAc;QACd,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAwC,EAAE,CAAC;gBACpG,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,UAAU,CAAC,GAAG,CAAE,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAY,CAAC,QAAgB,EAAE,KAAc;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAChD,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,2DAA2D;IAE3D,gBAAgB,CAAC,QAAgB,EAAE,KAAc;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,IAAI,KAAK,EAAE,CAAC;YACV,sCAAsC;YACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YACzF,IAAI,CAAC,WAAW,EAAE,aAAa;gBAAE,OAAO,IAAI,CAAC;YAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,WAAW,CAAC,aAAa,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,KAAc;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QAEnB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YACzF,IAAI,CAAC,WAAW,EAAE,aAAa,IAAI,WAAW,CAAC,aAAa,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,aAAa,CAAC;QAC5D,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,sBAAsB,CAAC,QAAgB;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,mBAAmB,CAAC,QAAgB,EAAE,KAAa;QACjD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,UAAU;QACR,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YAAE,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC;QAC5D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS;QACP,MAAM,MAAM,GAAwC,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;QAC1F,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,2DAA2D;IAE3D;;;OAGG;IACH,WAAW,CAAC,QAAgB,EAAE,QAAQ,GAAG,2BAA2B;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;QAChG,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;QACvC,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;QAErC,OAAO;YACL,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC1D,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACvD,QAAQ;YACR,WAAW,EAAE,OAAO,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,QAAgB,EAAE,QAAiB;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC;QACzC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO;gBACL,eAAe,EAAE,CAAC;gBAClB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAC9C,sBAAsB,EAAE,IAAI,IAAI,EAAE;gBAClC,aAAa,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,eAAe,EAAE,SAAS;gBAC1B,QAAQ;gBACR,sBAAsB,EAAE,IAAI;gBAC5B,aAAa,EAAE,IAAI;aACpB,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC;QACtD,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC;QAC3C,OAAO;YACL,eAAe,EAAE,SAAS;YAC1B,QAAQ;YACR,sBAAsB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;YAC1D,aAAa;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB,EAAE,QAAgB;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;QAEhG,OAAO;YACL,QAAQ;YACR,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAClD,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,WAAW,EAAE,CAAC,EAAG,mEAAmE;YACpF,YAAY,EAAE,CAAC;YACf,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAgB;QAChC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,2DAA2D;IAE3D,cAAc,CAAC,QAAgB,EAAE,SAA6B;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAEtD,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAEzD,2BAA2B;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YAChB,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,2DAA2D;IAE3D,QAAQ;QACN,MAAM,SAAS,GAAsC,EAAE,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,SAAS,CAAC,IAAI,CAAC,GAAG;gBAChB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,cAAc,EAAE,GAAG,CAAC,cAAc;gBAClC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE;gBACzB,UAAU,EAAE,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE;aAClC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS;YACT,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,QAA8B;QACpC,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,2CAA2C,QAAQ,CAAC,OAAO,oBAAoB,CAAC,CAAC;YAC9F,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QACpE,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAEvE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACvB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACnC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACrC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACrC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YACzC,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,GAAG,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAE9B,iEAAiE;YACjE,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClE,IAAI,IAAI;oBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAE3D,WAAW;QACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;YACpB,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;YACrB,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;YACrB,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,sBAAsB,EAAE,CAAC;YAC/C,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnD,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;oBAChB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAE3D,EAAE,CAAC,QAAwB;QACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC;IAED,2DAA2D;IAEnD,mBAAmB,CAAC,IAAY;QACtC,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7E,GAAG,GAAG,yBAAyB,CAAC,YAAY,EAAE,aAAa,IAAI,IAAI,CAAC,CAAC;YAErE,mDAAmD;YACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;YAChF,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,EAAE,CAAC,UAAU;oBAAE,SAAS;gBAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAwC,EAAE,CAAC;oBAChG,IAAI,KAAK,KAAK,SAAS;wBAAE,SAAS;oBAClC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACpE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,IAAI,CAAC,KAAkB;QAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Retry Utility
3
+ * Exponential backoff retry logic for LLM provider requests
4
+ */
5
+ import type { RetryConfig } from '../types';
6
+ export declare class RetryManager {
7
+ private config;
8
+ constructor(config?: Partial<RetryConfig>);
9
+ /**
10
+ * Execute a function with retry logic
11
+ */
12
+ execute<T>(fn: () => Promise<T>, context?: string): Promise<T>;
13
+ /**
14
+ * Check if an error should be retried
15
+ */
16
+ private shouldRetry;
17
+ /**
18
+ * Calculate delay before next retry attempt
19
+ */
20
+ private calculateDelay;
21
+ /**
22
+ * Promise-based delay
23
+ */
24
+ private delay;
25
+ /**
26
+ * Update retry configuration
27
+ */
28
+ updateConfig(config: Partial<RetryConfig>): void;
29
+ /**
30
+ * Get current configuration
31
+ */
32
+ getConfig(): RetryConfig;
33
+ }
34
+ /**
35
+ * Default retry manager instance
36
+ */
37
+ export declare const defaultRetryManager: RetryManager;
38
+ /**
39
+ * Retry decorator for async functions
40
+ */
41
+ export declare function withRetry<T extends any[], R>(retryConfig?: Partial<RetryConfig>): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: T) => Promise<R>>) => TypedPropertyDescriptor<(...args: T) => Promise<R>>;
42
+ /**
43
+ * Simple retry function for one-off operations
44
+ */
45
+ export declare function retry<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>): Promise<T>;
46
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAgB7C;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,MAAoB,GAC5B,OAAO,CAAC,CAAC,CAAC;IA8Bb;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAIhD;;OAEG;IACH,SAAS,IAAI,WAAW;CAGzB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAqB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAC1C,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,IAGhC,QAAQ,GAAG,EACX,aAAa,MAAM,EACnB,YAAY,uBAAuB,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,uCAAjB,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAcjE;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAGZ"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Retry Utility
3
+ * Exponential backoff retry logic for LLM provider requests
4
+ */
5
+ import { LLMErrorFactory } from '../errors';
6
+ export class RetryManager {
7
+ config;
8
+ constructor(config = {}) {
9
+ this.config = {
10
+ maxRetries: config.maxRetries ?? 3,
11
+ initialDelay: config.initialDelay ?? 1000,
12
+ maxDelay: config.maxDelay ?? 30000,
13
+ backoffMultiplier: config.backoffMultiplier ?? 2,
14
+ retryableErrors: config.retryableErrors ?? [
15
+ 'NETWORK_ERROR',
16
+ 'TIMEOUT',
17
+ 'SERVER_ERROR',
18
+ 'RATE_LIMIT',
19
+ 'CIRCUIT_BREAKER_OPEN'
20
+ ]
21
+ };
22
+ }
23
+ /**
24
+ * Execute a function with retry logic
25
+ */
26
+ async execute(fn, context = 'operation') {
27
+ let lastError;
28
+ let attempt = 0;
29
+ while (attempt <= this.config.maxRetries) {
30
+ try {
31
+ return await fn();
32
+ }
33
+ catch (error) {
34
+ lastError = error;
35
+ attempt++;
36
+ // Check if we should retry this error
37
+ if (!this.shouldRetry(error, attempt)) {
38
+ throw error;
39
+ }
40
+ // Calculate delay for next attempt
41
+ const delay = this.calculateDelay(attempt, error);
42
+ console.warn(`[RetryManager] ${context} failed (attempt ${attempt}/${this.config.maxRetries + 1}): ${lastError.message}. Retrying in ${delay}ms...`);
43
+ await this.delay(delay);
44
+ }
45
+ }
46
+ throw lastError;
47
+ }
48
+ /**
49
+ * Check if an error should be retried
50
+ */
51
+ shouldRetry(error, attempt) {
52
+ // Don't retry if we've exceeded max attempts
53
+ if (attempt > this.config.maxRetries) {
54
+ return false;
55
+ }
56
+ // Check if error is retryable
57
+ if (!LLMErrorFactory.isRetryable(error)) {
58
+ return false;
59
+ }
60
+ // Check if error code is in retryable list
61
+ const errorCode = error.code;
62
+ if (errorCode && !this.config.retryableErrors.includes(errorCode)) {
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+ /**
68
+ * Calculate delay before next retry attempt
69
+ */
70
+ calculateDelay(attempt, error) {
71
+ // Use error-specific delay if available
72
+ const errorDelay = LLMErrorFactory.getRetryDelay(error);
73
+ if (errorDelay > 0) {
74
+ return Math.min(errorDelay * attempt, this.config.maxDelay);
75
+ }
76
+ // Standard exponential backoff
77
+ const delay = this.config.initialDelay * Math.pow(this.config.backoffMultiplier, attempt - 1);
78
+ // Add jitter to prevent thundering herd
79
+ const jitter = Math.random() * 0.1 * delay;
80
+ return Math.min(delay + jitter, this.config.maxDelay);
81
+ }
82
+ /**
83
+ * Promise-based delay
84
+ */
85
+ delay(ms) {
86
+ return new Promise(resolve => setTimeout(resolve, ms));
87
+ }
88
+ /**
89
+ * Update retry configuration
90
+ */
91
+ updateConfig(config) {
92
+ this.config = { ...this.config, ...config };
93
+ }
94
+ /**
95
+ * Get current configuration
96
+ */
97
+ getConfig() {
98
+ return { ...this.config };
99
+ }
100
+ }
101
+ /**
102
+ * Default retry manager instance
103
+ */
104
+ export const defaultRetryManager = new RetryManager();
105
+ /**
106
+ * Retry decorator for async functions
107
+ */
108
+ export function withRetry(retryConfig) {
109
+ return function (target, propertyKey, descriptor) {
110
+ const originalMethod = descriptor.value;
111
+ const retryManager = new RetryManager(retryConfig);
112
+ descriptor.value = async function (...args) {
113
+ return retryManager.execute(() => originalMethod.apply(this, args), `${target.constructor.name}.${propertyKey}`);
114
+ };
115
+ return descriptor;
116
+ };
117
+ }
118
+ /**
119
+ * Simple retry function for one-off operations
120
+ */
121
+ export async function retry(fn, config) {
122
+ const retryManager = new RetryManager(config);
123
+ return retryManager.execute(fn);
124
+ }
125
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,OAAO,YAAY;IACf,MAAM,CAAc;IAE5B,YAAY,SAA+B,EAAE;QAC3C,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;YACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;YAClC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,CAAC;YAChD,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI;gBACzC,eAAe;gBACf,SAAS;gBACT,cAAc;gBACd,YAAY;gBACZ,sBAAsB;aACvB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,EAAoB,EACpB,UAAkB,WAAW;QAE7B,IAAI,SAAgB,CAAC;QACrB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAC3B,OAAO,EAAE,CAAC;gBAEV,sCAAsC;gBACtC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAc,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC/C,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,mCAAmC;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAc,CAAC,CAAC;gBAE3D,OAAO,CAAC,IAAI,CACV,kBAAkB,OAAO,oBAAoB,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,iBAAiB,KAAK,OAAO,CACvI,CAAC;gBAEF,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,SAAU,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAY,EAAE,OAAe;QAC/C,6CAA6C;QAC7C,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2CAA2C;QAC3C,MAAM,SAAS,GAAI,KAAa,CAAC,IAAI,CAAC;QACtC,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAe,EAAE,KAAY;QAClD,wCAAwC;QACxC,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC;QAED,+BAA+B;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAE9F,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;QAE3C,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAA4B;QACvC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,YAAY,EAAE,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,WAAkC;IAElC,OAAO,UACL,MAAW,EACX,WAAmB,EACnB,UAA+D;QAE/D,MAAM,cAAc,GAAG,UAAU,CAAC,KAAM,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QAEnD,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAO;YAC3C,OAAO,YAAY,CAAC,OAAO,CACzB,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EACtC,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,WAAW,EAAE,CAC5C,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,EAAoB,EACpB,MAA6B;IAE7B,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC"}