@inquir/compute-cli 0.2.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.
Files changed (65) hide show
  1. package/README.md +133 -35
  2. package/dist/commands/apps.d.ts +42 -5
  3. package/dist/commands/apps.d.ts.map +1 -1
  4. package/dist/commands/apps.js +919 -45
  5. package/dist/commands/apps.js.map +1 -1
  6. package/dist/commands/deploy.d.ts +38 -0
  7. package/dist/commands/deploy.d.ts.map +1 -1
  8. package/dist/commands/deploy.js +165 -12
  9. package/dist/commands/deploy.js.map +1 -1
  10. package/dist/commands/doctor.js +2 -2
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +3 -0
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/login.d.ts.map +1 -1
  15. package/dist/commands/login.js +44 -13
  16. package/dist/commands/login.js.map +1 -1
  17. package/dist/commands/projects.d.ts +2 -0
  18. package/dist/commands/projects.d.ts.map +1 -0
  19. package/dist/commands/projects.js +98 -0
  20. package/dist/commands/projects.js.map +1 -0
  21. package/dist/index.js +3 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/utils/api.d.ts +45 -4
  24. package/dist/utils/api.d.ts.map +1 -1
  25. package/dist/utils/api.js +66 -5
  26. package/dist/utils/api.js.map +1 -1
  27. package/dist/utils/apps-presentation.d.ts +10 -0
  28. package/dist/utils/apps-presentation.d.ts.map +1 -1
  29. package/dist/utils/apps-presentation.js +27 -0
  30. package/dist/utils/apps-presentation.js.map +1 -1
  31. package/dist/utils/args.d.ts.map +1 -1
  32. package/dist/utils/args.js +8 -1
  33. package/dist/utils/args.js.map +1 -1
  34. package/dist/utils/assets.d.ts +48 -1
  35. package/dist/utils/assets.d.ts.map +1 -1
  36. package/dist/utils/assets.js +185 -7
  37. package/dist/utils/assets.js.map +1 -1
  38. package/dist/utils/auth.d.ts +9 -2
  39. package/dist/utils/auth.d.ts.map +1 -1
  40. package/dist/utils/auth.js +51 -11
  41. package/dist/utils/auth.js.map +1 -1
  42. package/dist/utils/context.d.ts.map +1 -1
  43. package/dist/utils/context.js +2 -0
  44. package/dist/utils/context.js.map +1 -1
  45. package/dist/utils/deploy-follow.d.ts +4 -3
  46. package/dist/utils/deploy-follow.d.ts.map +1 -1
  47. package/dist/utils/deploy-follow.js +76 -17
  48. package/dist/utils/deploy-follow.js.map +1 -1
  49. package/dist/utils/detect.d.ts +49 -1
  50. package/dist/utils/detect.d.ts.map +1 -1
  51. package/dist/utils/detect.js +153 -12
  52. package/dist/utils/detect.js.map +1 -1
  53. package/dist/utils/ensure-auth.d.ts.map +1 -1
  54. package/dist/utils/ensure-auth.js +6 -2
  55. package/dist/utils/ensure-auth.js.map +1 -1
  56. package/dist/utils/errors.d.ts.map +1 -1
  57. package/dist/utils/errors.js +11 -0
  58. package/dist/utils/errors.js.map +1 -1
  59. package/dist/utils/package-metadata.js +1 -1
  60. package/dist/utils/project-context.d.ts +17 -0
  61. package/dist/utils/project-context.d.ts.map +1 -0
  62. package/dist/utils/project-context.js +94 -0
  63. package/dist/utils/project-context.js.map +1 -0
  64. package/package.json +10 -7
  65. package/skill/SKILL.md +7 -0
package/README.md CHANGED
@@ -64,10 +64,24 @@ Other login modes:
64
64
  ```bash
65
65
  inquir login --browserless # print the URL + code instead of opening a browser
66
66
  inquir login --token <pat> # non-interactive (CI): use a PAT created in the dashboard
67
- inquir login --name "my CI" # label the device/token shown in the dashboard
68
- ```
69
-
70
- Create and revoke PATs from the dashboard under **API Keys → Personal Access
67
+ inquir login --name "my CI" # label the device/token shown in the dashboard
68
+ ```
69
+
70
+ Login stores the API URL together with the token. To keep credentials for another
71
+ API separately, use a named environment:
72
+
73
+ ```bash
74
+ inquir login --env staging --api-url https://staging.example.com --token <pat>
75
+ inquir whoami --env staging
76
+ ```
77
+
78
+ Changing a login's API or token clears its cached identity and workspace until
79
+ membership discovery succeeds. A previous workspace on the same API is restored
80
+ only if the new token can still access it. If discovery is temporarily unavailable,
81
+ the token remains saved and subsequent commands do not reuse the previous
82
+ account's stored workspace.
83
+
84
+ Create and revoke PATs from the dashboard under **API Keys → Personal Access
71
85
  Tokens**. To sign out and remove the stored token: `inquir logout`.
72
86
 
73
87
  > A PAT can deploy to **any workspace you belong to**. A workspace-scoped **API
@@ -92,7 +106,39 @@ inquir whoami --workspace acme-prod
92
106
  ```
93
107
 
94
108
  Under the hood, user-scoped credentials send an `X-Inquir-Workspace` header; the
95
- server verifies your membership before honoring it.
109
+ server verifies your membership before honoring it.
110
+
111
+ ## Application projects
112
+
113
+ Projects group long-lived container applications inside a workspace: web services,
114
+ APIs, databases, and workers. Serverless functions are managed separately and cannot
115
+ be added to these projects. A new application creates a project named after itself
116
+ unless you select an existing project:
117
+
118
+ ```bash
119
+ inquir projects list
120
+ inquir projects create shop
121
+ inquir projects use shop
122
+ inquir apps create api --port 3000
123
+ inquir apps create db --template postgres --project shop
124
+ inquir projects add shop existing-app
125
+ inquir projects current
126
+ inquir projects use --clear
127
+ ```
128
+
129
+ `projects use` saves the selection for the current directory, or the nearest
130
+ `inquir.config.json` root. Use `--cwd <path>` to select another directory. The
131
+ selection is kept locally under `~/.inquir/project-contexts` and isolated by API,
132
+ the actual workspace, and signed-in user (or API key). Switching workspace or
133
+ account therefore cannot silently reuse another context's project.
134
+
135
+ `apps create --project <id|slug>` overrides the selection for one command.
136
+ `projects use --clear` returns to automatic project creation. Selecting or adding
137
+ to a project accepts its ID or slug; adding an application accepts its ID or name.
138
+ All project commands support `--json`. Deploying an existing container application
139
+ with `apps deploy` keeps its project membership; use `projects add` to file an
140
+ existing application. This selection does not change the serverless `inquir deploy`
141
+ workflow or local source/configuration project discovery.
96
142
 
97
143
  ## Deploy a function (remote)
98
144
 
@@ -158,13 +204,13 @@ runtime adapter involved.
158
204
  - `inquir apps deploy <app> [--image <ref>]` - start a release and wait until it is healthy. Without `--image` the current directory (or `--dir`) is built from its Dockerfile first; `--build <id>` releases an existing build.
159
205
  - `inquir apps build <app> [--dir <path>] [--dockerfile <f>] [--context <dir>] [--build-arg K=V]` - build an image from source without releasing it.
160
206
  - `inquir apps builds <app>` - build history (`--cancel <buildId>` drops a queued build).
161
- - `inquir apps status <app>` - endpoints, hostnames and recent releases.
207
+ - `inquir apps status <app>` - endpoints (public and private), hostnames and recent releases. The `private:` lines are what another app in the workspace dials (`{slug}.apps.internal`, port per TCP service); they appear once the platform has verified the route.
162
208
  - `inquir apps logs <app|release|build> [--tail <n>]` - stream container (or build) logs.
163
209
  - `inquir apps promote <release>` - send production traffic to a release (needs a login, not an API key).
164
210
  - `inquir apps rollback <app>` - return production to the previous release.
165
211
  - `inquir apps stop <release>` - stop any release that is not serving production.
166
212
  - `inquir apps exec <app> -- <command>` - run a command inside the container (owner/admin login only — it can read every secret).
167
- - `inquir apps update <app> [--set K=V] [--port …] [--egress none|full] …` - change settings; applies to the next release.
213
+ - `inquir apps update <app> [--set K=V] [--port …] [--egress none|full] [--ingress private|public] …` - change settings; applies to the next release. `--ingress public` creates the generated public domain, `--ingress private` removes it (the private address is unaffected). New apps are private unless created with `--ingress public`.
168
214
  - `inquir apps domain <app> [hostname] [--verify|--remove]` - bind a custom hostname; publish the printed TXT record and point DNS at the platform, then `--verify`.
169
215
  - `inquir apps delete <app> --yes` - archive an application (stops every release, unbinds every hostname).
170
216
 
@@ -193,6 +239,26 @@ TCP port is reachable by anyone who can reach the host: the platform
193
239
  terminates no TLS and checks no credentials on raw TCP, so the service must
194
240
  authenticate its own clients.
195
241
 
242
+ **Databases**
243
+
244
+ - `inquir apps create <name> --template postgres|redis` - create a database: image, persistent volume, pinned public TCP port, generated password and its first release, in one command.
245
+ - `inquir apps connection-url <db>` - print the live connection URL, credentials included (it lands in your shell history).
246
+ - `inquir apps connect <db> <app>` - write that URL into another application's env as `DATABASE_URL` / `REDIS_URL` without it passing through your terminal; it applies on that application's next release.
247
+ - `inquir apps backups <app> [list|create|restore <id>|delete <id>]` - volume snapshots. `restore` **overwrites the volume** with the snapshot and stops the application while it runs, so it asks for confirmation — pass `--yes` in a script.
248
+
249
+ ```bash
250
+ inquir apps create mydb --template postgres
251
+ inquir apps connect mydb web # web gets DATABASE_URL on its next release
252
+ inquir apps backups mydb create # snapshot every volume, wait for it to settle
253
+ inquir apps backups mydb restore 3f9c1a2b --yes
254
+ ```
255
+
256
+ An application that declares a volume deploys by stopping its container before
257
+ starting the new one, so two containers never write the same data — expect a
258
+ short outage on every deploy. Backups are crash-consistent (the container is
259
+ paused while it is copied) and need an artifact store configured on the
260
+ deployment; without one the backup commands report that they are unavailable.
261
+
196
262
  **Staying up to date**
197
263
 
198
264
  The CLI keeps itself in step with the platform. On start it checks — at most
@@ -328,10 +394,23 @@ wins):
328
394
  - `INQUIR_ENV` — pick a named environment
329
395
  3. Selected environment in the config file
330
396
  4. Project link — `workspace` in the local `inquir.config.json` (set by `inquir use --local`); applies to the workspace only, below flags/env
331
- 5. Top-level config file values
332
- 6. Default `apiUrl` of `https://api.inquir.org` (override with env/config for local dev)
333
-
334
- When both a `token` (PAT) and an `apiKey` are present, the PAT wins. The active
397
+ 5. Top-level config file values (credentials and workspace only when the named environment uses the same API)
398
+ 6. Default `apiUrl` of `https://api.inquir.org` (override with env/config for local dev)
399
+
400
+ A named environment with its own different API does not inherit the default
401
+ token, API key, cached identity, or workspace. Partial profiles using the same API
402
+ can still inherit defaults. Explicit flags and environment variables keep the
403
+ precedence above. An unknown environment name fails before a remote command;
404
+ `inquir login --env <name>` can create it.
405
+
406
+ When login changes the default API, existing named profiles that inherited that
407
+ API and contain credentials, a workspace, or cached identity retain their previous
408
+ API binding. Their stored credentials are preserved. A profile that previously
409
+ inherited its credentials may need its own login after this change. Empty profiles
410
+ continue to inherit defaults. Changing a profile's API also removes its stored API
411
+ key, so logging out of the new PAT cannot reactivate a key from the previous API.
412
+
413
+ When both a `token` (PAT) and an `apiKey` are present, the PAT wins. The active
335
414
  `workspaceId` is only applied to user-scoped credentials (PAT/session); for a
336
415
  workspace-scoped API key it is ignored unless you pass `--workspace` explicitly.
337
416
 
@@ -376,35 +455,54 @@ failing check.
376
455
  ## Publishing to npm (maintainers)
377
456
 
378
457
  The CLI (`@inquir/compute-cli`) depends on the SDK (`@inquir/compute`), so the
379
- SDK must be published **first** at a version satisfying the CLI's dependency
380
- range (`dependencies["@inquir/compute"]`, currently `^0.1.0`).
458
+ SDK must be published **first** at a version satisfying the CLI's dependency
459
+ range (`dependencies["@inquir/compute"]`, `^0.3.0` for CLI 0.3.0). Set the lower
460
+ bound to the first SDK release containing every API the CLI imports. A workspace
461
+ build uses the local SDK and cannot prove that an older published SDK works.
462
+
463
+ New `inquir init` scaffolds inherit this SDK range and require Node.js 22+.
464
+ Existing `package.json` files are preserved; update their dependencies explicitly
465
+ when adopting a newer SDK.
381
466
 
382
467
  Prerequisites:
383
468
 
384
469
  - An npm account with publish access to the `@inquir` scope (create the org/scope on npmjs.com), then `npm login`.
385
470
  - Both packages declare `"publishConfig": { "access": "public" }`, so scoped packages publish publicly.
386
- - Each package's `prepublishOnly` rebuilds `dist/` automatically; only `dist/` ships (`files: ["dist"]`).
387
-
388
- Steps (run from the repo root):
389
-
390
- ```bash
391
- npm login
392
-
393
- # 1) Publish the SDK first — the CLI resolves it from the public registry.
394
- npm version <patch|minor|major> --workspace @inquir/compute
395
- npm publish --workspace @inquir/compute
396
-
397
- # 2) Publish the CLI. Ensure its @inquir/compute dependency range covers the
398
- # SDK version you just published, then:
399
- npm version <patch|minor|major> --workspace @inquir/compute-cli
400
- npm publish --workspace @inquir/compute-cli
401
- ```
402
-
403
- Tips:
404
-
405
- - Preview the exact tarball contents without publishing: `npm publish --dry-run --workspace @inquir/compute-cli`.
406
- - The published `bin` is `inquir` (from `dist/index.js`, which keeps its `#!/usr/bin/env node` shebang).
407
- - After publishing, anyone can install and deploy:
471
+ - Both packages build before packing or publishing from source. The SDK includes
472
+ `dist/`; the CLI includes `dist/` and its bundled `skill/`. npm also includes
473
+ package metadata and README files.
474
+ - Choose unused release versions, update the CLI's SDK dependency and the lockfile,
475
+ then run the SDK and CLI tests before preparing the release candidate.
476
+
477
+ Prepare the exact tarballs from the repo root:
478
+
479
+ ```bash
480
+ # Cleans and builds the SDK first, then the CLI.
481
+ npm run build --workspace @inquir/compute-cli
482
+ # Reuse the verified build instead of rebuilding during packing.
483
+ npm pack --workspace @inquir/compute --ignore-scripts
484
+ npm pack --workspace @inquir/compute-cli --ignore-scripts
485
+ ```
486
+
487
+ Install both tarballs into a temporary directory outside this repository. Check
488
+ `npm ls @inquir/compute`, `inquir --version`, `inquir --help`, project commands,
489
+ and a local TypeScript function run. Resolve packages from that installation,
490
+ without workspace links, so the smoke test exercises the files users receive.
491
+
492
+ Publish those tested tarballs in order (0.3.0 shown; use the chosen versions):
493
+
494
+ ```bash
495
+ npm publish ./inquir-compute-0.3.0.tgz --access public
496
+ # Confirm this SDK version is available from the registry before publishing CLI.
497
+ npm view @inquir/compute@0.3.0 version
498
+ npm publish ./inquir-compute-cli-0.3.0.tgz --access public
499
+ ```
500
+
501
+ After building, preview package contents without publishing with
502
+ `npm pack --dry-run --json --ignore-scripts --workspace @inquir/compute-cli`.
503
+ `--ignore-scripts` skips build hooks, so only use it after the explicit build.
504
+ The installed command is `inquir`, from `dist/index.js` with its Node shebang.
505
+ After publishing, users can install it with:
408
506
 
409
507
  ```bash
410
508
  npm install -g @inquir/compute-cli@latest
@@ -1,13 +1,28 @@
1
- import { type AppPortSpec, type AppRuntimeSpec, type Release } from '../utils/api.js';
1
+ import { type AppNetworkPolicy, type AppPortSpec, type AppRuntimeSpec, type AppScalingPolicy, type ApplicationDetail, type Release } from '../utils/api.js';
2
2
  export declare function appsCommand(args: string[]): Promise<void>;
3
3
  /**
4
- * `--tcp name:port[:public][:hostPort]` — the shorthand people actually want
5
- * to type for a database or SSH endpoint.
4
+ * `--tcp name:port[:public][:hostPort]` — ordinary usage stops at `public` and
5
+ * lets the platform lease a stable endpoint port. The final numeric modifier
6
+ * remains an API/CLI compatibility escape hatch for an existing installation.
6
7
  */
7
8
  export declare function parseTcpPortFlag(value: string): AppPortSpec;
8
9
  export declare function parseSetFlags(values: string[]): Record<string, string>;
9
- /** Runtime spec assembled from flags; undefined when nothing was specified. */
10
- export declare function buildRuntimeFromFlags(args: string[]): AppRuntimeSpec | undefined;
10
+ /** Parse a CLI duration such as `90`, `90s`, `15m`, `1h30m`, or `1.5m`. */
11
+ export declare function parseDurationSeconds(value: string): number;
12
+ /** Build the partial policy sent by `apps scale`; omitted values remain unchanged server-side. */
13
+ export declare function buildScalingPatchFromFlags(args: string[], positionalActivation?: string): Partial<AppScalingPolicy>;
14
+ type AppVolumeSpec = NonNullable<AppRuntimeSpec['volumes']>[number];
15
+ /** `--volume name:/absolute/container/path[:ro]`; host paths are never accepted. */
16
+ export declare function parseVolumeFlag(value: string): AppVolumeSpec;
17
+ /** Runtime flags patch the saved application runtime rather than replacing unrelated fields. */
18
+ export declare function buildRuntimeFromFlags(args: string[], baseRuntime?: AppRuntimeSpec): AppRuntimeSpec | undefined;
19
+ export declare function selectConnectionUrl(result: {
20
+ url?: string;
21
+ publicUrl?: string;
22
+ }, preference?: 'auto' | 'private' | 'public'): {
23
+ url: string;
24
+ visibility: 'private' | 'public';
25
+ };
11
26
  /**
12
27
  * Where a client can actually connect. Public endpoints first; a host-local
13
28
  * port is still printed (marked as such) because on an installation with no
@@ -16,6 +31,28 @@ export declare function buildRuntimeFromFlags(args: string[]): AppRuntimeSpec |
16
31
  export declare function releaseEndpointLines(release: Release, previewUrl?: string, options?: {
17
32
  includeHostLocal?: boolean;
18
33
  }): string[];
34
+ /**
35
+ * Where same-workspace services reach this application. The server projects
36
+ * `privateDomain` only once the private route is verified end to end, so a
37
+ * missing domain on an installation with private networking means "still
38
+ * being reconciled", not "no such thing" — and that is worth a line too.
39
+ */
40
+ export declare function privateEndpointLines(detail: Pick<ApplicationDetail, 'privateDomain' | 'privateBaseUrl'>, active: Pick<Release, 'ports'> | undefined, options?: {
41
+ privateNetworking?: boolean;
42
+ }): string[];
43
+ /**
44
+ * The networkPolicy patch for `--egress` / `--ingress`. The API requires
45
+ * egress inside networkPolicy, so a lone --ingress change carries the
46
+ * application's current egress along unchanged, and vice versa; with neither
47
+ * flag the policy is left alone (the server's defaults apply on create).
48
+ */
49
+ export declare function buildNetworkPolicyPatch(input: {
50
+ egress?: string;
51
+ ingress?: string;
52
+ current?: AppNetworkPolicy;
53
+ }): AppNetworkPolicy | undefined;
19
54
  /** A build-sourced release is best named by its build; a pulled one by its ref. */
20
55
  export declare function describeImage(release: Pick<Release, 'imageSource' | 'buildId' | 'imageRef' | 'imageDigest'>): string;
56
+ export declare function describeScalingPolicy(policy: AppScalingPolicy): string;
57
+ export {};
21
58
  //# sourceMappingURL=apps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/commands/apps.ts"],"names":[],"mappings":"AAEA,OAAO,EAyBL,KAAK,WAAW,EAChB,KAAK,cAAc,EAGnB,KAAK,OAAO,EAEb,MAAM,iBAAiB,CAAC;AAgCzB,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C/D;AAqDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA6B3D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUtE;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,GAAG,SAAS,CAuChF;AA+PD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,MAAM,EAAE,CAwBV;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC,GAAG,MAAM,CAGpH"}
1
+ {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/commands/apps.ts"],"names":[],"mappings":"AASA,OAAO,EAoCL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAErB,KAAK,iBAAiB,EAGtB,KAAK,OAAO,EAEb,MAAM,iBAAiB,CAAC;AAsDzB,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE/D;AA6ED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA6B3D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUtE;AAKD,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgC1D;AAgCD,kGAAkG;AAClG,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EAAE,EACd,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAuD3B;AAED,KAAK,aAAa,GAAG,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAKpE,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CA2D5D;AAiCD,gGAAgG;AAChG,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,CAAC,EAAE,cAAc,GAC3B,cAAc,GAAG,SAAS,CAmD5B;AAubD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5C,UAAU,GAAE,MAAM,GAAG,SAAS,GAAG,QAAiB,GACjD;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAcnD;AA+TD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,MAAM,EAAE,CAwBV;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,gBAAgB,CAAC,EACnE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,MAAM,EAAE,CAaV;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,GAAG,gBAAgB,GAAG,SAAS,CAe/B;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC,GAAG,MAAM,CAGpH;AAgCD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAMtE"}