hacklab 0.0.1 → 0.3.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/README.md +48 -8
- package/bin/ddd +19 -0
- package/dist/commands/brag.d.ts +3 -6
- package/dist/commands/brag.d.ts.map +1 -1
- package/dist/commands/brag.js +68 -299
- package/dist/commands/brag.js.map +1 -1
- package/dist/commands/claim.d.ts +2 -0
- package/dist/commands/claim.d.ts.map +1 -0
- package/dist/commands/claim.js +534 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +48 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dojo-init.d.ts +2 -0
- package/dist/commands/dojo-init.d.ts.map +1 -0
- package/dist/commands/dojo-init.js +75 -0
- package/dist/commands/dojo-init.js.map +1 -0
- package/dist/commands/drop.d.ts +2 -0
- package/dist/commands/drop.d.ts.map +1 -0
- package/dist/commands/drop.js +29 -0
- package/dist/commands/drop.js.map +1 -0
- package/dist/commands/exam.d.ts +5 -0
- package/dist/commands/exam.d.ts.map +1 -0
- package/dist/commands/exam.js +224 -0
- package/dist/commands/exam.js.map +1 -0
- package/dist/commands/login.d.ts +1 -14
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +70 -102
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/scan-profile.d.ts +33 -0
- package/dist/commands/scan-profile.d.ts.map +1 -0
- package/dist/commands/scan-profile.js +279 -0
- package/dist/commands/scan-profile.js.map +1 -0
- package/dist/commands/signup.d.ts +11 -0
- package/dist/commands/signup.d.ts.map +1 -0
- package/dist/commands/signup.js +242 -0
- package/dist/commands/signup.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +55 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/whoami.d.ts +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +10 -16
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -0
- package/dist/dd.d.ts +3 -0
- package/dist/dd.d.ts.map +1 -0
- package/dist/dd.js +28 -0
- package/dist/dd.js.map +1 -0
- package/dist/index.js +125 -134
- package/dist/index.js.map +1 -1
- package/dist/project-brag.d.ts +58 -0
- package/dist/project-brag.d.ts.map +1 -0
- package/dist/project-brag.js +270 -0
- package/dist/project-brag.js.map +1 -0
- package/dist/scanners/index.d.ts +24 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +543 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/util.d.ts +83 -0
- package/dist/scanners/util.d.ts.map +1 -0
- package/dist/scanners/util.js +129 -0
- package/dist/scanners/util.js.map +1 -0
- package/dist/session.d.ts +17 -12
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +46 -141
- package/dist/session.js.map +1 -1
- package/dist/share-card.d.ts +29 -0
- package/dist/share-card.d.ts.map +1 -0
- package/dist/share-card.js +401 -0
- package/dist/share-card.js.map +1 -0
- package/dist/sync.d.ts +64 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +805 -0
- package/dist/sync.js.map +1 -0
- package/dist/ui.d.ts +10 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +21 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils/openBrowser.js.map +1 -1
- package/package.json +36 -27
- package/dist/api/client.d.ts +0 -118
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js +0 -214
- package/dist/api/client.js.map +0 -1
- package/dist/commands/brag.utils.d.ts +0 -12
- package/dist/commands/brag.utils.d.ts.map +0 -1
- package/dist/commands/brag.utils.js +0 -43
- package/dist/commands/brag.utils.js.map +0 -1
- package/dist/commands/essay.d.ts +0 -18
- package/dist/commands/essay.d.ts.map +0 -1
- package/dist/commands/essay.js +0 -117
- package/dist/commands/essay.js.map +0 -1
- package/dist/commands/init.d.ts +0 -16
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -237
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/join.d.ts +0 -10
- package/dist/commands/join.d.ts.map +0 -1
- package/dist/commands/join.js +0 -314
- package/dist/commands/join.js.map +0 -1
- package/dist/commands/link.d.ts +0 -17
- package/dist/commands/link.d.ts.map +0 -1
- package/dist/commands/link.js +0 -36
- package/dist/commands/link.js.map +0 -1
- package/dist/commands/login.utils.d.ts +0 -3
- package/dist/commands/login.utils.d.ts.map +0 -1
- package/dist/commands/login.utils.js +0 -13
- package/dist/commands/login.utils.js.map +0 -1
- package/dist/commands/new.d.ts +0 -15
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -172
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/new.utils.d.ts +0 -7
- package/dist/commands/new.utils.d.ts.map +0 -1
- package/dist/commands/new.utils.js +0 -50
- package/dist/commands/new.utils.js.map +0 -1
- package/dist/commands/onboard.d.ts +0 -10
- package/dist/commands/onboard.d.ts.map +0 -1
- package/dist/commands/onboard.js +0 -93
- package/dist/commands/onboard.js.map +0 -1
- package/dist/commands/tui.d.ts +0 -12
- package/dist/commands/tui.d.ts.map +0 -1
- package/dist/commands/tui.js +0 -112
- package/dist/commands/tui.js.map +0 -1
- package/dist/help-format.d.ts +0 -4
- package/dist/help-format.d.ts.map +0 -1
- package/dist/help-format.js +0 -30
- package/dist/help-format.js.map +0 -1
- package/dist/lab/config.d.ts +0 -32
- package/dist/lab/config.d.ts.map +0 -1
- package/dist/lab/config.js +0 -148
- package/dist/lab/config.js.map +0 -1
- package/dist/lab/contentStatus.d.ts +0 -6
- package/dist/lab/contentStatus.d.ts.map +0 -1
- package/dist/lab/contentStatus.js +0 -19
- package/dist/lab/contentStatus.js.map +0 -1
- package/dist/ui/banner.d.ts +0 -2
- package/dist/ui/banner.d.ts.map +0 -1
- package/dist/ui/banner.js +0 -22
- package/dist/ui/banner.js.map +0 -1
- package/dist/utils/findRepoRoot.d.ts +0 -2
- package/dist/utils/findRepoRoot.d.ts.map +0 -1
- package/dist/utils/findRepoRoot.js +0 -17
- package/dist/utils/findRepoRoot.js.map +0 -1
- package/dist/utils/pathExists.d.ts +0 -2
- package/dist/utils/pathExists.d.ts.map +0 -1
- package/dist/utils/pathExists.js +0 -11
- package/dist/utils/pathExists.js.map +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { access, readFile } from 'node:fs/promises';
|
|
3
|
+
import { basename, extname, resolve } from 'node:path';
|
|
4
|
+
import { parse as parseYaml } from 'yaml';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
export const DEFAULT_BRAG_MANIFEST_PATH = '.hacklab/project.yaml';
|
|
7
|
+
const PROJECT_SLUG_PATTERN = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;
|
|
8
|
+
const README_CANDIDATES = ['README.md', 'README.mdx', 'readme.md', 'readme.mdx'];
|
|
9
|
+
const IMAGE_CONTENT_TYPES = new Map([
|
|
10
|
+
['.png', 'image/png'],
|
|
11
|
+
['.jpg', 'image/jpeg'],
|
|
12
|
+
['.jpeg', 'image/jpeg'],
|
|
13
|
+
]);
|
|
14
|
+
const optionalTrimmedString = z.preprocess((value) => {
|
|
15
|
+
if (typeof value !== 'string') {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
return trimmed.length ? trimmed : undefined;
|
|
20
|
+
}, z.string().optional());
|
|
21
|
+
const optionalRawString = z.preprocess((value) => {
|
|
22
|
+
if (typeof value !== 'string') {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return value.length ? value : undefined;
|
|
26
|
+
}, z.string().optional());
|
|
27
|
+
const optionalUrl = z.preprocess((value) => {
|
|
28
|
+
if (typeof value !== 'string') {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
const trimmed = value.trim();
|
|
32
|
+
return trimmed.length ? trimmed : undefined;
|
|
33
|
+
}, z.string().url().optional());
|
|
34
|
+
const screenshotEntrySchema = z.union([
|
|
35
|
+
z.string().trim().min(1),
|
|
36
|
+
z
|
|
37
|
+
.object({
|
|
38
|
+
path: optionalTrimmedString,
|
|
39
|
+
url: optionalUrl,
|
|
40
|
+
caption: z.string().trim().optional().default(''),
|
|
41
|
+
})
|
|
42
|
+
.refine((value) => Boolean(value.path || value.url), {
|
|
43
|
+
message: 'Screenshot entry must include path or url',
|
|
44
|
+
})
|
|
45
|
+
.refine((value) => !(value.path && value.url), {
|
|
46
|
+
message: 'Screenshot entry cannot include both path and url',
|
|
47
|
+
}),
|
|
48
|
+
]);
|
|
49
|
+
const projectManifestSchema = z.object({
|
|
50
|
+
title: z.string().trim().min(1).max(200),
|
|
51
|
+
slug: z
|
|
52
|
+
.string()
|
|
53
|
+
.trim()
|
|
54
|
+
.min(1)
|
|
55
|
+
.max(100)
|
|
56
|
+
.regex(PROJECT_SLUG_PATTERN, 'Slug must use lowercase letters, numbers, and hyphens only.')
|
|
57
|
+
.optional(),
|
|
58
|
+
description: z.string().trim().max(2000).optional(),
|
|
59
|
+
tags: z
|
|
60
|
+
.preprocess((value) => {
|
|
61
|
+
if (typeof value === 'string') {
|
|
62
|
+
return value
|
|
63
|
+
.split(',')
|
|
64
|
+
.map((tag) => tag.trim())
|
|
65
|
+
.filter(Boolean);
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
}, z.array(z.string().trim().min(1).max(50)).max(20).optional())
|
|
69
|
+
.default([]),
|
|
70
|
+
repoUrl: optionalUrl,
|
|
71
|
+
liveUrl: optionalUrl,
|
|
72
|
+
screenshots: z.array(screenshotEntrySchema).max(5).optional().default([]),
|
|
73
|
+
content: optionalRawString,
|
|
74
|
+
contentFile: optionalTrimmedString,
|
|
75
|
+
publishedAt: z.preprocess((value) => {
|
|
76
|
+
if (value instanceof Date) {
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
if (typeof value !== 'string') {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const trimmed = value.trim();
|
|
83
|
+
return trimmed.length ? trimmed : undefined;
|
|
84
|
+
}, z.coerce.date().optional()),
|
|
85
|
+
});
|
|
86
|
+
function isRecord(value) {
|
|
87
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
88
|
+
}
|
|
89
|
+
function firstDefined(...values) {
|
|
90
|
+
for (const value of values) {
|
|
91
|
+
if (value !== undefined) {
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
function normalizeManifestInput(value) {
|
|
98
|
+
if (!isRecord(value)) {
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
title: value.title,
|
|
103
|
+
slug: value.slug,
|
|
104
|
+
description: value.description,
|
|
105
|
+
tags: value.tags,
|
|
106
|
+
repoUrl: firstDefined(value.repoUrl, value.repo_url, value.repo),
|
|
107
|
+
liveUrl: firstDefined(value.liveUrl, value.live_url, value.url),
|
|
108
|
+
screenshots: value.screenshots,
|
|
109
|
+
content: value.content,
|
|
110
|
+
contentFile: firstDefined(value.contentFile, value.content_file, value.readme, value.readmeFile, value.readme_file),
|
|
111
|
+
publishedAt: firstDefined(value.publishedAt, value.published_at, value.date),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function slugify(value) {
|
|
115
|
+
return value
|
|
116
|
+
.toLowerCase()
|
|
117
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
118
|
+
.replace(/^-+|-+$/g, '')
|
|
119
|
+
.replace(/-{2,}/g, '-');
|
|
120
|
+
}
|
|
121
|
+
function formatZodError(error) {
|
|
122
|
+
const issue = error.issues[0];
|
|
123
|
+
if (!issue) {
|
|
124
|
+
return 'Invalid project manifest';
|
|
125
|
+
}
|
|
126
|
+
const path = issue.path.length ? `${issue.path.join('.')}: ` : '';
|
|
127
|
+
return `${path}${issue.message}`;
|
|
128
|
+
}
|
|
129
|
+
export async function loadBragManifest(options) {
|
|
130
|
+
const cwd = resolve(options?.cwd ?? process.cwd());
|
|
131
|
+
const manifestPath = resolve(cwd, options?.manifestPath ?? DEFAULT_BRAG_MANIFEST_PATH);
|
|
132
|
+
let rawYaml;
|
|
133
|
+
try {
|
|
134
|
+
rawYaml = await readFile(manifestPath, 'utf8');
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new Error(`No project manifest found at ${manifestPath}`);
|
|
138
|
+
}
|
|
139
|
+
let parsedYaml;
|
|
140
|
+
try {
|
|
141
|
+
parsedYaml = parseYaml(rawYaml);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw new Error(`Failed to parse ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
145
|
+
}
|
|
146
|
+
const parsedManifest = projectManifestSchema.safeParse(normalizeManifestInput(parsedYaml));
|
|
147
|
+
if (!parsedManifest.success) {
|
|
148
|
+
throw new Error(`Invalid ${manifestPath}: ${formatZodError(parsedManifest.error)}`);
|
|
149
|
+
}
|
|
150
|
+
const fallbackSlug = slugify(basename(cwd));
|
|
151
|
+
const slug = parsedManifest.data.slug ?? fallbackSlug;
|
|
152
|
+
if (!slug || !PROJECT_SLUG_PATTERN.test(slug)) {
|
|
153
|
+
throw new Error(`Could not derive a valid slug from ${basename(cwd)}. Set slug in ${manifestPath}.`);
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
cwd,
|
|
157
|
+
manifestPath,
|
|
158
|
+
rawYaml,
|
|
159
|
+
manifest: {
|
|
160
|
+
...parsedManifest.data,
|
|
161
|
+
slug,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async function fileExists(path) {
|
|
166
|
+
try {
|
|
167
|
+
await access(path, constants.F_OK);
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async function loadProjectContent(manifest) {
|
|
175
|
+
if (manifest.manifest.content && manifest.manifest.contentFile) {
|
|
176
|
+
throw new Error(`Use either content or contentFile in ${manifest.manifestPath}, not both.`);
|
|
177
|
+
}
|
|
178
|
+
if (manifest.manifest.content) {
|
|
179
|
+
return manifest.manifest.content;
|
|
180
|
+
}
|
|
181
|
+
if (manifest.manifest.contentFile) {
|
|
182
|
+
const contentPath = resolve(manifest.cwd, manifest.manifest.contentFile);
|
|
183
|
+
try {
|
|
184
|
+
return await readFile(contentPath, 'utf8');
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
throw new Error(`contentFile not found: ${manifest.manifest.contentFile}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const candidate of README_CANDIDATES) {
|
|
191
|
+
const candidatePath = resolve(manifest.cwd, candidate);
|
|
192
|
+
if (await fileExists(candidatePath)) {
|
|
193
|
+
return await readFile(candidatePath, 'utf8');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
function normalizeScreenshotEntry(entry) {
|
|
199
|
+
if (typeof entry === 'string') {
|
|
200
|
+
if (/^https?:\/\//i.test(entry)) {
|
|
201
|
+
return {
|
|
202
|
+
url: entry,
|
|
203
|
+
caption: '',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
path: entry,
|
|
208
|
+
caption: '',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
path: entry.path,
|
|
213
|
+
url: entry.url,
|
|
214
|
+
caption: entry.caption ?? '',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
export async function buildBragProjectPayload(manifest, uploadScreenshot) {
|
|
218
|
+
const content = await loadProjectContent(manifest);
|
|
219
|
+
const screenshots = [];
|
|
220
|
+
for (const rawEntry of manifest.manifest.screenshots) {
|
|
221
|
+
const entry = normalizeScreenshotEntry(rawEntry);
|
|
222
|
+
if (entry.url) {
|
|
223
|
+
screenshots.push({
|
|
224
|
+
url: entry.url,
|
|
225
|
+
caption: entry.caption,
|
|
226
|
+
});
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (!entry.path) {
|
|
230
|
+
throw new Error('Screenshot entry is missing a path or url.');
|
|
231
|
+
}
|
|
232
|
+
const absolutePath = resolve(manifest.cwd, entry.path);
|
|
233
|
+
let buffer;
|
|
234
|
+
try {
|
|
235
|
+
buffer = await readFile(absolutePath);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
throw new Error(`Screenshot not found: ${entry.path}`);
|
|
239
|
+
}
|
|
240
|
+
const extension = extname(absolutePath).toLowerCase();
|
|
241
|
+
const contentType = IMAGE_CONTENT_TYPES.get(extension);
|
|
242
|
+
if (!contentType) {
|
|
243
|
+
throw new Error(`Unsupported screenshot type for ${entry.path}. Use PNG or JPEG.`);
|
|
244
|
+
}
|
|
245
|
+
const url = await uploadScreenshot({
|
|
246
|
+
absolutePath,
|
|
247
|
+
base64: buffer.toString('base64'),
|
|
248
|
+
contentType,
|
|
249
|
+
filename: basename(absolutePath),
|
|
250
|
+
caption: entry.caption,
|
|
251
|
+
});
|
|
252
|
+
screenshots.push({
|
|
253
|
+
url,
|
|
254
|
+
caption: entry.caption,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
title: manifest.manifest.title,
|
|
259
|
+
slug: manifest.manifest.slug,
|
|
260
|
+
description: manifest.manifest.description,
|
|
261
|
+
tags: manifest.manifest.tags,
|
|
262
|
+
repoUrl: manifest.manifest.repoUrl,
|
|
263
|
+
liveUrl: manifest.manifest.liveUrl,
|
|
264
|
+
screenshots,
|
|
265
|
+
content,
|
|
266
|
+
sourceYaml: manifest.rawYaml,
|
|
267
|
+
publishedAt: manifest.manifest.publishedAt?.toISOString(),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=project-brag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-brag.js","sourceRoot":"","sources":["../src/project-brag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type CursorScanStatus, type CursorStats, type DailyToolEntry, type HourlyEntry, type ScanResult } from './util.js';
|
|
2
|
+
export * from './util.js';
|
|
3
|
+
export declare function scanClaudeCode(): Promise<ScanResult>;
|
|
4
|
+
export declare function scanCodex(): Promise<ScanResult>;
|
|
5
|
+
export declare function scanHermes(): Promise<ScanResult>;
|
|
6
|
+
export declare function scanOpenclaw(): Promise<ScanResult>;
|
|
7
|
+
export declare function scanOpenCode(): Promise<ScanResult>;
|
|
8
|
+
export declare function scanCursorLocal(): Promise<ScanResult>;
|
|
9
|
+
export declare function scanCursorApi(): Promise<ScanResult>;
|
|
10
|
+
export type AggregateScan = {
|
|
11
|
+
toolTotals: Record<string, number>;
|
|
12
|
+
dailyTotals: DailyToolEntry[];
|
|
13
|
+
hourlyTotals: HourlyEntry[];
|
|
14
|
+
modelTotals: Record<string, number>;
|
|
15
|
+
grandTotal: number;
|
|
16
|
+
cursorStats: CursorStats | null;
|
|
17
|
+
cursorScanStatus: CursorScanStatus;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Run every scanner in parallel and merge into a single submit-ready payload.
|
|
21
|
+
* Cursor prefers the API source when configured; otherwise the local estimate.
|
|
22
|
+
*/
|
|
23
|
+
export declare function scanAllTools(): Promise<AggregateScan>;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,KAAK,UAAU,EAGhB,MAAM,WAAW,CAAA;AAElB,cAAc,WAAW,CAAA;AAKzB,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAuD1D;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAiDrD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAmDtD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAgFxD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CA+FxD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CAuE3D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAmHzD;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,gBAAgB,CAAA;CACnC,CAAA;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,CA6C3D"}
|