@vosjs/cli 0.85.0 → 0.87.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 +7 -6
- package/dist/{assetManifest-32VI7OK7.js → assetManifest-UUKFWTLO.js} +3 -3
- package/dist/{chunk-M5ZBQFPG.js → chunk-2UFNOKVY.js} +2 -2
- package/dist/{chunk-PF2NEZYU.js → chunk-7A3PZARL.js} +10 -3
- package/dist/{chunk-PF2NEZYU.js.map → chunk-7A3PZARL.js.map} +1 -1
- package/dist/{chunk-NJBUBXFE.js → chunk-ACWV3Y6Y.js} +349 -84
- package/dist/chunk-ACWV3Y6Y.js.map +1 -0
- package/dist/{chunk-Q47FUCYN.js → chunk-EXDMMAPT.js} +2 -2
- package/dist/{chunk-EPSYIF2S.js → chunk-PEW5GIZF.js} +361 -58
- package/dist/chunk-PEW5GIZF.js.map +1 -0
- package/dist/cli.js +7 -7
- package/dist/index.d.ts +42 -6
- package/dist/index.js +5 -5
- package/dist/manifest-OLVFUZTW.js +8 -0
- package/dist/{run-XFKADM6I.js → run-OT54QJ4T.js} +5 -5
- package/package.json +2 -2
- package/skills/VERSION +1 -1
- package/skills/launch-kit/SKILL.md +6 -2
- package/skills/product-video/SKILL.md +13 -3
- package/skills/vos-cut/SKILL.md +6 -2
- package/skills/vos-score/SKILL.md +15 -5
- package/dist/chunk-EPSYIF2S.js.map +0 -1
- package/dist/chunk-NJBUBXFE.js.map +0 -1
- package/dist/manifest-GPE4CVDR.js +0 -8
- /package/dist/{assetManifest-32VI7OK7.js.map → assetManifest-UUKFWTLO.js.map} +0 -0
- /package/dist/{chunk-M5ZBQFPG.js.map → chunk-2UFNOKVY.js.map} +0 -0
- /package/dist/{chunk-Q47FUCYN.js.map → chunk-EXDMMAPT.js.map} +0 -0
- /package/dist/{manifest-GPE4CVDR.js.map → manifest-OLVFUZTW.js.map} +0 -0
- /package/dist/{run-XFKADM6I.js.map → run-OT54QJ4T.js.map} +0 -0
package/README.md
CHANGED
|
@@ -39,8 +39,9 @@ Node 18 or newer and a Chromium-family browser. A system Chrome is used when pre
|
|
|
39
39
|
```bash
|
|
40
40
|
vos setup [--agent claude,cursor,codex,copilot|all] [--global] [--no-skills] [--skills-from-catalog] [--no-rules] [--no-browser] [--url <dev server>]
|
|
41
41
|
vos doctor [--url <dev server>] # what is ready, in words; exit 3 when no browser
|
|
42
|
-
vos whoami # the key's name and
|
|
43
|
-
vos
|
|
42
|
+
vos whoami # the account in use, its key's name, and every other account stored; never a key
|
|
43
|
+
vos switch [<handle>] # use another stored account (with two stored, the other one)
|
|
44
|
+
vos logout [<handle>] [--all] # forget the account in use, a named one, or every stored credential
|
|
44
45
|
```
|
|
45
46
|
|
|
46
47
|
`vos setup` detects the agents present by their directories (`.claude/`, `.cursor/`, `.codex/` or `.agents/`, `.github/copilot`; the home forms under `--global`), installs the skills into them from the copy of the catalog this package ships (`skills/`, the catalog at the tag this release was cut from; `--skills-from-catalog` fetches that same tag through skills.sh instead, with the bundled copy as the fallback when it cannot be reached), finds a browser in the recorder's own order or installs Chromium, writes one block between `<!-- vos:begin -->` and `<!-- vos:end -->` markers into `AGENTS.md` (or `CLAUDE.md` when only that exists), so a second run replaces its own text and never yours, and ends with `doctor`. These four verbs print NDJSON whenever stdout is not a TTY, and every `done` event carries `next_step`.
|
|
@@ -299,7 +300,7 @@ take/
|
|
|
299
300
|
join.json a joined take's inputs: each one's path, footage sha256 and media id, read by `vos join --keep-edits`
|
|
300
301
|
outputs/ the files `download` steps kept, listed in meta.json's outputs
|
|
301
302
|
page-sound/ the sound the page played during the take, listed in meta.json's media
|
|
302
|
-
vos.json hosted tracking (vos id + base version), written by push, fetch and pull
|
|
303
|
+
vos.json hosted tracking (vos id + base version, the origin and the account it belongs to), written by push, fetch and pull
|
|
303
304
|
stills/ `vos frames` output + stills.json
|
|
304
305
|
digest/ `vos digest` output: digest.json, <id>.full.png, <id>.crop.png, sheet.png
|
|
305
306
|
kit/ `vos deliver` output: kit.json + the cuts
|
|
@@ -531,10 +532,10 @@ vos brand https://your.app --out BRAND.md # the brand kit,
|
|
|
531
532
|
|
|
532
533
|
## The vos.so loop
|
|
533
534
|
|
|
534
|
-
Everything that runs on your machine is open source; [vos.so](https://vos.so) is the hosted platform: a studio for the human half of an edit, version history with a typed changelog, a shelf of projects and recipes. All vos.so traffic lives behind one client: one origin (`VOS_ORIGIN`, default `https://vos.so`; `--origin` per call), one credential ladder (`--key`, then `VOS_API_KEY`, then `~/.config/vos/credentials
|
|
535
|
+
Everything that runs on your machine is open source; [vos.so](https://vos.so) is the hosted platform: a studio for the human half of an edit, version history with a typed changelog, a shelf of projects and recipes. All vos.so traffic lives behind one client: one origin (`VOS_ORIGIN`, default `https://vos.so`; `--origin` per call), one credential ladder (`--key`, then `--account <handle>`, then `VOS_API_KEY`, then `VOS_ACCOUNT`, then the account in use at `~/.config/vos/credentials`; a `vos_rg_` remix grant is just a key), one tracking file (`vos.json` beside the artifact). **A person is many accounts** (themselves, and every organization they act for), so `vos login` is additive: the approval page asks which account the terminal is signed in as, every account signed in is stored by name under `~/.config/vos/accounts/<host>/<id>`, the one in use is copied to `~/.config/vos/credentials` (its first line is still the key, for every older reader), `vos switch [<handle>]` changes which, `vos whoami` says which is in use and what else is stored, and `--account <handle>` or `VOS_ACCOUNT` picks a stored one for a command without switching; a name nothing is stored under is refused in words, never answered with another account. A DIRECTORY remembers whose work it is: `vos.json` carries the `origin` and the `account` of its last push or fetch, and a verb on it resolves the stored credential for that account before the active one, so switching is rarely needed; a directory whose account is not stored here says so before any request. A push to someone else's project address (`--folder <handle>/<slug>`) asks before starting your own copy of it (`--yes` headless). A key acts for exactly the account it belongs to, so switching is choosing a key. Credentials are never printed, and a stored one is sent only to the origin it was minted for (a file written before the origin line is `https://vos.so`'s): a command aimed at another origin sends no key and says so, so pass `--key` or `VOS_API_KEY` for it, or `vos login --origin <it>`. Keys can never publish: pushes are private, and humans publish on vos.so.
|
|
535
536
|
|
|
536
537
|
```bash
|
|
537
|
-
vos login [--key <k>] [--label <name>] [--no-browser] # browser sign-in: a code and a vos.so/cli/auth URL, a human approves, the key stores itself
|
|
538
|
+
vos login [--key <k>] [--label <name>] [--no-browser] # browser sign-in: a code and a vos.so/cli/auth URL, a human approves (as themselves or an org), the key stores itself beside the ones already stored
|
|
538
539
|
vos login --handoff https://vos.so/h/<token> # the setup link a signed-in person's line carries: exchanged once for a key, no click
|
|
539
540
|
vos fetch <vosId|url> [--out <slug>] [--media] # a program writes config.json + vos.json; a take writes doc.json (+ the recording with --media)
|
|
540
541
|
vos check bright-loop/config.json # full local validation
|
|
@@ -593,7 +594,7 @@ vos push /tmp/take --label "$TAG launch" --yes --json # VOS_API_KEY as a r
|
|
|
593
594
|
- **`--max-duration <s>`** on `record` and `create` defaults to the hosted recording cap, read live from `GET /api/limits` (2 s, fail-open to 30 min when the origin is unreachable): the capture stops there and the done event says so. Cut the flow rather than raising the cap; the platform refuses a longer take.
|
|
594
595
|
- **`create`** is the one-shot verb: record, auto-plan and render in one command and one browser session. The take directory still lands on disk, so the full loop (frames, edit `doc.json`, re-render) stays open afterwards.
|
|
595
596
|
- **`vos validate <thing>`** takes an `actions.json`, a take directory, a program directory (`config.json`, plus its program document when present), or a `kit.json`; exit 1 on any problem.
|
|
596
|
-
- **Environment.** `VOS_ORIGIN` (the platform, and the studio `vos open` opens), `VOS_API_KEY
|
|
597
|
+
- **Environment.** `VOS_ORIGIN` (the platform, and the studio `vos open` opens), `VOS_API_KEY` (a key, as a CI secret; it outranks the store), `VOS_ACCOUNT` (a stored account by handle, for a shell or a runner that never holds a key), `VOS_BROWSER_PATH`, `VOS_CLIENT` (the client string a push self-reports; unset, a push names the coding agent that spawned the CLI, read from its environment the way `@vercel/detect-agent` reads it, e.g. `claude-code vos-cli`, else `vos-cli`).
|
|
597
598
|
|
|
598
599
|
## Programmatic use
|
|
599
600
|
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
localManifestRefs,
|
|
5
5
|
pullManifest,
|
|
6
6
|
uploadManifest
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-2UFNOKVY.js";
|
|
8
|
+
import "./chunk-PEW5GIZF.js";
|
|
9
9
|
export {
|
|
10
10
|
hostedLiteralWarnings,
|
|
11
11
|
localManifestRefs,
|
|
12
12
|
pullManifest,
|
|
13
13
|
uploadManifest
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=assetManifest-
|
|
15
|
+
//# sourceMappingURL=assetManifest-UUKFWTLO.js.map
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
writeFileSafe,
|
|
15
15
|
writeFileSafeSync,
|
|
16
16
|
writeSyncState
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-PEW5GIZF.js";
|
|
18
18
|
|
|
19
19
|
// src/plugin/assetManifest.ts
|
|
20
20
|
import { existsSync as existsSync4, readFileSync, realpathSync, rmSync } from "fs";
|
|
@@ -958,4 +958,4 @@ export {
|
|
|
958
958
|
pullManifest,
|
|
959
959
|
hostedLiteralWarnings
|
|
960
960
|
};
|
|
961
|
-
//# sourceMappingURL=chunk-
|
|
961
|
+
//# sourceMappingURL=chunk-2UFNOKVY.js.map
|
|
@@ -128,13 +128,20 @@ var manifest = {
|
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
name: "whoami",
|
|
131
|
-
summary: "the
|
|
131
|
+
summary: "the account in use and every other one stored for the origin, never a key"
|
|
132
132
|
},
|
|
133
|
-
{
|
|
133
|
+
{
|
|
134
|
+
name: "switch",
|
|
135
|
+
summary: "use another stored account (vos login once per account stores them all)"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "logout",
|
|
139
|
+
summary: "forget the account in use, a named one (vos logout <handle>), or all (--all)"
|
|
140
|
+
}
|
|
134
141
|
]
|
|
135
142
|
};
|
|
136
143
|
|
|
137
144
|
export {
|
|
138
145
|
manifest
|
|
139
146
|
};
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
//# sourceMappingURL=chunk-7A3PZARL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin/manifest.ts"],"sourcesContent":["/**\n * The verb manifest of the take pipeline and the vos.so verbs — what\n * `vos help` lists under the engine verbs. It kept the shape a separately\n * installed plugin once handed the host (name + host range), so a script\n * reading it keeps working.\n */\nexport interface PluginVerb {\n name: string\n summary: string\n}\n\nexport interface PluginManifest {\n name: string\n /** Host versions this plugin speaks the run(argv) contract with. */\n hostRange: string\n verbs: PluginVerb[]\n}\n\nexport const manifest: PluginManifest = {\n name: '@vosjs/cli',\n hostRange: '>=0.9.0',\n verbs: [\n {\n name: 'create',\n summary: 'record + auto-plan + render, one command (--strict)',\n },\n {\n name: 'record',\n summary: 'drive actions.json into a take (screencast + cursor track)',\n },\n {\n name: 'look',\n summary:\n 'see a page before scripting it (signed in, like record): a screenshot + every control in view with one proposed stable selector',\n },\n {\n name: 'plan',\n summary:\n 'plan zoom/cursor effects into doc.json (wand contract); --reuse re-times a previous cut onto a re-recording',\n },\n {\n name: 'render',\n summary: 'render a take directory (engine configs render in the host)',\n },\n {\n name: 'frames',\n summary:\n 'PNG stills at output times / zoom apexes (each checked against its zoom-off twin) / moments / exact sizes',\n },\n {\n name: 'check-video',\n summary:\n 'check a rendered file: facts, scene changes, loudness, first and last frames',\n },\n {\n name: 'deliver',\n summary:\n 'render a take to release video destinations (YouTube, X, Shorts/LinkedIn, GitHub) + verified kit.json',\n },\n {\n name: 'digest',\n summary:\n 'see a recording before cutting it: moments (clicks, typing, scrolls, idle, scenes) + footage frames + crops, in doc units',\n },\n { name: 'open', summary: 'serve the take into the vos.so studio' },\n {\n name: 'validate',\n summary:\n 'lint actions.json, a take dir (doc.json semantics), or re-measure a kit.json against the channel specs',\n },\n {\n name: 'actions',\n summary:\n 'from-agent-browser: turn an agent-browser walk (steps.jsonl) into actions.json; what cannot follow is named',\n },\n {\n name: 'ingest',\n summary:\n 'a take from a recording someone else made, with its cursor track from a trace beside it (Playwright trace.zip, stamped records, CSV); without one nothing is planned',\n },\n {\n name: 'join',\n summary:\n 'several takes and video files as one take: each next input a media, its spans tagged, its layers moved to where it starts; --captions anchors every step caption',\n },\n {\n name: 'score',\n summary:\n \"a music track as the film's score, its strongest swell landed on a step or a second (--dry-run prints the loudness envelope and the plan)\",\n },\n {\n name: 'audio',\n summary:\n 'measure: every audio clip’s loudness (integrated LUFS, sample peak) written beside it, which a clip’s normalize target plays it to',\n },\n {\n name: 'music',\n summary:\n 'ls: the library one line per track (tempo, vocals, loops, the sentence); pick: the beds that fit this film, best first, with reasons and the vos score line that places each',\n },\n {\n name: 'port',\n summary:\n 'bring a page, a HyperFrames or a Remotion piece: inventory (its words, colours, faces, media, scenes) then scaffold (a data-first program.mjs to translate the motion into)',\n },\n {\n name: 'build',\n summary:\n 'program.mjs (real functions) → config.json, refusing what cannot run on its own (module-scope reads, syntax the page cannot parse, non-JSON data)',\n },\n {\n name: 'compare',\n summary:\n \"a program against the source's own render: per-frame SSIM and source | vos | difference sheets; exits 1 when any frame is under the threshold\",\n },\n {\n name: 'brand',\n summary:\n \"write a product's BRAND.md, witnessed: /design.md, /llms.txt, then the page (palette, faces, marks, the avoid list)\",\n },\n {\n name: 'fetch',\n summary: 'download a hosted program: config.json + vos.json tracking',\n },\n {\n name: 'push',\n summary: 'push a config.json or take to vos.so (private; versioned)',\n },\n {\n name: 'duplicate',\n summary:\n 'a private sibling of your OWN vos (someone else\\u2019s is remixed: fetch + push --remix-of)',\n },\n {\n name: 'pull',\n summary:\n 'sync what changed on vos.so since your base (--media brings a take’s footage home)',\n },\n {\n name: 'folder',\n summary:\n 'list/create/pull folders, move voses and assets into them (pull = the context package on disk)',\n },\n {\n name: 'asset',\n summary:\n 'your files: push or import one, list them (assets ls), see storage (assets usage) and what uses a file (assets why)',\n },\n {\n name: 'recipe',\n summary:\n 'push a recipe .md into a folder, or replace one in place (prior body kept)',\n },\n {\n name: 'login',\n summary: 'sign in via the browser (or --key); stores a content key',\n },\n {\n name: 'setup',\n summary:\n 'ready this machine: the vos skills into your agent, a browser, one rules block, then doctor',\n },\n {\n name: 'doctor',\n summary:\n 'what is ready, in words: node, browser, ffmpeg, skills, a credential (never printed), the dev server',\n },\n {\n name: 'whoami',\n summary
|
|
1
|
+
{"version":3,"sources":["../src/plugin/manifest.ts"],"sourcesContent":["/**\n * The verb manifest of the take pipeline and the vos.so verbs — what\n * `vos help` lists under the engine verbs. It kept the shape a separately\n * installed plugin once handed the host (name + host range), so a script\n * reading it keeps working.\n */\nexport interface PluginVerb {\n name: string\n summary: string\n}\n\nexport interface PluginManifest {\n name: string\n /** Host versions this plugin speaks the run(argv) contract with. */\n hostRange: string\n verbs: PluginVerb[]\n}\n\nexport const manifest: PluginManifest = {\n name: '@vosjs/cli',\n hostRange: '>=0.9.0',\n verbs: [\n {\n name: 'create',\n summary: 'record + auto-plan + render, one command (--strict)',\n },\n {\n name: 'record',\n summary: 'drive actions.json into a take (screencast + cursor track)',\n },\n {\n name: 'look',\n summary:\n 'see a page before scripting it (signed in, like record): a screenshot + every control in view with one proposed stable selector',\n },\n {\n name: 'plan',\n summary:\n 'plan zoom/cursor effects into doc.json (wand contract); --reuse re-times a previous cut onto a re-recording',\n },\n {\n name: 'render',\n summary: 'render a take directory (engine configs render in the host)',\n },\n {\n name: 'frames',\n summary:\n 'PNG stills at output times / zoom apexes (each checked against its zoom-off twin) / moments / exact sizes',\n },\n {\n name: 'check-video',\n summary:\n 'check a rendered file: facts, scene changes, loudness, first and last frames',\n },\n {\n name: 'deliver',\n summary:\n 'render a take to release video destinations (YouTube, X, Shorts/LinkedIn, GitHub) + verified kit.json',\n },\n {\n name: 'digest',\n summary:\n 'see a recording before cutting it: moments (clicks, typing, scrolls, idle, scenes) + footage frames + crops, in doc units',\n },\n { name: 'open', summary: 'serve the take into the vos.so studio' },\n {\n name: 'validate',\n summary:\n 'lint actions.json, a take dir (doc.json semantics), or re-measure a kit.json against the channel specs',\n },\n {\n name: 'actions',\n summary:\n 'from-agent-browser: turn an agent-browser walk (steps.jsonl) into actions.json; what cannot follow is named',\n },\n {\n name: 'ingest',\n summary:\n 'a take from a recording someone else made, with its cursor track from a trace beside it (Playwright trace.zip, stamped records, CSV); without one nothing is planned',\n },\n {\n name: 'join',\n summary:\n 'several takes and video files as one take: each next input a media, its spans tagged, its layers moved to where it starts; --captions anchors every step caption',\n },\n {\n name: 'score',\n summary:\n \"a music track as the film's score, its strongest swell landed on a step or a second (--dry-run prints the loudness envelope and the plan)\",\n },\n {\n name: 'audio',\n summary:\n 'measure: every audio clip’s loudness (integrated LUFS, sample peak) written beside it, which a clip’s normalize target plays it to',\n },\n {\n name: 'music',\n summary:\n 'ls: the library one line per track (tempo, vocals, loops, the sentence); pick: the beds that fit this film, best first, with reasons and the vos score line that places each',\n },\n {\n name: 'port',\n summary:\n 'bring a page, a HyperFrames or a Remotion piece: inventory (its words, colours, faces, media, scenes) then scaffold (a data-first program.mjs to translate the motion into)',\n },\n {\n name: 'build',\n summary:\n 'program.mjs (real functions) → config.json, refusing what cannot run on its own (module-scope reads, syntax the page cannot parse, non-JSON data)',\n },\n {\n name: 'compare',\n summary:\n \"a program against the source's own render: per-frame SSIM and source | vos | difference sheets; exits 1 when any frame is under the threshold\",\n },\n {\n name: 'brand',\n summary:\n \"write a product's BRAND.md, witnessed: /design.md, /llms.txt, then the page (palette, faces, marks, the avoid list)\",\n },\n {\n name: 'fetch',\n summary: 'download a hosted program: config.json + vos.json tracking',\n },\n {\n name: 'push',\n summary: 'push a config.json or take to vos.so (private; versioned)',\n },\n {\n name: 'duplicate',\n summary:\n 'a private sibling of your OWN vos (someone else\\u2019s is remixed: fetch + push --remix-of)',\n },\n {\n name: 'pull',\n summary:\n 'sync what changed on vos.so since your base (--media brings a take’s footage home)',\n },\n {\n name: 'folder',\n summary:\n 'list/create/pull folders, move voses and assets into them (pull = the context package on disk)',\n },\n {\n name: 'asset',\n summary:\n 'your files: push or import one, list them (assets ls), see storage (assets usage) and what uses a file (assets why)',\n },\n {\n name: 'recipe',\n summary:\n 'push a recipe .md into a folder, or replace one in place (prior body kept)',\n },\n {\n name: 'login',\n summary: 'sign in via the browser (or --key); stores a content key',\n },\n {\n name: 'setup',\n summary:\n 'ready this machine: the vos skills into your agent, a browser, one rules block, then doctor',\n },\n {\n name: 'doctor',\n summary:\n 'what is ready, in words: node, browser, ffmpeg, skills, a credential (never printed), the dev server',\n },\n {\n name: 'whoami',\n summary:\n 'the account in use and every other one stored for the origin, never a key',\n },\n {\n name: 'switch',\n summary:\n 'use another stored account (vos login once per account stores them all)',\n },\n {\n name: 'logout',\n summary:\n 'forget the account in use, a named one (vos logout <handle>), or all (--all)',\n },\n ],\n}\n"],"mappings":";;;AAkBO,IAAM,WAA2B;AAAA,EACtC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA,EAAE,MAAM,QAAQ,SAAS,wCAAwC;AAAA,IACjE;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
|