oc-codex-multi-auth 6.1.3 → 6.1.7

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 (43) hide show
  1. package/README.md +17 -10
  2. package/config/README.md +12 -12
  3. package/config/opencode-legacy.json +125 -0
  4. package/config/opencode-modern.json +43 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +36 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/auto-update-checker.d.ts +7 -1
  9. package/dist/lib/auto-update-checker.d.ts.map +1 -1
  10. package/dist/lib/auto-update-checker.js +51 -3
  11. package/dist/lib/auto-update-checker.js.map +1 -1
  12. package/dist/lib/codex-usage.d.ts +91 -0
  13. package/dist/lib/codex-usage.d.ts.map +1 -0
  14. package/dist/lib/codex-usage.js +368 -0
  15. package/dist/lib/codex-usage.js.map +1 -0
  16. package/dist/lib/config.d.ts +1 -0
  17. package/dist/lib/config.d.ts.map +1 -1
  18. package/dist/lib/config.js +4 -0
  19. package/dist/lib/config.js.map +1 -1
  20. package/dist/lib/schemas.d.ts +1 -0
  21. package/dist/lib/schemas.d.ts.map +1 -1
  22. package/dist/lib/schemas.js +1 -0
  23. package/dist/lib/schemas.js.map +1 -1
  24. package/dist/lib/tools/codex-limits.d.ts.map +1 -1
  25. package/dist/lib/tools/codex-limits.js +39 -340
  26. package/dist/lib/tools/codex-limits.js.map +1 -1
  27. package/dist/lib/tools/codex-switch.d.ts.map +1 -1
  28. package/dist/lib/tools/codex-switch.js +9 -0
  29. package/dist/lib/tools/codex-switch.js.map +1 -1
  30. package/dist/lib/tui-quota-cache.d.ts +33 -0
  31. package/dist/lib/tui-quota-cache.d.ts.map +1 -0
  32. package/dist/lib/tui-quota-cache.js +247 -0
  33. package/dist/lib/tui-quota-cache.js.map +1 -0
  34. package/dist/lib/tui-status.d.ts +55 -0
  35. package/dist/lib/tui-status.d.ts.map +1 -0
  36. package/dist/lib/tui-status.js +343 -0
  37. package/dist/lib/tui-status.js.map +1 -0
  38. package/dist/tui.d.ts +6 -0
  39. package/dist/tui.d.ts.map +1 -0
  40. package/dist/tui.js +363 -0
  41. package/dist/tui.js.map +1 -0
  42. package/package.json +16 -2
  43. package/scripts/install-oc-codex-multi-auth-core.js +119 -18
@@ -0,0 +1,33 @@
1
+ import type { CompactQuotaLimit } from "./tui-status.js";
2
+ export declare const TUI_QUOTA_CACHE_VERSION = 1;
3
+ export declare const TUI_QUOTA_CACHE_FILE = "oc-codex-multi-auth-tui-quota.json";
4
+ export type TuiQuotaSource = "headers" | "usage";
5
+ export type TuiQuotaLimit = CompactQuotaLimit & {
6
+ usedPercent?: number;
7
+ windowMinutes?: number;
8
+ resetAtMs?: number;
9
+ };
10
+ export type TuiQuotaSnapshot = {
11
+ version: typeof TUI_QUOTA_CACHE_VERSION;
12
+ fingerprint: string;
13
+ fetchedAt: number;
14
+ source: TuiQuotaSource;
15
+ accountIndex?: number;
16
+ accountCount?: number;
17
+ accountEmail?: string;
18
+ accountLabel?: string;
19
+ planType?: string;
20
+ activeLimit?: number;
21
+ limits: TuiQuotaLimit[];
22
+ };
23
+ export type TuiQuotaSnapshotInput = Omit<TuiQuotaSnapshot, "version" | "fetchedAt"> & {
24
+ fetchedAt?: number;
25
+ };
26
+ export declare function getTuiQuotaCachePath(stateDir?: string): string;
27
+ export declare function createTuiQuotaSnapshot(input: TuiQuotaSnapshotInput): TuiQuotaSnapshot;
28
+ export declare function parseTuiQuotaSnapshotFromHeaders(headers: Headers, input: Omit<TuiQuotaSnapshotInput, "source" | "limits">): TuiQuotaSnapshot | undefined;
29
+ export declare function isTuiQuotaSnapshot(value: unknown): value is TuiQuotaSnapshot;
30
+ export declare function readTuiQuotaSnapshot(cachePath?: string): Promise<TuiQuotaSnapshot | undefined>;
31
+ export declare function writeTuiQuotaSnapshot(snapshot: TuiQuotaSnapshot, cachePath?: string): Promise<void>;
32
+ export declare function clearTuiQuotaSnapshot(cachePath?: string): Promise<void>;
33
+ //# sourceMappingURL=tui-quota-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-quota-cache.d.ts","sourceRoot":"","sources":["../../lib/tui-quota-cache.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAGzE,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,OAAO,uBAAuB,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACvC,gBAAgB,EAChB,SAAS,GAAG,WAAW,CACvB,GAAG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAcF,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9D;AA4GD,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,qBAAqB,GAC1B,gBAAgB,CAMlB;AAsBD,wBAAgB,gCAAgC,CAC/C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,QAAQ,GAAG,QAAQ,CAAC,GACrD,gBAAgB,GAAG,SAAS,CAmB9B;AAgCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAoB5E;AAED,wBAAsB,oBAAoB,CACzC,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAQvC;AAED,wBAAsB,qBAAqB,CAC1C,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,wBAAsB,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7E"}
@@ -0,0 +1,247 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { renameWithWindowsRetry } from "./storage/atomic-write.js";
5
+ export const TUI_QUOTA_CACHE_VERSION = 1;
6
+ export const TUI_QUOTA_CACHE_FILE = "oc-codex-multi-auth-tui-quota.json";
7
+ const TUI_QUOTA_CACHE_WRITE_SKIP_MS = 500;
8
+ const recentTuiQuotaWrites = new Map();
9
+ function getDefaultOpenCodeStateDir() {
10
+ return join(homedir(), ".local", "state", "opencode");
11
+ }
12
+ export function getTuiQuotaCachePath(stateDir) {
13
+ const envStateDir = process.env.OPENCODE_STATE_DIR?.trim();
14
+ return join(stateDir?.trim() || envStateDir || getDefaultOpenCodeStateDir(), TUI_QUOTA_CACHE_FILE);
15
+ }
16
+ function parseFiniteNumberHeader(headers, name) {
17
+ const raw = headers.get(name);
18
+ if (!raw)
19
+ return undefined;
20
+ const parsed = Number(raw);
21
+ return Number.isFinite(parsed) ? parsed : undefined;
22
+ }
23
+ function parseFiniteIntHeader(headers, name) {
24
+ const raw = headers.get(name);
25
+ if (!raw)
26
+ return undefined;
27
+ const parsed = Number.parseInt(raw, 10);
28
+ return Number.isFinite(parsed) ? parsed : undefined;
29
+ }
30
+ function parseResetAtMs(headers, prefix) {
31
+ const resetAfterSeconds = parseFiniteIntHeader(headers, `${prefix}-reset-after-seconds`);
32
+ if (typeof resetAfterSeconds === "number" &&
33
+ Number.isFinite(resetAfterSeconds) &&
34
+ resetAfterSeconds > 0) {
35
+ return Date.now() + resetAfterSeconds * 1000;
36
+ }
37
+ const resetAtRaw = headers.get(`${prefix}-reset-at`);
38
+ if (!resetAtRaw)
39
+ return undefined;
40
+ const trimmed = resetAtRaw.trim();
41
+ if (/^\d+$/.test(trimmed)) {
42
+ const parsedNumber = Number.parseInt(trimmed, 10);
43
+ if (Number.isFinite(parsedNumber) && parsedNumber > 0) {
44
+ return parsedNumber < 10_000_000_000
45
+ ? parsedNumber * 1000
46
+ : parsedNumber;
47
+ }
48
+ }
49
+ const parsedDate = Date.parse(trimmed);
50
+ return Number.isFinite(parsedDate) ? parsedDate : undefined;
51
+ }
52
+ function formatWindowLabel(windowMinutes) {
53
+ if (!windowMinutes ||
54
+ !Number.isFinite(windowMinutes) ||
55
+ windowMinutes <= 0) {
56
+ return "quota";
57
+ }
58
+ if (windowMinutes % 1440 === 0)
59
+ return `${windowMinutes / 1440}d`;
60
+ if (windowMinutes % 60 === 0)
61
+ return `${windowMinutes / 60}h`;
62
+ return `${windowMinutes}m`;
63
+ }
64
+ function getLeftPercent(usedPercent) {
65
+ return typeof usedPercent === "number" && Number.isFinite(usedPercent)
66
+ ? Math.max(0, Math.min(100, Math.round(100 - usedPercent)))
67
+ : null;
68
+ }
69
+ function hasCodexQuotaHeaders(headers) {
70
+ const keys = [
71
+ "x-codex-primary-used-percent",
72
+ "x-codex-primary-window-minutes",
73
+ "x-codex-primary-reset-at",
74
+ "x-codex-primary-reset-after-seconds",
75
+ "x-codex-secondary-used-percent",
76
+ "x-codex-secondary-window-minutes",
77
+ "x-codex-secondary-reset-at",
78
+ "x-codex-secondary-reset-after-seconds",
79
+ ];
80
+ return keys.some((key) => headers.get(key) !== null);
81
+ }
82
+ function parseLimit(headers, prefix) {
83
+ const usedPercent = parseFiniteNumberHeader(headers, `${prefix}-used-percent`);
84
+ const windowMinutes = parseFiniteIntHeader(headers, `${prefix}-window-minutes`);
85
+ const resetAtMs = parseResetAtMs(headers, prefix);
86
+ return {
87
+ label: formatWindowLabel(windowMinutes),
88
+ leftPercent: getLeftPercent(usedPercent),
89
+ usedPercent,
90
+ windowMinutes,
91
+ resetAtMs,
92
+ };
93
+ }
94
+ function hasUsefulLimit(limit) {
95
+ return Boolean(limit.windowMinutes ||
96
+ typeof limit.usedPercent === "number" ||
97
+ typeof limit.resetAtMs === "number");
98
+ }
99
+ export function createTuiQuotaSnapshot(input) {
100
+ return {
101
+ version: TUI_QUOTA_CACHE_VERSION,
102
+ ...input,
103
+ fetchedAt: input.fetchedAt ?? Date.now(),
104
+ };
105
+ }
106
+ function getSnapshotWriteKey(snapshot) {
107
+ return JSON.stringify({
108
+ fingerprint: snapshot.fingerprint,
109
+ source: snapshot.source,
110
+ accountIndex: snapshot.accountIndex,
111
+ accountCount: snapshot.accountCount,
112
+ accountEmail: snapshot.accountEmail,
113
+ accountLabel: snapshot.accountLabel,
114
+ planType: snapshot.planType,
115
+ activeLimit: snapshot.activeLimit,
116
+ limits: snapshot.limits.map((limit) => ({
117
+ label: limit.label,
118
+ leftPercent: limit.leftPercent,
119
+ usedPercent: limit.usedPercent,
120
+ windowMinutes: limit.windowMinutes,
121
+ resetAtMs: limit.resetAtMs,
122
+ })),
123
+ });
124
+ }
125
+ export function parseTuiQuotaSnapshotFromHeaders(headers, input) {
126
+ if (!hasCodexQuotaHeaders(headers))
127
+ return undefined;
128
+ const limits = [
129
+ parseLimit(headers, "x-codex-primary"),
130
+ parseLimit(headers, "x-codex-secondary"),
131
+ ].filter(hasUsefulLimit);
132
+ if (limits.length === 0)
133
+ return undefined;
134
+ const planTypeRaw = headers.get("x-codex-plan-type");
135
+ const planType = planTypeRaw?.trim() || undefined;
136
+ const activeLimit = parseFiniteIntHeader(headers, "x-codex-active-limit");
137
+ return createTuiQuotaSnapshot({
138
+ ...input,
139
+ source: "headers",
140
+ planType,
141
+ activeLimit,
142
+ limits,
143
+ });
144
+ }
145
+ function isRecord(value) {
146
+ return value !== null && typeof value === "object" && !Array.isArray(value);
147
+ }
148
+ function isOptionalFiniteNumber(value) {
149
+ return value === undefined || (typeof value === "number" && Number.isFinite(value));
150
+ }
151
+ function isNullablePercent(value) {
152
+ return (value === null ||
153
+ (typeof value === "number" &&
154
+ Number.isFinite(value) &&
155
+ value >= 0 &&
156
+ value <= 100));
157
+ }
158
+ function isTuiQuotaLimit(value) {
159
+ return (isRecord(value) &&
160
+ typeof value.label === "string" &&
161
+ value.label.trim().length > 0 &&
162
+ isNullablePercent(value.leftPercent) &&
163
+ isOptionalFiniteNumber(value.usedPercent) &&
164
+ isOptionalFiniteNumber(value.windowMinutes) &&
165
+ isOptionalFiniteNumber(value.resetAtMs));
166
+ }
167
+ export function isTuiQuotaSnapshot(value) {
168
+ return (isRecord(value) &&
169
+ value.version === TUI_QUOTA_CACHE_VERSION &&
170
+ typeof value.fingerprint === "string" &&
171
+ value.fingerprint.trim().length > 0 &&
172
+ typeof value.fetchedAt === "number" &&
173
+ Number.isFinite(value.fetchedAt) &&
174
+ (value.source === "headers" || value.source === "usage") &&
175
+ isOptionalFiniteNumber(value.accountIndex) &&
176
+ isOptionalFiniteNumber(value.accountCount) &&
177
+ (value.accountEmail === undefined ||
178
+ typeof value.accountEmail === "string") &&
179
+ (value.accountLabel === undefined ||
180
+ typeof value.accountLabel === "string") &&
181
+ (value.planType === undefined || typeof value.planType === "string") &&
182
+ isOptionalFiniteNumber(value.activeLimit) &&
183
+ Array.isArray(value.limits) &&
184
+ value.limits.every(isTuiQuotaLimit));
185
+ }
186
+ export async function readTuiQuotaSnapshot(cachePath) {
187
+ try {
188
+ const raw = await fs.readFile(cachePath ?? getTuiQuotaCachePath(), "utf-8");
189
+ const parsed = JSON.parse(raw);
190
+ return isTuiQuotaSnapshot(parsed) ? parsed : undefined;
191
+ }
192
+ catch {
193
+ return undefined;
194
+ }
195
+ }
196
+ export async function writeTuiQuotaSnapshot(snapshot, cachePath) {
197
+ const target = cachePath ?? getTuiQuotaCachePath();
198
+ const writeKey = getSnapshotWriteKey(snapshot);
199
+ const now = Date.now();
200
+ const recentWrite = recentTuiQuotaWrites.get(target);
201
+ if (recentWrite?.key === writeKey &&
202
+ now - recentWrite.at < TUI_QUOTA_CACHE_WRITE_SKIP_MS) {
203
+ await recentWrite.promise;
204
+ return;
205
+ }
206
+ const temporary = `${target}.${process.pid}.${now}.${Math.random().toString(36).slice(2)}.tmp`;
207
+ const writePromise = (async () => {
208
+ await fs.mkdir(dirname(target), { recursive: true });
209
+ await fs.writeFile(temporary, `${JSON.stringify(snapshot, null, 2)}\n`, {
210
+ encoding: "utf-8",
211
+ mode: 0o600,
212
+ });
213
+ await renameWithWindowsRetry(temporary, target);
214
+ })();
215
+ recentTuiQuotaWrites.set(target, {
216
+ key: writeKey,
217
+ at: now,
218
+ promise: writePromise,
219
+ });
220
+ try {
221
+ await writePromise;
222
+ recentTuiQuotaWrites.set(target, {
223
+ key: writeKey,
224
+ at: Date.now(),
225
+ });
226
+ }
227
+ catch (error) {
228
+ await fs.unlink(temporary).catch(() => undefined);
229
+ if (recentTuiQuotaWrites.get(target)?.promise === writePromise) {
230
+ recentTuiQuotaWrites.delete(target);
231
+ }
232
+ throw error;
233
+ }
234
+ }
235
+ export async function clearTuiQuotaSnapshot(cachePath) {
236
+ const target = cachePath ?? getTuiQuotaCachePath();
237
+ recentTuiQuotaWrites.delete(target);
238
+ try {
239
+ await fs.unlink(target);
240
+ }
241
+ catch (error) {
242
+ if (error?.code === "ENOENT")
243
+ return;
244
+ throw error;
245
+ }
246
+ }
247
+ //# sourceMappingURL=tui-quota-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-quota-cache.js","sourceRoot":"","sources":["../../lib/tui-quota-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { Config } from "@opencode-ai/sdk/v2";
2
+ export type ReasoningVariant = "none" | "low" | "medium" | "high" | "xhigh";
3
+ export type CompactQuotaLimit = {
4
+ label: string;
5
+ leftPercent: number | null;
6
+ usedPercent?: number;
7
+ windowMinutes?: number;
8
+ resetAtMs?: number;
9
+ };
10
+ export type CompactQuotaSource = "headers" | "usage";
11
+ export type CompactQuotaStatus = {
12
+ type: "loading";
13
+ } | {
14
+ type: "missing";
15
+ } | {
16
+ type: "unavailable";
17
+ } | {
18
+ type: "ready";
19
+ limits: readonly CompactQuotaLimit[];
20
+ stale: boolean;
21
+ source?: CompactQuotaSource;
22
+ fetchedAt?: number;
23
+ fingerprint?: string;
24
+ accountIndex?: number;
25
+ accountCount?: number;
26
+ accountEmail?: string;
27
+ accountLabel?: string;
28
+ planType?: string;
29
+ activeLimit?: number;
30
+ };
31
+ export type PromptStatusMessage = {
32
+ role: "user" | "assistant";
33
+ modelID?: string;
34
+ variant?: string;
35
+ userModel?: {
36
+ modelID?: string;
37
+ variant?: string;
38
+ };
39
+ };
40
+ export type PromptStatusConfig = Pick<Config, "model" | "default_agent" | "agent" | "mode" | "provider">;
41
+ export declare function normalizeReasoningVariant(value: string | undefined): ReasoningVariant | undefined;
42
+ export declare function inferReasoningVariantFromModelId(modelID: string | undefined): ReasoningVariant | undefined;
43
+ export declare function resolvePromptReasoningVariant(params: {
44
+ messages?: readonly PromptStatusMessage[];
45
+ config?: PromptStatusConfig;
46
+ }): ReasoningVariant | undefined;
47
+ export declare function formatPromptStatusText(params: {
48
+ variant?: ReasoningVariant;
49
+ quota: CompactQuotaStatus;
50
+ width?: number;
51
+ }): string;
52
+ export type QuotaPromptTone = "normal" | "warning" | "danger" | "stale" | "unknown";
53
+ export declare function resolveQuotaPromptTone(quota: CompactQuotaStatus): QuotaPromptTone;
54
+ export declare function formatQuotaDetailsText(quota: CompactQuotaStatus, now?: number): string;
55
+ //# sourceMappingURL=tui-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-status.d.ts","sourceRoot":"","sources":["../../lib/tui-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5E,MAAM,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAC3B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IACA,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEL,MAAM,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACpC,MAAM,EACN,OAAO,GAAG,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CACzD,CAAC;AAqBF,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,MAAM,GAAG,SAAS,GACvB,gBAAgB,GAAG,SAAS,CAO9B;AAED,wBAAgB,gCAAgC,CAC/C,OAAO,EAAE,MAAM,GAAG,SAAS,GACzB,gBAAgB,GAAG,SAAS,CAO9B;AAiED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACrD,QAAQ,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC5B,GAAG,gBAAgB,GAAG,SAAS,CA8B/B;AAmGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC9C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CA6BT;AAED,MAAM,MAAM,eAAe,GACxB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,CAAC;AAEb,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,kBAAkB,GACvB,eAAe,CAcjB;AA4DD,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,kBAAkB,EACzB,GAAG,SAAa,GACd,MAAM,CA8BR"}