@nodetool-ai/deploy 0.7.0-rc.11

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 (133) hide show
  1. package/dist/admin-client.d.ts +58 -0
  2. package/dist/admin-client.d.ts.map +1 -0
  3. package/dist/admin-client.js +275 -0
  4. package/dist/admin-client.js.map +1 -0
  5. package/dist/admin-operations.d.ts +197 -0
  6. package/dist/admin-operations.d.ts.map +1 -0
  7. package/dist/admin-operations.js +433 -0
  8. package/dist/admin-operations.js.map +1 -0
  9. package/dist/admin-routes.d.ts +306 -0
  10. package/dist/admin-routes.d.ts.map +1 -0
  11. package/dist/admin-routes.js +383 -0
  12. package/dist/admin-routes.js.map +1 -0
  13. package/dist/api-user-manager.d.ts +72 -0
  14. package/dist/api-user-manager.d.ts.map +1 -0
  15. package/dist/api-user-manager.js +89 -0
  16. package/dist/api-user-manager.js.map +1 -0
  17. package/dist/auth.d.ts +67 -0
  18. package/dist/auth.d.ts.map +1 -0
  19. package/dist/auth.js +142 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/collection-routes.d.ts +37 -0
  22. package/dist/collection-routes.d.ts.map +1 -0
  23. package/dist/collection-routes.js +43 -0
  24. package/dist/collection-routes.js.map +1 -0
  25. package/dist/compose.d.ts +52 -0
  26. package/dist/compose.d.ts.map +1 -0
  27. package/dist/compose.js +153 -0
  28. package/dist/compose.js.map +1 -0
  29. package/dist/configure.d.ts +87 -0
  30. package/dist/configure.d.ts.map +1 -0
  31. package/dist/configure.js +104 -0
  32. package/dist/configure.js.map +1 -0
  33. package/dist/deploy-to-gcp.d.ts +67 -0
  34. package/dist/deploy-to-gcp.d.ts.map +1 -0
  35. package/dist/deploy-to-gcp.js +268 -0
  36. package/dist/deploy-to-gcp.js.map +1 -0
  37. package/dist/deploy-to-runpod.d.ts +53 -0
  38. package/dist/deploy-to-runpod.d.ts.map +1 -0
  39. package/dist/deploy-to-runpod.js +207 -0
  40. package/dist/deploy-to-runpod.js.map +1 -0
  41. package/dist/deploy.d.ts +54 -0
  42. package/dist/deploy.d.ts.map +1 -0
  43. package/dist/deploy.js +82 -0
  44. package/dist/deploy.js.map +1 -0
  45. package/dist/deployment-config.d.ts +1073 -0
  46. package/dist/deployment-config.d.ts.map +1 -0
  47. package/dist/deployment-config.js +536 -0
  48. package/dist/deployment-config.js.map +1 -0
  49. package/dist/docker-run.d.ts +85 -0
  50. package/dist/docker-run.d.ts.map +1 -0
  51. package/dist/docker-run.js +202 -0
  52. package/dist/docker-run.js.map +1 -0
  53. package/dist/docker.d.ts +98 -0
  54. package/dist/docker.d.ts.map +1 -0
  55. package/dist/docker.js +396 -0
  56. package/dist/docker.js.map +1 -0
  57. package/dist/fly.d.ts +40 -0
  58. package/dist/fly.d.ts.map +1 -0
  59. package/dist/fly.js +291 -0
  60. package/dist/fly.js.map +1 -0
  61. package/dist/gcp.d.ts +59 -0
  62. package/dist/gcp.d.ts.map +1 -0
  63. package/dist/gcp.js +339 -0
  64. package/dist/gcp.js.map +1 -0
  65. package/dist/google-cloud-run-api.d.ts +134 -0
  66. package/dist/google-cloud-run-api.d.ts.map +1 -0
  67. package/dist/google-cloud-run-api.js +532 -0
  68. package/dist/google-cloud-run-api.js.map +1 -0
  69. package/dist/huggingface.d.ts +69 -0
  70. package/dist/huggingface.d.ts.map +1 -0
  71. package/dist/huggingface.js +346 -0
  72. package/dist/huggingface.js.map +1 -0
  73. package/dist/image-builder.d.ts +35 -0
  74. package/dist/image-builder.d.ts.map +1 -0
  75. package/dist/image-builder.js +157 -0
  76. package/dist/image-builder.js.map +1 -0
  77. package/dist/image-spec.d.ts +41 -0
  78. package/dist/image-spec.d.ts.map +1 -0
  79. package/dist/image-spec.js +49 -0
  80. package/dist/image-spec.js.map +1 -0
  81. package/dist/index.d.ts +33 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +45 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/manager.d.ts +121 -0
  86. package/dist/manager.d.ts.map +1 -0
  87. package/dist/manager.js +225 -0
  88. package/dist/manager.js.map +1 -0
  89. package/dist/progress.d.ts +91 -0
  90. package/dist/progress.d.ts.map +1 -0
  91. package/dist/progress.js +262 -0
  92. package/dist/progress.js.map +1 -0
  93. package/dist/railway.d.ts +65 -0
  94. package/dist/railway.d.ts.map +1 -0
  95. package/dist/railway.js +284 -0
  96. package/dist/railway.js.map +1 -0
  97. package/dist/remote-users.d.ts +74 -0
  98. package/dist/remote-users.d.ts.map +1 -0
  99. package/dist/remote-users.js +172 -0
  100. package/dist/remote-users.js.map +1 -0
  101. package/dist/runpod-api.d.ts +206 -0
  102. package/dist/runpod-api.d.ts.map +1 -0
  103. package/dist/runpod-api.js +703 -0
  104. package/dist/runpod-api.js.map +1 -0
  105. package/dist/runpod.d.ts +82 -0
  106. package/dist/runpod.d.ts.map +1 -0
  107. package/dist/runpod.js +188 -0
  108. package/dist/runpod.js.map +1 -0
  109. package/dist/self-hosted.d.ts +157 -0
  110. package/dist/self-hosted.d.ts.map +1 -0
  111. package/dist/self-hosted.js +799 -0
  112. package/dist/self-hosted.js.map +1 -0
  113. package/dist/ssh.d.ts +166 -0
  114. package/dist/ssh.d.ts.map +1 -0
  115. package/dist/ssh.js +430 -0
  116. package/dist/ssh.js.map +1 -0
  117. package/dist/state.d.ts +83 -0
  118. package/dist/state.d.ts.map +1 -0
  119. package/dist/state.js +368 -0
  120. package/dist/state.js.map +1 -0
  121. package/dist/storage-routes.d.ts +55 -0
  122. package/dist/storage-routes.d.ts.map +1 -0
  123. package/dist/storage-routes.js +160 -0
  124. package/dist/storage-routes.js.map +1 -0
  125. package/dist/sync.d.ts +38 -0
  126. package/dist/sync.d.ts.map +1 -0
  127. package/dist/sync.js +130 -0
  128. package/dist/sync.js.map +1 -0
  129. package/dist/workflow-syncer.d.ts +51 -0
  130. package/dist/workflow-syncer.d.ts.map +1 -0
  131. package/dist/workflow-syncer.js +192 -0
  132. package/dist/workflow-syncer.js.map +1 -0
  133. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-run.d.ts","sourceRoot":"","sources":["../src/docker-run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,YAAY,OAAO,CAAC;AAOjC,oDAAoD;AACpD,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kCAAkC;AAClC,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sCAAsC;AACtC,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,kCAAkC;AAClC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAKxD;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiBD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,SAAgB,UAAU,EAAE,mBAAmB,CAAC;IAChD,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,cAAc,EAAE,MAAM,CAAC;gBAGrC,UAAU,EAAE,mBAAmB,EAC/B,cAAc,GAAE,MAAiB;IAOnC,+CAA+C;IAC/C,eAAe,IAAI,MAAM;IAgDzB;;;OAGG;IACH,YAAY,IAAI,MAAM;IAgBtB,mCAAmC;IACnC,gBAAgB,IAAI,MAAM;IAQ1B,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,gBAAgB;IA4CxB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;CAQrB;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,mBAAmB,GAC9B,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAGxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAGxE"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Docker run command generation for self-hosted deployments.
3
+ *
4
+ * This module generates docker run commands from deployment configuration,
5
+ * supporting GPU assignments, volume mounts, and environment variables.
6
+ */
7
+ import * as crypto from "node:crypto";
8
+ import { shellEscape } from "./docker.js";
9
+ // ---------------------------------------------------------------------------
10
+ // Constants
11
+ // ---------------------------------------------------------------------------
12
+ export const INTERNAL_API_PORT = 7777;
13
+ export const APP_ENV_PORT = 8000;
14
+ /** Compute the full image name (name:tag). */
15
+ export function imageFullName(image) {
16
+ if (image.name.includes("@"))
17
+ return image.name;
18
+ const lastSegment = image.name.split("/").pop() ?? image.name;
19
+ if (lastSegment.includes(":"))
20
+ return image.name;
21
+ return `${image.name}:${image.tag}`;
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Safe shlex quote (allows ~/...)
25
+ // ---------------------------------------------------------------------------
26
+ function safeShellQuote(s) {
27
+ if (s.startsWith("~/")) {
28
+ return "~/" + shellEscape(s.slice(2));
29
+ }
30
+ return shellEscape(s);
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // DockerRunGenerator
34
+ // ---------------------------------------------------------------------------
35
+ /**
36
+ * Generates docker run command from deployment settings.
37
+ *
38
+ * Handles conversion of NodeTool deployment configuration into a docker run
39
+ * command suitable for single container deployment.
40
+ */
41
+ export class DockerRunGenerator {
42
+ deployment;
43
+ container;
44
+ runtimeCommand;
45
+ constructor(deployment, runtimeCommand = "docker") {
46
+ this.deployment = deployment;
47
+ this.container = deployment.container;
48
+ this.runtimeCommand = runtimeCommand;
49
+ }
50
+ /** Generate docker run command as a string. */
51
+ generateCommand() {
52
+ const parts = [`${shellEscape(this.runtimeCommand)} run`];
53
+ // Detached mode
54
+ parts.push("-d");
55
+ // Container name
56
+ const containerName = `nodetool-${this.container.name}`;
57
+ parts.push(`--name ${shellEscape(containerName)}`);
58
+ // Restart policy
59
+ parts.push("--restart unless-stopped");
60
+ // Port mapping
61
+ const hostPort = this.resolveHostPort();
62
+ parts.push(`-p ${hostPort}:${INTERNAL_API_PORT}`);
63
+ // Volume mounts
64
+ for (const volume of this.buildVolumes()) {
65
+ parts.push(`-v ${volume}`);
66
+ }
67
+ // Environment variables
68
+ for (const env of this.buildEnvironment()) {
69
+ parts.push(`-e ${env}`);
70
+ }
71
+ // GPU configuration
72
+ if (this.container.gpu) {
73
+ const gpuArgs = this.buildGpuArgs();
74
+ parts.push(...gpuArgs);
75
+ }
76
+ // Health check
77
+ const healthcheck = `--health-cmd="curl -f http://localhost:${INTERNAL_API_PORT}/health || exit 1" ` +
78
+ "--health-interval=30s " +
79
+ "--health-timeout=10s " +
80
+ "--health-retries=3 " +
81
+ "--health-start-period=40s";
82
+ parts.push(healthcheck);
83
+ // Image name
84
+ parts.push(shellEscape(imageFullName(this.deployment.image)));
85
+ return parts.join(" \\\n ");
86
+ }
87
+ /**
88
+ * Generate a hash of the docker run configuration.
89
+ * Can be used to detect changes in the configuration.
90
+ */
91
+ generateHash() {
92
+ const configDict = {
93
+ image: imageFullName(this.deployment.image),
94
+ container_name: this.container.name,
95
+ port: this.resolveHostPort(),
96
+ volumes: this.buildVolumes(),
97
+ environment: this.buildEnvironment().sort(),
98
+ gpu: this.container.gpu ?? null
99
+ };
100
+ const configStr = JSON.stringify(configDict, Object.keys(configDict).sort());
101
+ return crypto.createHash("sha256").update(configStr).digest("hex");
102
+ }
103
+ /** Get the full container name. */
104
+ getContainerName() {
105
+ return `nodetool-${this.container.name}`;
106
+ }
107
+ // -----------------------------------------------------------------------
108
+ // Private helpers
109
+ // -----------------------------------------------------------------------
110
+ buildVolumes() {
111
+ const volumes = [];
112
+ // Workspace volume (read-write)
113
+ const workspacePath = this.deployment.paths.workspace;
114
+ volumes.push(`${workspacePath}:/workspace`);
115
+ // HuggingFace cache volume
116
+ const persistentPaths = this.deployment.persistentPaths;
117
+ if (persistentPaths) {
118
+ volumes.push(`${this.deployment.paths.hfCache}:/hf-cache`);
119
+ }
120
+ else {
121
+ volumes.push(`${this.deployment.paths.hfCache}:/hf-cache:ro`);
122
+ }
123
+ return volumes.map(safeShellQuote);
124
+ }
125
+ buildEnvironment() {
126
+ // Start with container environment
127
+ const env = {
128
+ ...(this.container.environment ?? {})
129
+ };
130
+ // Add container-specific settings
131
+ env["PORT"] = String(APP_ENV_PORT);
132
+ env["NODETOOL_API_URL"] = `http://localhost:${this.container.port}`;
133
+ env["NODETOOL_SERVER_MODE"] = "private";
134
+ // Configure paths from persistentPaths if available
135
+ const persistentPaths = this.deployment.persistentPaths;
136
+ if (persistentPaths) {
137
+ env["USERS_FILE"] = persistentPaths.usersFile;
138
+ env["DB_PATH"] = persistentPaths.dbPath;
139
+ env["CHROMA_PATH"] = persistentPaths.chromaPath;
140
+ env["HF_HOME"] = persistentPaths.hfCache;
141
+ env["ASSET_BUCKET"] = persistentPaths.assetBucket;
142
+ env["AUTH_PROVIDER"] = "multi_user";
143
+ }
144
+ else {
145
+ env["DB_PATH"] = "/workspace/nodetool.db";
146
+ env["HF_HOME"] = "/hf-cache";
147
+ if (!env["AUTH_PROVIDER"]) {
148
+ env["AUTH_PROVIDER"] = "static";
149
+ }
150
+ }
151
+ // Add workflow IDs if specified
152
+ if (this.container.workflows && this.container.workflows.length > 0) {
153
+ env["NODETOOL_WORKFLOWS"] = this.container.workflows.join(",");
154
+ }
155
+ // Add authentication token for self-hosted deployments
156
+ if (this.deployment.serverAuthToken) {
157
+ env["SERVER_AUTH_TOKEN"] = this.deployment.serverAuthToken;
158
+ }
159
+ // Convert to KEY=value format and quote
160
+ return Object.entries(env).map(([key, value]) => safeShellQuote(`${key}=${value}`));
161
+ }
162
+ resolveHostPort() {
163
+ const hostPort = this.container.port || APP_ENV_PORT;
164
+ if (hostPort === INTERNAL_API_PORT) {
165
+ return APP_ENV_PORT;
166
+ }
167
+ return hostPort;
168
+ }
169
+ buildGpuArgs() {
170
+ if (!this.container.gpu)
171
+ return [];
172
+ const gpuIds = this.container.gpu.trim();
173
+ // Format: --gpus '"device=0,1"' for multiple GPUs
174
+ const quotedDevice = shellEscape(`"device=${gpuIds}"`);
175
+ return [`--gpus ${quotedDevice}`];
176
+ }
177
+ }
178
+ // ---------------------------------------------------------------------------
179
+ // Convenience functions
180
+ // ---------------------------------------------------------------------------
181
+ /**
182
+ * Generate docker run command from deployment configuration.
183
+ */
184
+ export function generateDockerRunCommand(deployment) {
185
+ const generator = new DockerRunGenerator(deployment);
186
+ return generator.generateCommand();
187
+ }
188
+ /**
189
+ * Get hash of the docker run configuration for change detection.
190
+ */
191
+ export function getDockerRunHash(deployment) {
192
+ const generator = new DockerRunGenerator(deployment);
193
+ return generator.generateHash();
194
+ }
195
+ /**
196
+ * Get the container name for the deployment.
197
+ */
198
+ export function getContainerName(deployment) {
199
+ const generator = new DockerRunGenerator(deployment);
200
+ return generator.getContainerName();
201
+ }
202
+ //# sourceMappingURL=docker-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-run.js","sourceRoot":"","sources":["../src/docker-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Docker utilities for NodeTool deployment.
3
+ *
4
+ * This module contains all Docker-related functionality for building, pushing,
5
+ * and managing Docker images for NodeTool deployments.
6
+ */
7
+ import { execFile } from "node:child_process";
8
+ /**
9
+ * Promisified `child_process.execFile` — runs a command with an argument array
10
+ * and no shell, returning `{ stdout, stderr }`.
11
+ */
12
+ export declare const execFileAsync: typeof execFile.__promisify__;
13
+ /**
14
+ * Escape a string for safe shell inclusion (single-quote wrapping).
15
+ */
16
+ export declare function shellEscape(value: string): string;
17
+ /**
18
+ * Run a command safely without shell expansion.
19
+ *
20
+ * @param command Shell command string to run.
21
+ * @param captureOutput If true, capture and return output. If false, stream output.
22
+ * @returns Captured output if captureOutput=true, empty string otherwise.
23
+ */
24
+ export declare function runCommand(command: string, captureOutput?: boolean): string;
25
+ /**
26
+ * Run a command safely using execFileSync with an argument array (no shell).
27
+ *
28
+ * @param program The executable to run (e.g. "docker").
29
+ * @param args Array of arguments passed directly to the program.
30
+ * @param options.captureOutput If true, capture and return stdout.
31
+ * @returns Captured output if captureOutput=true, empty string otherwise.
32
+ */
33
+ export declare function runCommandArgs(program: string, args: string[], options?: {
34
+ captureOutput?: boolean;
35
+ }): string;
36
+ /**
37
+ * Check if user is authenticated with the Docker registry.
38
+ */
39
+ export declare function checkDockerAuth(_registry?: string): boolean;
40
+ /**
41
+ * Ensure user is authenticated with Docker registry.
42
+ * Note: interactive login prompt is not supported in this TS port;
43
+ * the function will throw if not authenticated.
44
+ */
45
+ export declare function ensureDockerAuth(registry?: string): void;
46
+ /**
47
+ * Format the image name with proper registry and username prefix.
48
+ *
49
+ * @example
50
+ * formatImageName("my-workflow", "myuser") // "myuser/my-workflow"
51
+ * formatImageName("my-workflow", "myuser", "ghcr.io") // "ghcr.io/myuser/my-workflow"
52
+ */
53
+ export declare function formatImageName(baseName: string, dockerUsername: string, registry?: string): string;
54
+ /**
55
+ * Generate a unique image tag based on current timestamp and random hash.
56
+ *
57
+ * @returns A unique tag in format 'YYYYMMDD-HHMMSS-abcdef'
58
+ */
59
+ export declare function generateImageTag(): string;
60
+ export interface BuildDockerImageOptions {
61
+ imageName: string;
62
+ tag: string;
63
+ platform?: string;
64
+ useCache?: boolean;
65
+ autoPush?: boolean;
66
+ }
67
+ /**
68
+ * Build a Docker image for deployment.
69
+ *
70
+ * @returns true if the image was pushed to registry, false if only built locally.
71
+ */
72
+ export declare function buildDockerImage(options: BuildDockerImageOptions): boolean;
73
+ /**
74
+ * Push Docker image to a registry with proper authentication checks.
75
+ */
76
+ export declare function pushToRegistry(imageName: string, tag: string, registry?: string): void;
77
+ /**
78
+ * Get Docker username from Docker's configuration file.
79
+ */
80
+ export declare function getDockerUsernameFromConfig(registry?: string): string | null;
81
+ export interface RunDockerImageOptions {
82
+ imageName: string;
83
+ tag: string;
84
+ hostPort: number;
85
+ containerPort?: number;
86
+ containerName?: string;
87
+ env?: Record<string, string>;
88
+ volumes?: Array<[string, string]>;
89
+ detach?: boolean;
90
+ gpus?: string | boolean;
91
+ remove?: boolean;
92
+ extraArgs?: string[];
93
+ }
94
+ /**
95
+ * Run a Docker image and map it to a given host port.
96
+ */
97
+ export declare function runDockerImage(options: RunDockerImageOptions): void;
98
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA0B,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOtE;;;GAGG;AACH,eAAO,MAAM,aAAa,+BAAsB,CAAC;AAMjD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAMD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,OAAe,GAC7B,MAAM,CAuBR;AAMD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,MAAM,CA0BR;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,GAAE,MAAoB,GAAG,OAAO,CAkBxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAAoB,GAAG,IAAI,CAMrE;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,GAAE,MAAoB,GAC7B,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAqBzC;AAMD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAsH1E;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAoB,GAC7B,IAAI,CAkBN;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,GAAE,MAAoB,GAC7B,MAAM,GAAG,IAAI,CAkDf;AAMD,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAoDnE"}