@soulcraft/sdk 1.6.1 → 1.6.2
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.
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
* over-grant is ~3–5 messages past exhaustion (acceptable given `recordUsage`
|
|
25
25
|
* is itself 5s-delayed).
|
|
26
26
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
27
|
+
* The `credits/check` response also carries `monthlyIncluded`, `monthlyUsed`,
|
|
28
|
+
* `plan`, and `periodEnd` fields (added Portal-side in P2). These are cached
|
|
29
|
+
* alongside the limit result and used to populate `getUsageStatus()` and
|
|
30
|
+
* `getSubscription()` without additional API calls.
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* ```typescript
|
|
@@ -66,6 +66,8 @@ export declare class PortalBillingProvider implements BillingProvider {
|
|
|
66
66
|
constructor(baseUrl: string, secret: string, product: string);
|
|
67
67
|
/** Cached limit check results, keyed by userId (email). */
|
|
68
68
|
private readonly _cache;
|
|
69
|
+
/** Rich Portal response fields cached alongside the limit result. */
|
|
70
|
+
private readonly _richCache;
|
|
69
71
|
/** In-flight `checkLimit` promises, keyed by userId — singleflight deduplication. */
|
|
70
72
|
private readonly _inflight;
|
|
71
73
|
/** Per-user cache TTL for `checkLimit` results. */
|
|
@@ -83,13 +85,13 @@ export declare class PortalBillingProvider implements BillingProvider {
|
|
|
83
85
|
* @param userId - The user's email address (same key used in `checkLimit`).
|
|
84
86
|
*/
|
|
85
87
|
invalidateCache(userId: string): void;
|
|
86
|
-
/** Perform the actual Portal HTTP call and populate
|
|
88
|
+
/** Perform the actual Portal HTTP call and populate both caches. */
|
|
87
89
|
private _fetchLimit;
|
|
88
90
|
getUsage(userId: string): Promise<UsageData>;
|
|
89
91
|
getUsageStatus(userId: string, hasPersonalKey: boolean): Promise<UsageStatus>;
|
|
90
92
|
incrementUsage(userId: string, inputTokens: number, outputTokens: number, model: string, _useTopUp: boolean): Promise<void>;
|
|
91
93
|
batchIncrementUsage(userId: string, batch: BatchIncrementData): Promise<void>;
|
|
92
|
-
getSubscription(
|
|
94
|
+
getSubscription(userId: string): Promise<SubscriptionData | undefined>;
|
|
93
95
|
hasActiveSubscription(userId: string): Promise<boolean>;
|
|
94
96
|
getTopUpBalance(userId: string): Promise<number>;
|
|
95
97
|
canAccessPaidFeature(userId: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal-provider.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"portal-provider.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAmCnB;;;;;;;;;;;;GAYG;AACH,qBAAa,qBAAsB,YAAW,eAAe;IAOzD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B;;;;OAIG;gBAEgB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM;IAKlC,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqE;IAE5F,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IAEjE,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;IAEzE,mDAAmD;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAS;IAI7C,OAAO,CAAC,QAAQ;YAOF,KAAK;IAeb,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0BpF;;;;;;;;OAQG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKrC,oEAAoE;YACtD,WAAW;IA0CnB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAkB5C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAmD7E,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAeV,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAgBtE,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7D"}
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
* over-grant is ~3–5 messages past exhaustion (acceptable given `recordUsage`
|
|
25
25
|
* is itself 5s-delayed).
|
|
26
26
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
27
|
+
* The `credits/check` response also carries `monthlyIncluded`, `monthlyUsed`,
|
|
28
|
+
* `plan`, and `periodEnd` fields (added Portal-side in P2). These are cached
|
|
29
|
+
* alongside the limit result and used to populate `getUsageStatus()` and
|
|
30
|
+
* `getSubscription()` without additional API calls.
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* ```typescript
|
|
@@ -83,6 +83,8 @@ export class PortalBillingProvider {
|
|
|
83
83
|
// ── Cache + singleflight ──────────────────────────────────────────────────
|
|
84
84
|
/** Cached limit check results, keyed by userId (email). */
|
|
85
85
|
_cache = new Map();
|
|
86
|
+
/** Rich Portal response fields cached alongside the limit result. */
|
|
87
|
+
_richCache = new Map();
|
|
86
88
|
/** In-flight `checkLimit` promises, keyed by userId — singleflight deduplication. */
|
|
87
89
|
_inflight = new Map();
|
|
88
90
|
/** Per-user cache TTL for `checkLimit` results. */
|
|
@@ -142,8 +144,9 @@ export class PortalBillingProvider {
|
|
|
142
144
|
*/
|
|
143
145
|
invalidateCache(userId) {
|
|
144
146
|
this._cache.delete(userId);
|
|
147
|
+
this._richCache.delete(userId);
|
|
145
148
|
}
|
|
146
|
-
/** Perform the actual Portal HTTP call and populate
|
|
149
|
+
/** Perform the actual Portal HTTP call and populate both caches. */
|
|
147
150
|
async _fetchLimit(userId) {
|
|
148
151
|
try {
|
|
149
152
|
const result = await this._post('/api/credits/check', { userEmail: userId, product: this.product });
|
|
@@ -156,9 +159,13 @@ export class PortalBillingProvider {
|
|
|
156
159
|
tier: result.tier === 'free' ? 'free' : 'standard',
|
|
157
160
|
...(!result.ok && result.reason ? { reason: result.reason === 'no_subscription' ? 'no_subscription' : 'limit_reached' } : {}),
|
|
158
161
|
};
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
+
const expiresAt = Date.now() + PortalBillingProvider.CACHE_TTL_MS;
|
|
163
|
+
this._cache.set(userId, { result: limitResult, expiresAt });
|
|
164
|
+
this._richCache.set(userId, {
|
|
165
|
+
monthlyIncluded: result.monthlyIncluded ?? null,
|
|
166
|
+
monthlyUsed: result.monthlyUsed ?? 0,
|
|
167
|
+
plan: result.tier === 'free' ? 'free' : 'standard',
|
|
168
|
+
periodEnd: result.periodEnd ?? null,
|
|
162
169
|
});
|
|
163
170
|
return limitResult;
|
|
164
171
|
}
|
|
@@ -169,23 +176,35 @@ export class PortalBillingProvider {
|
|
|
169
176
|
}
|
|
170
177
|
}
|
|
171
178
|
async getUsage(userId) {
|
|
172
|
-
//
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
179
|
+
// Trigger a limit check to populate the rich cache if not already warm.
|
|
180
|
+
await this.checkLimit(userId, false);
|
|
181
|
+
const rich = this._richCache.get(userId);
|
|
182
|
+
const periodEnd = rich?.periodEnd ?? _thirtyDaysFromNow();
|
|
183
|
+
const now = new Date();
|
|
176
184
|
return {
|
|
177
|
-
currentPeriod:
|
|
178
|
-
periodEnd
|
|
179
|
-
messagesUsed: 0,
|
|
185
|
+
currentPeriod: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`,
|
|
186
|
+
periodEnd,
|
|
187
|
+
messagesUsed: rich?.monthlyUsed ?? 0,
|
|
180
188
|
inputTokens: 0,
|
|
181
189
|
outputTokens: 0,
|
|
182
190
|
byModel: {},
|
|
183
|
-
lastUpdated:
|
|
191
|
+
lastUpdated: now.toISOString(),
|
|
184
192
|
};
|
|
185
193
|
}
|
|
186
194
|
async getUsageStatus(userId, hasPersonalKey) {
|
|
187
195
|
const check = await this.checkLimit(userId, hasPersonalKey);
|
|
188
|
-
const
|
|
196
|
+
const rich = this._richCache.get(userId);
|
|
197
|
+
const periodEnd = rich?.periodEnd ?? _thirtyDaysFromNow();
|
|
198
|
+
const now = new Date();
|
|
199
|
+
const usage = {
|
|
200
|
+
currentPeriod: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`,
|
|
201
|
+
periodEnd,
|
|
202
|
+
messagesUsed: rich?.monthlyUsed ?? 0,
|
|
203
|
+
inputTokens: 0,
|
|
204
|
+
outputTokens: 0,
|
|
205
|
+
byModel: {},
|
|
206
|
+
lastUpdated: now.toISOString(),
|
|
207
|
+
};
|
|
189
208
|
if (hasPersonalKey) {
|
|
190
209
|
return {
|
|
191
210
|
mode: 'byok',
|
|
@@ -195,21 +214,26 @@ export class PortalBillingProvider {
|
|
|
195
214
|
topUpBalance: 0,
|
|
196
215
|
totalAvailable: null,
|
|
197
216
|
percentUsed: null,
|
|
198
|
-
resetsAt:
|
|
217
|
+
resetsAt: periodEnd,
|
|
199
218
|
estimatedCostUSD: 0,
|
|
200
219
|
};
|
|
201
220
|
}
|
|
221
|
+
const limit = rich?.monthlyIncluded ?? null;
|
|
222
|
+
const remaining = check.remaining === Infinity ? null : check.remaining;
|
|
223
|
+
const percentUsed = limit !== null && remaining !== null
|
|
224
|
+
? Math.min(100, Math.round(((limit - remaining) / limit) * 100))
|
|
225
|
+
: null;
|
|
202
226
|
return {
|
|
203
|
-
mode: check.
|
|
227
|
+
mode: check.tier === 'free' ? 'free' : 'included',
|
|
204
228
|
usage,
|
|
205
|
-
limit
|
|
206
|
-
remaining
|
|
229
|
+
limit,
|
|
230
|
+
remaining,
|
|
207
231
|
topUpBalance: check.topUpBalance,
|
|
208
232
|
totalAvailable: check.totalAvailable === Infinity ? null : check.totalAvailable,
|
|
209
|
-
percentUsed
|
|
210
|
-
resetsAt:
|
|
233
|
+
percentUsed,
|
|
234
|
+
resetsAt: periodEnd,
|
|
211
235
|
estimatedCostUSD: 0,
|
|
212
|
-
isFreeUser:
|
|
236
|
+
isFreeUser: check.tier === 'free',
|
|
213
237
|
};
|
|
214
238
|
}
|
|
215
239
|
async incrementUsage(userId, inputTokens, outputTokens, model, _useTopUp) {
|
|
@@ -242,9 +266,20 @@ export class PortalBillingProvider {
|
|
|
242
266
|
console.error('[SDK/billing] Portal batch flush failed — usage may be under-counted');
|
|
243
267
|
}
|
|
244
268
|
}
|
|
245
|
-
async getSubscription(
|
|
246
|
-
//
|
|
247
|
-
|
|
269
|
+
async getSubscription(userId) {
|
|
270
|
+
// Trigger a limit check to warm the rich cache if needed.
|
|
271
|
+
const check = await this.checkLimit(userId, false);
|
|
272
|
+
const rich = this._richCache.get(userId);
|
|
273
|
+
if (!rich)
|
|
274
|
+
return undefined;
|
|
275
|
+
// Derive a SubscriptionData from the plan tier and period info.
|
|
276
|
+
// Full Stripe subscription details are not available via the credit API —
|
|
277
|
+
// products that need them should call Portal's management API directly.
|
|
278
|
+
return {
|
|
279
|
+
plan: check.tier === 'byok' ? 'byok' : rich.plan,
|
|
280
|
+
status: rich.plan === 'standard' ? 'active' : 'canceled',
|
|
281
|
+
...(rich.periodEnd ? { currentPeriodEnd: rich.periodEnd } : {}),
|
|
282
|
+
};
|
|
248
283
|
}
|
|
249
284
|
async hasActiveSubscription(userId) {
|
|
250
285
|
const check = await this.checkLimit(userId, false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal-provider.js","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAWH,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,SAAS,cAAc;IACrB,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAA;IACpB,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AAC1E,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;AACtE,CAAC;
|
|
1
|
+
{"version":3,"file":"portal-provider.js","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAWH,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,SAAS,cAAc;IACrB,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAA;IACpB,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AAC1E,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;AACtE,CAAC;AAkBD,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,qBAAqB;IAOb;IACA;IACA;IARnB;;;;OAIG;IACH,YACmB,OAAe,EACf,MAAc,EACd,OAAe;QAFf,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAQ;IAC/B,CAAC;IAEJ,6EAA6E;IAE7E,2DAA2D;IAC1C,MAAM,GAAG,IAAI,GAAG,EAA2D,CAAA;IAE5F,qEAAqE;IACpD,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAA;IAEjE,qFAAqF;IACpE,SAAS,GAAG,IAAI,GAAG,EAAqC,CAAA;IAEzE,mDAAmD;IAC3C,MAAM,CAAU,YAAY,GAAG,MAAM,CAAA;IAE7C,6EAA6E;IAErE,QAAQ;QACd,OAAO;YACL,cAAc,EAAE,kBAAkB;YAClC,wBAAwB,EAAE,IAAI,CAAC,MAAM;SACtC,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAI,IAAY,EAAE,IAAa;QAChD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE;YACxB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,QAAQ,IAAI,EAAE,CAAC,CAAA;QAC5E,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;IACtC,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,cAAuB;QACtD,yDAAyD;QACzD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QACpH,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC,MAAM,CAAA;QACtB,CAAC;QAED,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAA;QAE7B,uEAAuE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnC,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAA;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,eAAe,CAAC,MAAc;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,oEAAoE;IAC5D,KAAK,CAAC,WAAW,CAAC,MAAc;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAW5B,oBAAoB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YAEtE,MAAM,WAAW,GAAqB;gBACpC,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;gBAChC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC;gBACtC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC;gBAC1C,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC;gBAC3D,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;gBAClD,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9H,CAAA;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,YAAY,CAAA;YACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;YAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE;gBAC1B,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;gBAC/C,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;gBACpC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;gBAClD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;aACpC,CAAC,CAAA;YAEF,OAAO,WAAW,CAAA;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;YACjF,qEAAqE;YACrE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;QAC1G,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,wEAAwE;QACxE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAExC,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,kBAAkB,EAAE,CAAA;QACzD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,OAAO;YACL,aAAa,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YACpF,SAAS;YACT,YAAY,EAAE,IAAI,EAAE,WAAW,IAAI,CAAC;YACpC,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;SAC/B,CAAA;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,cAAuB;QAC1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAExC,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,kBAAkB,EAAE,CAAA;QACzD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,MAAM,KAAK,GAAc;YACvB,aAAa,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YACpF,SAAS;YACT,YAAY,EAAE,IAAI,EAAE,WAAW,IAAI,CAAC;YACpC,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;SAC/B,CAAA;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,KAAK;gBACL,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,IAAI;gBACf,YAAY,EAAE,CAAC;gBACf,cAAc,EAAE,IAAI;gBACpB,WAAW,EAAE,IAAI;gBACjB,QAAQ,EAAE,SAAS;gBACnB,gBAAgB,EAAE,CAAC;aACpB,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,EAAE,eAAe,IAAI,IAAI,CAAA;QAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAA;QACvE,MAAM,WAAW,GACf,KAAK,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI;YAClC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;YAChE,CAAC,CAAC,IAAI,CAAA;QAEV,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;YACjD,KAAK;YACL,KAAK;YACL,SAAS;YACT,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,cAAc,EAAE,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc;YAC/E,WAAW;YACX,QAAQ,EAAE,SAAS;YACnB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM;SAClC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,MAAc,EACd,WAAmB,EACnB,YAAoB,EACpB,KAAa,EACb,SAAkB;QAElB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACvC,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW;gBACX,YAAY;gBACZ,KAAK;aACN,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAA;QACnF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,KAAyB;QACjE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACrC,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,0DAA0D;QAC1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAA;QAE3B,gEAAgE;QAChE,0EAA0E;QAC1E,wEAAwE;QACxE,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;YAChD,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;YACxD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAA;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,MAAc;QACxC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAClD,OAAO,KAAK,CAAC,EAAE,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAClD,OAAO,KAAK,CAAC,YAAY,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACvC,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC"}
|