hacklab 0.12.6 → 0.12.8
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 +26 -17
- package/dist/cli.js +3 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/drops.d.ts +7 -0
- package/dist/commands/drops.d.ts.map +1 -0
- package/dist/commands/drops.js +63 -0
- package/dist/commands/drops.js.map +1 -0
- package/dist/commands/hacker.d.ts.map +1 -1
- package/dist/commands/hacker.js +13 -15
- package/dist/commands/hacker.js.map +1 -1
- package/dist/commands/profile.d.ts +13 -2
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +183 -82
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/rtfm.d.ts.map +1 -1
- package/dist/commands/rtfm.js +97 -43
- package/dist/commands/rtfm.js.map +1 -1
- package/dist/commands/scan.d.ts +9 -4
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +131 -69
- package/dist/commands/scan.js.map +1 -1
- package/dist/daily-sync.d.ts +2 -0
- package/dist/daily-sync.d.ts.map +1 -1
- package/dist/daily-sync.js +21 -0
- package/dist/daily-sync.js.map +1 -1
- package/dist/dossier.d.ts +73 -0
- package/dist/dossier.d.ts.map +1 -0
- package/dist/dossier.js +141 -0
- package/dist/dossier.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +11 -3
- package/dist/registry.js.map +1 -1
- package/dist/scanners/index.d.ts +2 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +8 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/util.d.ts +2 -0
- package/dist/scanners/util.d.ts.map +1 -1
- package/dist/scanners/util.js +23 -0
- package/dist/scanners/util.js.map +1 -1
- package/dist/share-card.d.ts +0 -1
- package/dist/share-card.d.ts.map +1 -1
- package/dist/share-card.js +2 -28
- package/dist/share-card.js.map +1 -1
- package/dist/share.d.ts +4 -2
- package/dist/share.d.ts.map +1 -1
- package/dist/share.js +30 -27
- package/dist/share.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,29 +6,31 @@ a card.
|
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
|
-
Install, sign in, then
|
|
9
|
+
Install, sign in, then scan this machine:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
curl -fsSL https://hacklab.so/install | sh
|
|
13
13
|
hacklab login
|
|
14
|
-
hacklab
|
|
14
|
+
hacklab scan
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
The script checks for Node 20+ and installs the CLI globally — that's all it
|
|
18
18
|
does. After it, `hacklab` is a real command on your PATH; `login` creates or
|
|
19
|
-
restores your account and `
|
|
20
|
-
|
|
19
|
+
restores your account and `scan` uploads this machine's usage, shares the card,
|
|
20
|
+
and turns on the background daemon. If you already have Node 20 or newer
|
|
21
|
+
(including a version manager), you can skip the script:
|
|
21
22
|
|
|
22
23
|
```bash
|
|
23
24
|
npm i -g hacklab@latest
|
|
24
25
|
hacklab login
|
|
25
|
-
hacklab
|
|
26
|
+
hacklab scan
|
|
26
27
|
```
|
|
27
28
|
|
|
28
29
|
### Windows
|
|
29
30
|
|
|
30
31
|
On native Windows (PowerShell), use the `.ps1` installer instead — it checks
|
|
31
|
-
for Node 20+ and installs the CLI globally, then points you at `hacklab login
|
|
32
|
+
for Node 20+ and installs the CLI globally, then points you at `hacklab login`
|
|
33
|
+
and `hacklab scan`:
|
|
32
34
|
|
|
33
35
|
```powershell
|
|
34
36
|
irm https://hacklab.so/install.ps1 | iex
|
|
@@ -54,18 +56,23 @@ most once a day); update with `npm i -g hacklab@latest`.
|
|
|
54
56
|
## Scan
|
|
55
57
|
|
|
56
58
|
```
|
|
57
|
-
scan
|
|
59
|
+
login → scan this machine → upload → card → share on X → daemon on
|
|
58
60
|
```
|
|
59
61
|
|
|
60
|
-
`hacklab scan` reads
|
|
61
|
-
OpenClaw, Hermes, OpenCode, and Grok Build
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
`hacklab scan` requires `hacklab login`. It reads local AI token usage from
|
|
63
|
+
Claude Code, Codex, Cursor, OpenClaw, Hermes, OpenCode, and Grok Build, uploads
|
|
64
|
+
it to your profile, and draws the card from the live account (real rank, belt,
|
|
65
|
+
streak — not a local postcard). Then it asks whether to share that card on X.
|
|
66
|
+
A successful scan summons the daemon so the card stays current; `hacklab scan
|
|
67
|
+
--no-daemon` skips the schedule, and `hacklab daemon off` tears it down.
|
|
68
|
+
Skip the whole command if this computer isn't yours — it would upload that
|
|
69
|
+
machine's usage to your profile. Cursor users with no API key are offered one
|
|
70
|
+
(local Cursor data is only an estimate).
|
|
65
71
|
|
|
66
72
|
## Commands
|
|
67
73
|
|
|
68
|
-
- `hacklab scan` — scan
|
|
74
|
+
- `hacklab scan` — scan this machine, upload to your profile, share the card.
|
|
75
|
+
Requires login. Summons the daemon afterwards (`--no-daemon` to skip).
|
|
69
76
|
- `hacklab sync` — re-scan local AI usage and sync it to your profile.
|
|
70
77
|
- `hacklab daemon` — summon the daemon: two OS-native background jobs (launchd on
|
|
71
78
|
macOS, systemd user timers on Linux, Task Scheduler tasks on Windows) so your
|
|
@@ -150,10 +157,12 @@ terminal and asks whether to share it on X.
|
|
|
150
157
|
- `hacklab profile` — view and edit your own profile. Bare `profile` (or
|
|
151
158
|
`profile view`) shows it; `profile edit` is an org-style autosave editor;
|
|
152
159
|
`profile set <field> <value>` writes one field (`--clear` unsets, handles like
|
|
153
|
-
`x mattbratos` become full links); `profile set
|
|
154
|
-
|
|
155
|
-
profile.
|
|
156
|
-
|
|
160
|
+
`x mattbratos` become full links); `profile set https://x.com/mattbratos`
|
|
161
|
+
picks the field from the host (x, youtube, instagram, goodreads); `profile
|
|
162
|
+
set readme --file profile.md` writes a long Markdown README without shell
|
|
163
|
+
quoting; `profile apply profile.yaml` writes many fields in one shot. Fields:
|
|
164
|
+
`name`, `bio`, `readme`, `website`, `blog`, `x`, `youtube`, `instagram`,
|
|
165
|
+
`goodreads`, `rss`, `open-to-work`.
|
|
157
166
|
Add `--json` to `view`/`set`/`apply` for machine-readable output.
|
|
158
167
|
- `hacklab hacker <username> --json` — read the rich agent profile including
|
|
159
168
|
links, counts, skills, recent projects, essays, and drops.
|
package/dist/cli.js
CHANGED
|
@@ -90,14 +90,15 @@ const HELP_GROUPS = [
|
|
|
90
90
|
title: 'game',
|
|
91
91
|
rows: [
|
|
92
92
|
{ label: 'rules', summary: 'understand how the ranking works' },
|
|
93
|
-
{ label: 'scan', summary: 'scan
|
|
93
|
+
{ label: 'scan', summary: 'scan this machine and share the card' },
|
|
94
94
|
{ label: 'sync', summary: 'upload local AI usage to your profile' },
|
|
95
95
|
],
|
|
96
96
|
},
|
|
97
97
|
{
|
|
98
98
|
title: 'posting',
|
|
99
99
|
rows: [
|
|
100
|
-
{ label: 'drop <message>', summary: 'post
|
|
100
|
+
{ label: 'drop <message>', summary: 'post a drop' },
|
|
101
|
+
{ label: 'drops', summary: 'your drops' },
|
|
101
102
|
{ label: 'project', summary: 'add a project to your profile' },
|
|
102
103
|
{ label: 'essay', summary: 'post and manage essays' },
|
|
103
104
|
],
|
|
@@ -125,10 +126,6 @@ const HELP_GROUPS = [
|
|
|
125
126
|
label: 'rtfm <topic>',
|
|
126
127
|
summary: 'print the manual: exact commands, prereqs, done-when criteria',
|
|
127
128
|
},
|
|
128
|
-
{
|
|
129
|
-
label: 'wtf',
|
|
130
|
-
summary: 'what hacklab is and how to use this cli (alias: rtfm wtf)',
|
|
131
|
-
},
|
|
132
129
|
],
|
|
133
130
|
},
|
|
134
131
|
{
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `hacklab drops` — the feed. Prints every drop on the caller's profile, then
|
|
3
|
+
* the tab URL. `--json` is the list. Looking up someone else is not this
|
|
4
|
+
* command (`hacklab hacker <user>` already includes recent drops).
|
|
5
|
+
*/
|
|
6
|
+
export declare function drops(args: string[]): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=drops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drops.d.ts","sourceRoot":"","sources":["../../src/commands/drops.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEzD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { emitJsonError, requireSession } from '../api-client.js';
|
|
2
|
+
import { agentProfilePath } from '../dossier.js';
|
|
3
|
+
import { resolveAppUrl } from '../session.js';
|
|
4
|
+
import { dim, error, link, stripControl } from '../ui.js';
|
|
5
|
+
/**
|
|
6
|
+
* `hacklab drops` — the feed. Prints every drop on the caller's profile, then
|
|
7
|
+
* the tab URL. `--json` is the list. Looking up someone else is not this
|
|
8
|
+
* command (`hacklab hacker <user>` already includes recent drops).
|
|
9
|
+
*/
|
|
10
|
+
export async function drops(args) {
|
|
11
|
+
const json = args.includes('--json');
|
|
12
|
+
const session = await requireSession(json);
|
|
13
|
+
const handle = session.handle;
|
|
14
|
+
if (!handle) {
|
|
15
|
+
const message = 'claim a username first with `hacklab login`';
|
|
16
|
+
if (json)
|
|
17
|
+
emitJsonError('no_handle', message);
|
|
18
|
+
error('no drops yet — you have not claimed a username');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
const feedUrl = `${resolveAppUrl(session).replace(/\/$/, '')}/${handle}?tab=drops`;
|
|
22
|
+
let res;
|
|
23
|
+
try {
|
|
24
|
+
res = await fetch(`${resolveAppUrl(session)}${agentProfilePath(handle)}`, {
|
|
25
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
if (json)
|
|
31
|
+
emitJsonError('network', `couldn't reach hacklab: ${message}`);
|
|
32
|
+
error(`couldn't reach hacklab: ${message}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (!res.ok) {
|
|
36
|
+
const data = await res.json().catch(() => null);
|
|
37
|
+
if (json)
|
|
38
|
+
emitJsonError('request_failed', data?.error ?? `failed (${res.status})`);
|
|
39
|
+
error(data?.error ?? `failed (${res.status})`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const body = (await res.json().catch(() => null));
|
|
43
|
+
const items = [];
|
|
44
|
+
for (const raw of body?.hacker?.recent?.drops ?? []) {
|
|
45
|
+
if (typeof raw?.text === 'string' && typeof raw.createdAt === 'string') {
|
|
46
|
+
items.push({ text: raw.text, createdAt: raw.createdAt });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (json) {
|
|
50
|
+
console.log(JSON.stringify({ schemaVersion: 1, drops: items, url: feedUrl }, null, 2));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (items.length === 0) {
|
|
54
|
+
console.log('nothing yet');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
for (const item of items) {
|
|
58
|
+
console.log(`${dim(item.createdAt.slice(0, 10))} ${stripControl(item.text)}`);
|
|
59
|
+
}
|
|
60
|
+
console.log('');
|
|
61
|
+
console.log(link(feedUrl));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=drops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drops.js","sourceRoot":"","sources":["../../src/commands/drops.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hacker.d.ts","sourceRoot":"","sources":["../../src/commands/hacker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hacker.d.ts","sourceRoot":"","sources":["../../src/commands/hacker.ts"],"names":[],"mappings":"AAwBA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C1D"}
|
package/dist/commands/hacker.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { apiErrorMessage, emitJsonError, requireSession, } from '../api-client.js';
|
|
2
|
-
import {
|
|
2
|
+
import { agentProfilePath, renderDossier, } from '../dossier.js';
|
|
3
|
+
import { resolveAppUrl } from '../session.js';
|
|
3
4
|
import { fetchApi } from '../sync.js';
|
|
4
5
|
import { dim, error, info } from '../ui.js';
|
|
5
|
-
// `hacklab hacker <username>` —
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// the mirror.
|
|
6
|
+
// `hacklab hacker <username>` — look someone up. Humans get the same dossier
|
|
7
|
+
// as `hacklab profile`; `--json` is the agent envelope. Writing fields is
|
|
8
|
+
// still `hacklab profile set`.
|
|
9
9
|
function usage() {
|
|
10
10
|
error('usage: hacklab hacker <username>');
|
|
11
11
|
info(` hacklab hacker ${dim('<username> [--json]')}`);
|
|
@@ -22,11 +22,11 @@ export async function hacker(args) {
|
|
|
22
22
|
const session = await requireSession(json);
|
|
23
23
|
let res;
|
|
24
24
|
try {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
res = await fetchApi(session, agentProfilePath(handle), {
|
|
26
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
27
|
+
});
|
|
27
28
|
}
|
|
28
29
|
catch (err) {
|
|
29
|
-
// fetchApi rethrows a friendly "couldn't reach hacklab" message.
|
|
30
30
|
const message = err instanceof Error ? err.message : String(err);
|
|
31
31
|
if (json)
|
|
32
32
|
return emitJsonError('network', message);
|
|
@@ -46,16 +46,15 @@ export async function hacker(args) {
|
|
|
46
46
|
console.log(JSON.stringify(body, null, 2));
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
const self = !!session.handle && session.handle.toLowerCase() === handle.toLowerCase();
|
|
50
|
+
console.log(renderDossier(body.hacker, {
|
|
51
|
+
self,
|
|
52
|
+
appUrl: resolveAppUrl(session),
|
|
53
|
+
}).join('\n'));
|
|
53
54
|
}
|
|
54
|
-
/** Non-200 handling. In --json mode, relay the server's error envelope verbatim. */
|
|
55
55
|
async function handleError(res, handle, json, session) {
|
|
56
56
|
const body = (await res.json().catch(() => null));
|
|
57
57
|
if (json) {
|
|
58
|
-
// The server already returns {schemaVersion, error:{code,message}}; relay it.
|
|
59
58
|
console.log(JSON.stringify(body ?? {
|
|
60
59
|
schemaVersion: 1,
|
|
61
60
|
error: { code: 'error', message: `failed (${res.status})` },
|
|
@@ -72,7 +71,6 @@ async function handleError(res, handle, json, session) {
|
|
|
72
71
|
error(apiErrorMessage(res.status, body, session));
|
|
73
72
|
process.exit(1);
|
|
74
73
|
}
|
|
75
|
-
/** Best-effort near-match from the public search endpoint. Never throws. */
|
|
76
74
|
async function nearestHandle(session, handle) {
|
|
77
75
|
try {
|
|
78
76
|
const res = await fetchApi(session, `/api/hackers/search?q=${encodeURIComponent(handle)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hacker.js","sourceRoot":"","sources":["../../src/commands/hacker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"hacker.js","sourceRoot":"","sources":["../../src/commands/hacker.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,10 @@ export type ProfileField = {
|
|
|
5
5
|
/** CLI-facing name (`hacklab profile set <name> …`). */
|
|
6
6
|
name: string;
|
|
7
7
|
kind: ProfileFieldKind;
|
|
8
|
-
/** handle kind:
|
|
8
|
+
/** handle kind: canonical site origin, with trailing slash. */
|
|
9
9
|
base?: string;
|
|
10
|
+
/** handle kind: path put between `base` and a bare handle (`@`, `user/show/`). */
|
|
11
|
+
handlePath?: string;
|
|
10
12
|
/** handle kind: recognized site prefixes to strip before rebuilding. */
|
|
11
13
|
strip?: RegExp;
|
|
12
14
|
hint: string;
|
|
@@ -22,6 +24,7 @@ type Profile = {
|
|
|
22
24
|
xUrl: string | null;
|
|
23
25
|
youtubeUrl: string | null;
|
|
24
26
|
instagramUrl: string | null;
|
|
27
|
+
goodreadsUrl: string | null;
|
|
25
28
|
rssFeedUrl: string | null;
|
|
26
29
|
githubUsername: string | null;
|
|
27
30
|
openToWork: boolean;
|
|
@@ -38,7 +41,9 @@ export type NormalizedValue = {
|
|
|
38
41
|
* Shape one raw CLI string into the value the API expects. Empty clears the
|
|
39
42
|
* field. URLs get https:// prepended when the scheme is missing; handle fields
|
|
40
43
|
* additionally accept a bare handle (`@mattbratos`, `mattbratos`) or a pasted
|
|
41
|
-
* profile URL and rebuild the canonical link.
|
|
44
|
+
* profile URL and rebuild the canonical link. A pasted URL on the canonical
|
|
45
|
+
* host keeps its path (`x.com/me/status/1`, `youtube.com/channel/UC…`) — only
|
|
46
|
+
* a bare handle gets the handle path. Real validation stays server-side.
|
|
42
47
|
*/
|
|
43
48
|
export declare function normalizeFieldValue(field: ProfileField, raw: string): NormalizedValue;
|
|
44
49
|
/**
|
|
@@ -56,6 +61,12 @@ export declare function parseProfileDocument(doc: unknown): {
|
|
|
56
61
|
/** Value column for human output. */
|
|
57
62
|
export declare function displayValue(field: ProfileField, value: unknown): string;
|
|
58
63
|
export declare function renderProfile(profile: Profile, appUrl: string): string[];
|
|
64
|
+
/**
|
|
65
|
+
* `hacklab profile set https://x.com/mattbratos` — no field named, so pick it
|
|
66
|
+
* from the host. Only handle fields are inferable: website, blog, and rss all
|
|
67
|
+
* live on your own domain, so a bare URL there stays explicit.
|
|
68
|
+
*/
|
|
69
|
+
export declare function inferFieldFromUrl(token: string): ProfileField | null;
|
|
59
70
|
export declare function profile(args: string[]): Promise<void>;
|
|
60
71
|
export {};
|
|
61
72
|
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,UAAU,GACV,KAAK,GACL,QAAQ,GACR,SAAS,CAAA;AAEb,MAAM,MAAM,YAAY,GAAG;IACzB,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,gBAAgB,CAAA;IACtB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAKD,eAAO,MAAM,cAAc,EAAE,YAAY,EAyDxC,CAAA;AAID,KAAK,OAAO,GAAG;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAID,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAahC;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,GACV,eAAe,CAkCjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAC7C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAA;CAAE,GAC7D;IACE,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;CACd,CAsCJ;AAED,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAKxE;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAsCxE;AAkDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAMpE;AAmYD,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B3D"}
|