@platforma-sdk/bootstrap 5.2.51 → 5.2.53

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 (176) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/block.cjs +106 -146
  3. package/dist/block.cjs.map +1 -1
  4. package/dist/block.js +100 -125
  5. package/dist/block.js.map +1 -1
  6. package/dist/cmd-opts.cjs +87 -177
  7. package/dist/cmd-opts.cjs.map +1 -1
  8. package/dist/cmd-opts.js +87 -172
  9. package/dist/cmd-opts.js.map +1 -1
  10. package/dist/commands/create-block.cjs +19 -20
  11. package/dist/commands/create-block.cjs.map +1 -1
  12. package/dist/commands/create-block.d.ts +12 -7
  13. package/dist/commands/create-block.js +17 -17
  14. package/dist/commands/create-block.js.map +1 -1
  15. package/dist/commands/reset.cjs +18 -21
  16. package/dist/commands/reset.cjs.map +1 -1
  17. package/dist/commands/reset.d.ts +12 -7
  18. package/dist/commands/reset.js +16 -18
  19. package/dist/commands/reset.js.map +1 -1
  20. package/dist/commands/start/docker/s3.cjs +64 -67
  21. package/dist/commands/start/docker/s3.cjs.map +1 -1
  22. package/dist/commands/start/docker/s3.d.ts +32 -27
  23. package/dist/commands/start/docker/s3.js +61 -64
  24. package/dist/commands/start/docker/s3.js.map +1 -1
  25. package/dist/commands/start/docker.cjs +64 -67
  26. package/dist/commands/start/docker.cjs.map +1 -1
  27. package/dist/commands/start/docker.d.ts +32 -27
  28. package/dist/commands/start/docker.js +61 -64
  29. package/dist/commands/start/docker.js.map +1 -1
  30. package/dist/commands/start/local/s3.cjs +101 -135
  31. package/dist/commands/start/local/s3.cjs.map +1 -1
  32. package/dist/commands/start/local/s3.d.ts +36 -31
  33. package/dist/commands/start/local/s3.js +97 -113
  34. package/dist/commands/start/local/s3.js.map +1 -1
  35. package/dist/commands/start/local.cjs +95 -122
  36. package/dist/commands/start/local.cjs.map +1 -1
  37. package/dist/commands/start/local.d.ts +34 -29
  38. package/dist/commands/start/local.js +91 -100
  39. package/dist/commands/start/local.js.map +1 -1
  40. package/dist/commands/start.cjs +18 -21
  41. package/dist/commands/start.cjs.map +1 -1
  42. package/dist/commands/start.d.ts +12 -7
  43. package/dist/commands/start.js +16 -18
  44. package/dist/commands/start.js.map +1 -1
  45. package/dist/commands/stop.cjs +22 -27
  46. package/dist/commands/stop.cjs.map +1 -1
  47. package/dist/commands/stop.d.ts +12 -7
  48. package/dist/commands/stop.js +20 -24
  49. package/dist/commands/stop.js.map +1 -1
  50. package/dist/commands/svc/create/arg-parser.cjs +102 -172
  51. package/dist/commands/svc/create/arg-parser.cjs.map +1 -1
  52. package/dist/commands/svc/create/arg-parser.js +102 -171
  53. package/dist/commands/svc/create/arg-parser.js.map +1 -1
  54. package/dist/commands/svc/create/docker/s3.cjs +78 -96
  55. package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
  56. package/dist/commands/svc/create/docker/s3.d.ts +35 -30
  57. package/dist/commands/svc/create/docker/s3.js +75 -93
  58. package/dist/commands/svc/create/docker/s3.js.map +1 -1
  59. package/dist/commands/svc/create/docker.cjs +82 -103
  60. package/dist/commands/svc/create/docker.cjs.map +1 -1
  61. package/dist/commands/svc/create/docker.d.ts +35 -30
  62. package/dist/commands/svc/create/docker.js +79 -100
  63. package/dist/commands/svc/create/docker.js.map +1 -1
  64. package/dist/commands/svc/create/local/s3.cjs +107 -139
  65. package/dist/commands/svc/create/local/s3.cjs.map +1 -1
  66. package/dist/commands/svc/create/local/s3.d.ts +39 -34
  67. package/dist/commands/svc/create/local/s3.js +103 -117
  68. package/dist/commands/svc/create/local/s3.js.map +1 -1
  69. package/dist/commands/svc/create/local.cjs +101 -138
  70. package/dist/commands/svc/create/local.cjs.map +1 -1
  71. package/dist/commands/svc/create/local.d.ts +37 -32
  72. package/dist/commands/svc/create/local.js +97 -116
  73. package/dist/commands/svc/create/local.js.map +1 -1
  74. package/dist/commands/svc/delete.cjs +36 -38
  75. package/dist/commands/svc/delete.cjs.map +1 -1
  76. package/dist/commands/svc/delete.d.ts +16 -11
  77. package/dist/commands/svc/delete.js +34 -35
  78. package/dist/commands/svc/delete.js.map +1 -1
  79. package/dist/commands/svc/down.cjs +27 -30
  80. package/dist/commands/svc/down.cjs.map +1 -1
  81. package/dist/commands/svc/down.d.ts +15 -10
  82. package/dist/commands/svc/down.js +25 -27
  83. package/dist/commands/svc/down.js.map +1 -1
  84. package/dist/commands/svc/list.cjs +25 -29
  85. package/dist/commands/svc/list.cjs.map +1 -1
  86. package/dist/commands/svc/list.d.ts +9 -5
  87. package/dist/commands/svc/list.js +23 -26
  88. package/dist/commands/svc/list.js.map +1 -1
  89. package/dist/commands/svc/up.cjs +33 -49
  90. package/dist/commands/svc/up.cjs.map +1 -1
  91. package/dist/commands/svc/up.d.ts +15 -10
  92. package/dist/commands/svc/up.js +31 -46
  93. package/dist/commands/svc/up.js.map +1 -1
  94. package/dist/core.cjs +712 -881
  95. package/dist/core.cjs.map +1 -1
  96. package/dist/core.js +709 -877
  97. package/dist/core.js.map +1 -1
  98. package/dist/index.cjs +36 -36
  99. package/dist/index.cjs.map +1 -1
  100. package/dist/index.d.ts +37 -33
  101. package/dist/index.js +35 -34
  102. package/dist/index.js.map +1 -1
  103. package/dist/package.cjs +15 -36
  104. package/dist/package.cjs.map +1 -1
  105. package/dist/package.js +14 -14
  106. package/dist/package.js.map +1 -1
  107. package/dist/platforma.cjs +119 -148
  108. package/dist/platforma.cjs.map +1 -1
  109. package/dist/platforma.js +114 -122
  110. package/dist/platforma.js.map +1 -1
  111. package/dist/run.cjs +55 -58
  112. package/dist/run.cjs.map +1 -1
  113. package/dist/run.js +56 -56
  114. package/dist/run.js.map +1 -1
  115. package/dist/state.cjs +114 -141
  116. package/dist/state.cjs.map +1 -1
  117. package/dist/state.js +110 -139
  118. package/dist/state.js.map +1 -1
  119. package/dist/templates/compose.cjs +38 -65
  120. package/dist/templates/compose.cjs.map +1 -1
  121. package/dist/templates/compose.js +35 -63
  122. package/dist/templates/compose.js.map +1 -1
  123. package/dist/templates/pl-config.cjs +163 -165
  124. package/dist/templates/pl-config.cjs.map +1 -1
  125. package/dist/templates/pl-config.js +161 -163
  126. package/dist/templates/pl-config.js.map +1 -1
  127. package/dist/templates/types.cjs +24 -23
  128. package/dist/templates/types.cjs.map +1 -1
  129. package/dist/templates/types.js +24 -22
  130. package/dist/templates/types.js.map +1 -1
  131. package/dist/util.cjs +57 -74
  132. package/dist/util.cjs.map +1 -1
  133. package/dist/util.js +51 -72
  134. package/dist/util.js.map +1 -1
  135. package/package.json +7 -7
  136. package/dist/block.d.ts +0 -25
  137. package/dist/block.d.ts.map +0 -1
  138. package/dist/cmd-opts.d.ts +0 -89
  139. package/dist/cmd-opts.d.ts.map +0 -1
  140. package/dist/commands/create-block.d.ts.map +0 -1
  141. package/dist/commands/reset.d.ts.map +0 -1
  142. package/dist/commands/start/docker/s3.d.ts.map +0 -1
  143. package/dist/commands/start/docker.d.ts.map +0 -1
  144. package/dist/commands/start/local/s3.d.ts.map +0 -1
  145. package/dist/commands/start/local.d.ts.map +0 -1
  146. package/dist/commands/start.d.ts.map +0 -1
  147. package/dist/commands/stop.d.ts.map +0 -1
  148. package/dist/commands/svc/create/arg-parser.d.ts +0 -43
  149. package/dist/commands/svc/create/arg-parser.d.ts.map +0 -1
  150. package/dist/commands/svc/create/docker/s3.d.ts.map +0 -1
  151. package/dist/commands/svc/create/docker.d.ts.map +0 -1
  152. package/dist/commands/svc/create/local/s3.d.ts.map +0 -1
  153. package/dist/commands/svc/create/local.d.ts.map +0 -1
  154. package/dist/commands/svc/delete.d.ts.map +0 -1
  155. package/dist/commands/svc/down.d.ts.map +0 -1
  156. package/dist/commands/svc/list.d.ts.map +0 -1
  157. package/dist/commands/svc/up.d.ts.map +0 -1
  158. package/dist/core.d.ts +0 -105
  159. package/dist/core.d.ts.map +0 -1
  160. package/dist/index.d.ts.map +0 -1
  161. package/dist/package.d.ts +0 -7
  162. package/dist/package.d.ts.map +0 -1
  163. package/dist/platforma.d.ts +0 -24
  164. package/dist/platforma.d.ts.map +0 -1
  165. package/dist/run.d.ts +0 -13
  166. package/dist/run.d.ts.map +0 -1
  167. package/dist/state.d.ts +0 -63
  168. package/dist/state.d.ts.map +0 -1
  169. package/dist/templates/compose.d.ts +0 -14
  170. package/dist/templates/compose.d.ts.map +0 -1
  171. package/dist/templates/pl-config.d.ts +0 -6
  172. package/dist/templates/pl-config.d.ts.map +0 -1
  173. package/dist/templates/types.d.ts +0 -138
  174. package/dist/templates/types.d.ts.map +0 -1
  175. package/dist/util.d.ts +0 -18
  176. package/dist/util.d.ts.map +0 -1
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","sources":["../src/core.ts"],"sourcesContent":["import type { ChildProcess, SpawnSyncReturns } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as pkg from \"./package\";\nimport * as run from \"./run\";\nimport * as composeCfg from \"./templates/compose\";\nimport * as plCfg from \"./templates/pl-config\";\nimport type * as types from \"./templates/types\";\nimport * as platforma from \"./platforma\";\nimport type { instanceInfo, instanceCommand } from \"./state\";\nimport state from \"./state\";\nimport * as util from \"./util\";\nimport type winston from \"winston\";\n\nexport default class Core {\n constructor(private readonly logger: winston.Logger) {}\n\n public startLast(): ChildProcess[] {\n const instance = state.currentInstance;\n if (!instance) {\n this.logger.error(\n \"failed to bring back Platforma Backend in the last started configuration: no last configuration found\",\n );\n throw new Error(\"no previous run info found\");\n }\n\n return this.startInstance(instance);\n }\n\n public startInstance(instance: instanceInfo): ChildProcess[] {\n if (instance.runInfo) {\n const runInfo = this.renderRunInfo(instance.runInfo);\n this.logger.info(`Starting platforma backend instance '${instance.name}':\\n${runInfo}`);\n }\n\n const result = run.runCommands(this.logger, instance.upCommands);\n checkRunError(result.executed);\n\n if (result.spawned.length > 0 && instance.type === \"process\") {\n instance.pid = result.spawned[result.spawned.length - 1].pid;\n state.setInstanceInfo(instance.name, instance);\n this.logger.info(`instance '${instance.name}' started`);\n }\n\n state.currentInstanceName = instance.name;\n\n return result.spawned;\n }\n\n public stopInstance(instance: instanceInfo) {\n this.logger.info(`stopping platforma backend instance '${instance.name}'...`);\n const result = run.runCommands(this.logger, instance.downCommands);\n checkRunError(result.executed);\n\n const iType = instance.type;\n switch (iType) {\n case \"docker\": {\n return;\n }\n\n case \"process\": {\n if (instance.pid && state.isInstanceActive(instance)) {\n process.kill(instance.pid);\n }\n\n return;\n }\n default:\n util.assertNever(iType);\n }\n }\n\n public switchInstance(instance: instanceInfo): ChildProcess[] {\n // Stop all other active instances before switching to new one;\n for (const iName of state.instanceList) {\n if (iName !== instance.name) {\n const iToStop = state.getInstanceInfo(iName);\n if (state.isInstanceActive(iToStop)) {\n this.stopInstance(iToStop);\n }\n }\n }\n\n return this.startInstance(instance);\n }\n\n public createLocal(instanceName: string, options?: createLocalOptions): instanceInfo {\n let plBinaryPath = platforma.binaryPath(options?.version, \"binaries\", \"platforma\");\n if (options?.sourcesPath) {\n plBinaryPath = path.join(os.tmpdir(), \"platforma-custom-build\");\n }\n if (options?.binaryPath) {\n plBinaryPath = options.binaryPath;\n }\n\n let configPath = options?.configPath;\n const workdir: string =\n options?.workdir ?? (configPath ? process.cwd() : state.instanceDir(instanceName));\n\n if (options?.primaryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n primary: plCfg.storageSettingsFromURL(\n options.primaryURL,\n workdir,\n options.configOptions?.storages?.primary,\n ),\n },\n };\n }\n if (options?.libraryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n library: plCfg.storageSettingsFromURL(\n options.libraryURL,\n workdir,\n options.configOptions?.storages?.library,\n ),\n },\n };\n }\n\n const configOptions = plCfg.loadDefaults(this.getLastJwt(), options?.configOptions);\n\n this.logger.debug(` checking license...`);\n this.checkLicense(\n options?.configOptions?.license?.value,\n options?.configOptions?.license?.file,\n );\n\n const storageDirs: string[] = [\n `${configOptions.localRoot}/packages`,\n `${configOptions.localRoot}/packages-local`,\n `${configOptions.localRoot}/blocks-local`,\n ];\n if (configOptions.storages.primary.type === \"FS\") {\n storageDirs.push(configOptions.storages.primary.rootPath);\n }\n if (configOptions.storages.library.type === \"FS\") {\n storageDirs.push(configOptions.storages.library.rootPath);\n configOptions.hacks.libraryDownloadable = false;\n }\n if (configOptions.storages.work.type === \"FS\") {\n storageDirs.push(configOptions.storages.work.rootPath);\n }\n\n this.logger.debug(\" creating pl state directories...\");\n for (const dir of storageDirs) {\n if (!fs.existsSync(dir)) {\n this.logger.debug(` '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n for (const drv of configOptions.core.auth.drivers) {\n if (drv.driver === \"htpasswd\") {\n if (!fs.existsSync(drv.path)) {\n this.logger.debug(` installing default 'users.htpasswd' to ${drv.path}...`);\n fs.copyFileSync(pkg.assets(\"users.htpasswd\"), drv.path);\n }\n }\n }\n\n if (!configPath) {\n configPath = path.join(configOptions.localRoot, \"config.yaml\");\n this.logger.debug(` rendering configuration '${configPath}'...`);\n fs.writeFileSync(configPath, plCfg.render(configOptions));\n }\n\n const upCommands: instanceCommand[] = [];\n if (options?.sourcesPath) {\n upCommands.push({\n cmd: \"go\",\n args: [\"build\", \"-o\", plBinaryPath, \".\"],\n workdir: path.resolve(options.sourcesPath, \"cmd\", \"platforma\"),\n runOpts: {\n stdio: \"inherit\",\n },\n });\n }\n\n const runBinary: instanceCommand = {\n async: true,\n cmd: plBinaryPath,\n args: [\"--quiet\", \"--config\", configPath],\n workdir: workdir,\n runOpts: {\n stdio: \"inherit\",\n },\n };\n\n if (options?.configOptions?.numCpu) {\n runBinary.runOpts.env = {\n GOMAXPROCS: String(options?.configOptions?.numCpu),\n };\n }\n\n // Process additional environment variables from CLI options\n if (options?.backendCommands) {\n if (!runBinary.runOpts.env) {\n runBinary.runOpts.env = {};\n }\n for (const cmd of options.backendCommands) {\n const equalIndex = cmd.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = cmd.substring(0, equalIndex);\n const value = cmd.substring(equalIndex + 1);\n runBinary.runOpts.env[key] = value;\n } else {\n this.logger.warn(\n `Invalid environment variable format: ${cmd}. Expected format: KEY=VALUE`,\n );\n }\n }\n }\n\n // Process additional backend commands\n if (options?.backendCommands && options.backendCommands.length > 0) {\n this.logger.debug(`Adding backend commands: ${options.backendCommands.join(\" \")}`);\n // Add commands as arguments to the binary\n runBinary.args = [...runBinary.args, ...options.backendCommands];\n }\n\n upCommands.push(runBinary);\n\n state.setInstanceInfo(instanceName, {\n type: \"process\",\n upCommands: upCommands,\n downCommands: [],\n cleanupCommands: [],\n runInfo: {\n configPath,\n dbPath: configOptions.core.db.path,\n apiAddr: configOptions.grpc.listen,\n logPath: configOptions.log.path,\n primary: configOptions.storages.primary,\n work: configOptions.storages.work,\n library: configOptions.storages.library,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createLocalS3(instanceName: string, options?: createLocalS3Options): instanceInfo {\n this.logger.debug(\"creating platforma instance in 'local s3' mode...\");\n\n const minioPort = options?.minioPort ?? 9000;\n\n const instance = this.createLocal(instanceName, {\n ...options,\n primaryURL:\n options?.primaryURL ??\n `s3e://testuser:testpassword@localhost:${minioPort}/platforma-primary-bucket/?region=no-region`,\n libraryURL:\n options?.libraryURL ??\n `s3e://testuser:testpassword@localhost:${minioPort}/platforma-library-bucket/?region=no-region`,\n });\n\n const localRoot = options?.configOptions?.localRoot;\n const minioRunCmd = this.createMinio(instanceName, {\n minioPort: minioPort,\n minioConsolePort: options?.minioConsolePort,\n storage: localRoot ? path.join(localRoot, \"minio\") : undefined,\n });\n\n instance.upCommands = [minioRunCmd.start, ...instance.upCommands];\n\n instance.downCommands = [minioRunCmd.stop, ...instance.downCommands];\n\n instance.cleanupCommands = [minioRunCmd.cleanup, ...instance.cleanupCommands];\n\n state.setInstanceInfo(instanceName, instance);\n return instance;\n }\n\n public createMinio(\n instanceName: string,\n options?: {\n image?: string;\n version?: string;\n minioPort?: number;\n minioConsolePort?: number;\n storage?: string;\n },\n ): {\n start: instanceCommand;\n stop: instanceCommand;\n cleanup: instanceCommand;\n } {\n this.logger.debug(\" creating docker compose for minio service...\");\n const composeSrc = pkg.assets(\"compose-backend.yaml\");\n const composeMinio = state.instanceDir(instanceName, \"compose-minio.yaml\");\n\n composeCfg.render(\n composeSrc,\n composeMinio,\n `pl-${instanceName}-minio`,\n new Map([[\"minio\", {}]]),\n { dropVolumes: true },\n );\n\n const version = options?.version ? `:${options.version}` : \"\";\n this.logger.debug(` minio version: ${version}`);\n const image = options?.image ?? `quay.io/minio/minio${version}`;\n this.logger.debug(` minio image: ${image}`);\n\n const storage = options?.storage ?? state.instanceDir(instanceName, \"minio\");\n util.ensureDir(storage, { mode: \"0775\" });\n\n const minioPort = options?.minioPort ?? 9000;\n const minioConsolePort = options?.minioConsolePort ?? 9001;\n\n const envs = {\n MINIO_IMAGE: image,\n MINIO_STORAGE: path.resolve(storage),\n MINIO_PORT: minioPort.toString(),\n MINIO_CONSOLE_PORT: minioConsolePort.toString(),\n };\n\n return {\n start: {\n cmd: \"docker\",\n args: [\n \"compose\",\n `--file=${composeMinio}`,\n \"up\",\n \"--detach\",\n \"--remove-orphans\",\n \"--pull=missing\",\n ],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: \"inherit\" },\n },\n stop: {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeMinio}`, \"down\"],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: \"inherit\" },\n },\n cleanup: {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeMinio}`, \"down\", \"--volumes\", \"--remove-orphans\"],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: \"inherit\" },\n },\n };\n }\n\n public createDockerS3(\n instanceName: string,\n localRoot: string,\n options?: {\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n\n grpcPort?: number;\n grpcAddr?: string;\n\n presignHost?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n\n s3Port?: number;\n s3ConsolePort?: number;\n\n customMounts?: { hostPath: string; containerPath?: string }[];\n\n backendCommands?: string[];\n },\n ): instanceInfo {\n this.logger.debug(\"creating platforma instance in 'docker s3' mode...\");\n\n const composeS3Path = pkg.assets(\"compose-backend.yaml\");\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: \"0775\" });\n return p;\n };\n\n const logFilePath = storagePath(\"logs\", \"platforma.log\");\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, \"\");\n }\n\n const presignHost = options?.presignHost ?? \"localhost\";\n const presignPort = options?.s3Port ?? 9000;\n\n const primary = plCfg.storageSettingsFromURL(\n `s3e://testuser:testpassword@minio:${presignPort}/platforma-primary-bucket`,\n );\n if (primary.type !== \"S3\") {\n throw new Error(\"primary storage must have 'S3' type in 'docker s3' configuration\");\n } else {\n primary.presignEndpoint = `http://${presignHost}:${presignPort}`;\n }\n\n const library = plCfg.storageSettingsFromURL(\n `s3e://testuser:testpassword@minio:${presignPort}/platforma-library-bucket`,\n );\n if (library.type !== \"S3\") {\n throw new Error(`${library.type} storage type is not supported for library storage`);\n } else {\n library.presignEndpoint = `http://${presignHost}:${presignPort}`;\n }\n\n const dbFSPath = storageDir(\"db\");\n const workFSPath = storageDir(\"work\");\n const usersFSPath = storagePath(\"users.htpasswd\");\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets(\"users.htpasswd\"), usersFSPath);\n }\n\n const composeDstPath = storagePath(\"compose.yaml\");\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n composeCfg.render(\n composeS3Path,\n composeDstPath,\n `pl-${instanceName}`,\n new Map([\n [\"minio\", {}],\n [\n \"backend\",\n {\n platform: options?.platformOverride,\n mounts: backendMounts,\n commands: options?.backendCommands,\n },\n ],\n ]),\n );\n\n const envs: NodeJS.ProcessEnv = {\n MINIO_IMAGE: \"quay.io/minio/minio\",\n MINIO_STORAGE: storageDir(\"minio\"),\n\n PL_IMAGE: image,\n\n PL_AUTH_HTPASSWD: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: options?.logLevel ?? \"info\",\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: \"true\",\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: \"1h\",\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: storageDir(\"primary\"),\n PL_DATA_LIBRARY_ROOT: storageDir(\"library\"),\n PL_DATA_WORKDIR_ROOT: workFSPath,\n\n // Mount packages storage as volume, because APFS is case-insensitive on Mac OS X and this breaks some pl software installation.\n // PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage(\"primary\", primary),\n ...this.configureDockerStorage(\"library\", library),\n };\n\n if (options?.grpcAddr) {\n const addrParts = options.grpcAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_LISTEN_ADDRESS = addrParts[0];\n envs.PL_LISTEN_PORT = addrParts[1];\n } else {\n envs.PL_LISTEN_ADDRESS = options.grpcAddr;\n }\n } else if (options?.grpcPort) {\n envs.PL_LISTEN_PORT = options.grpcPort.toString();\n }\n\n if (options?.monitoringAddr) {\n const addrParts = options.monitoringAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_MONITORING_IP = addrParts[0];\n envs.PL_MONITORING_PORT = addrParts[1];\n } else {\n envs.PL_MONITORING_IP = options.monitoringAddr;\n }\n } else if (options?.monitoringPort) {\n envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n }\n\n if (options?.debugAddr) {\n const addrParts = options.debugAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_DEBUG_IP = addrParts[0];\n envs.PL_DEBUG_PORT = addrParts[1];\n } else {\n envs.PL_DEBUG_IP = options.debugAddr;\n }\n } else if (options?.debugPort) {\n envs.PL_DEBUG_PORT = options.debugPort.toString();\n }\n\n if (options?.s3Port) envs.MINIO_PORT = options.s3Port.toString();\n if (options?.s3ConsolePort) envs.MINIO_CONSOLE_PORT = options.s3ConsolePort.toString();\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs[\"PL_NO_AUTH\"] = \"false\";\n } else {\n envs[\"PL_NO_AUTH\"] = \"true\";\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === \"htpasswd\") {\n envs[\"PL_AUTH_HTPASSWD\"] = path.resolve(drv.path);\n drv.path = \"/etc/platforma/users.htpasswd\";\n }\n }\n envs[\"PL_AUTH_DRIVERS\"] = JSON.stringify(options.auth.drivers);\n }\n }\n\n // Process additional backend commands\n if (options?.backendCommands && options.backendCommands.length > 0) {\n this.logger.debug(`Adding backend commands: ${options.backendCommands.join(\" \")}`);\n }\n\n state.setInstanceInfo(instanceName, {\n type: \"docker\",\n upCommands: [\n {\n cmd: \"docker\",\n args: [\n \"compose\",\n `--file=${composeDstPath}`,\n \"up\",\n \"--detach\",\n \"--remove-orphans\",\n \"--pull=missing\",\n ],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n downCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n cleanupCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\", \"--volumes\", \"--remove-orphans\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: \"FS\", rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createDocker(\n instanceName: string,\n localRoot: string,\n options?: {\n primaryStorageURL?: string;\n workStoragePath?: string;\n libraryStorageURL?: string;\n customMounts?: { hostPath: string; containerPath?: string }[];\n\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n grpcPort?: number;\n grpcAddr?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n\n backendCommands?: string[];\n },\n ): instanceInfo {\n this.logger.debug(\"creating platforma instance in 'docker' mode...\");\n\n const composeFSPath = pkg.assets(\"compose-backend.yaml\");\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: \"0775\" });\n return p;\n };\n\n const logFilePath = storagePath(\"logs\", \"platforma.log\");\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, \"\");\n }\n\n const dbFSPath = storageDir(\"db\");\n const primaryFSPath = storageDir(\"primary\");\n const libraryFSPath = storageDir(\"library\");\n const workFSPath = storageDir(\"work\");\n const usersFSPath = storagePath(\"users.htpasswd\");\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets(\"users.htpasswd\"), usersFSPath);\n }\n\n const composeDstPath = storagePath(\"compose.yaml\");\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n this.logger.debug(\n `Rendering docker compose file '${composeDstPath}' using '${composeFSPath}' as base template`,\n );\n composeCfg.render(\n composeFSPath,\n composeDstPath,\n `pl-${instanceName}`,\n new Map([\n [\n \"backend\",\n {\n platform: options?.platformOverride,\n mounts: backendMounts,\n commands: options?.backendCommands,\n },\n ],\n ]),\n );\n\n const primary = plCfg.storageSettingsFromURL(\n options?.primaryStorageURL ?? `file:${primaryFSPath}`,\n \".\",\n );\n const library = plCfg.storageSettingsFromURL(\n options?.libraryStorageURL ?? `file:${libraryFSPath}`,\n \".\",\n );\n\n const envs: NodeJS.ProcessEnv = {\n PL_IMAGE: image,\n PL_AUTH_HTPASSWD: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: options?.logLevel ?? \"info\",\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: \"true\",\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: \"1h\",\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: primaryFSPath,\n PL_DATA_LIBRARY_ROOT: libraryFSPath,\n PL_DATA_WORKDIR_ROOT: workFSPath,\n PL_DATA_PACKAGE_ROOT: storageDir(\"packages\"),\n\n ...this.configureDockerStorage(\"primary\", primary),\n ...this.configureDockerStorage(\"library\", library),\n };\n\n if (options?.grpcAddr) {\n const addrParts = options.grpcAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_LISTEN_ADDRESS = addrParts[0];\n envs.PL_LISTEN_PORT = addrParts[1];\n } else {\n envs.PL_LISTEN_ADDRESS = options.grpcAddr;\n }\n } else if (options?.grpcPort) {\n envs.PL_LISTEN_PORT = options.grpcPort.toString();\n }\n\n if (options?.monitoringAddr) {\n const addrParts = options.monitoringAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_MONITORING_IP = addrParts[0];\n envs.PL_MONITORING_PORT = addrParts[1];\n } else {\n envs.PL_MONITORING_IP = options.monitoringAddr;\n }\n } else if (options?.monitoringPort) {\n envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n }\n\n if (options?.debugAddr) {\n const addrParts = options.debugAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_DEBUG_IP = addrParts[0];\n envs.PL_DEBUG_PORT = addrParts[1];\n } else {\n envs.PL_DEBUG_IP = options.debugAddr;\n }\n } else if (options?.debugPort) {\n envs.PL_DEBUG_PORT = options.debugPort.toString();\n }\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs[\"PL_NO_AUTH\"] = \"false\";\n } else {\n envs[\"PL_NO_AUTH\"] = \"true\";\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === \"htpasswd\") {\n envs[\"PL_AUTH_HTPASSWD\"] = path.resolve(drv.path);\n drv.path = \"/etc/platforma/users.htpasswd\";\n }\n }\n envs[\"PL_AUTH_DRIVERS\"] = JSON.stringify(options.auth.drivers);\n }\n }\n\n // Process additional backend commands\n if (options?.backendCommands && options.backendCommands.length > 0) {\n this.logger.debug(`Adding backend commands: ${options.backendCommands.join(\" \")}`);\n }\n\n state.setInstanceInfo(instanceName, {\n type: \"docker\",\n upCommands: [\n {\n cmd: \"docker\",\n args: [\n \"compose\",\n `--file=${composeDstPath}`,\n \"up\",\n \"--detach\",\n \"--remove-orphans\",\n \"--pull=missing\",\n ],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n downCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n cleanupCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\", \"--volumes\", \"--remove-orphans\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: \"FS\", rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public cleanupInstance(instanceName?: string) {\n const removeWarns: string[] = [];\n const instancesToDrop = new Map<string, instanceInfo>();\n let warnMessage: string = \"\";\n\n if (instanceName) {\n const instance = state.getInstanceInfo(instanceName);\n instancesToDrop.set(instanceName, instance);\n const iType = instance.type;\n switch (iType) {\n case \"docker\": {\n removeWarns.push(\n `docker service 'pl-${instanceName}', including all its volumes and data in '${state.instanceDir(instanceName)}' will be destroyed`,\n );\n break;\n }\n case \"process\": {\n removeWarns.push(`directory '${state.instanceDir(instanceName)}' would be deleted`);\n if (instance.downCommands) {\n removeWarns.push(\n `associated docker service, including all volumes and data will be destroyed`,\n );\n }\n break;\n }\n default:\n util.assertNever(iType);\n }\n\n if (instanceName === state.currentInstanceName) {\n removeWarns.push(\n \"last command run cache ('pl-dev start' shorthand will stop working until next full start command call)\",\n );\n }\n\n warnMessage = `\nYou are going to reset the state of platforma service '${instanceName}':\n - ${removeWarns.join(\"\\n - \")}\n`;\n } else {\n for (const iName of state.instanceList) {\n instancesToDrop.set(iName, state.getInstanceInfo(iName));\n }\n\n removeWarns.push(\n \"last command run cache ('pl-dev start' shorthand will stop working until next full start command call)\",\n `all service configurations stored in: ${state.instanceDir()} (including all associated docker containers and volumes)`,\n );\n\n warnMessage = `\nYou are going to reset the state of all platforma services configured with pl-bootstrap package.\n - ${removeWarns.join(\"\\n - \")}\n`;\n }\n\n this.logger.warn(warnMessage);\n if (!util.askYN(\"Are you sure?\")) {\n this.logger.info(\"Reset action was canceled\");\n return;\n }\n\n for (const [name, instance] of instancesToDrop.entries()) {\n if (instance.cleanupCommands.length) {\n this.logger.info(`Wiping instance ${name} services`);\n const result = run.runCommands(this.logger, instance.cleanupCommands);\n checkRunError(result.executed, `failed to wipe instance ${name} services`);\n }\n\n this.logger.info(`Destroying instance '${name}' data directory`);\n fs.rmSync(state.instanceDir(name), { recursive: true, force: true });\n }\n\n if (!instanceName) {\n this.logger.info(`Destroying state dir '${state.path()}'`);\n fs.rmSync(state.path(), { recursive: true, force: true });\n }\n\n this.logger.info(\n `\\nIf you want to remove all downloaded platforma binaries, delete '${state.binaries()}' dir manually\\n`,\n );\n }\n\n public mergeLicenseEnvs(flags: { license?: string; \"license-file\"?: string }) {\n if (flags.license === undefined) {\n if ((process.env.MI_LICENSE ?? \"\") != \"\") flags.license = process.env.MI_LICENSE;\n else if ((process.env.PL_LICENSE ?? \"\") != \"\") flags.license = process.env.PL_LICENSE;\n }\n\n // set 'license-file' only if license is still undefined\n if (flags[\"license-file\"] === undefined && flags.license === undefined) {\n if ((process.env.MI_LICENSE_FILE ?? \"\") != \"\")\n flags[\"license-file\"] = process.env.MI_LICENSE_FILE;\n else if ((process.env.PL_LICENSE_FILE ?? \"\") != \"\")\n flags[\"license-file\"] = process.env.PL_LICENSE_FILE;\n else if (fs.existsSync(path.resolve(os.homedir(), \".pl.license\")))\n flags[\"license-file\"] = path.resolve(os.homedir(), \".pl.license\");\n }\n }\n\n public initAuthDriversList(\n flags: {\n \"auth-htpasswd-file\"?: string;\n\n \"auth-ldap-server\"?: string;\n \"auth-ldap-default-dn\"?: string;\n },\n workdir: string,\n ): types.authDriver[] | undefined {\n const authDrivers: types.authDriver[] = [];\n if (flags[\"auth-htpasswd-file\"]) {\n authDrivers.push({\n driver: \"htpasswd\",\n path: path.resolve(workdir, flags[\"auth-htpasswd-file\"]),\n });\n }\n\n if (Boolean(flags[\"auth-ldap-server\"]) !== Boolean(flags[\"auth-ldap-default-dn\"])) {\n throw new Error(\n \"LDAP auth settings require both 'server' and 'default DN' options to be set\",\n );\n }\n\n if (flags[\"auth-ldap-server\"]) {\n authDrivers.push({\n driver: \"ldap\",\n serverUrl: flags[\"auth-ldap-server\"],\n defaultDN: flags[\"auth-ldap-default-dn\"]!,\n });\n }\n\n if (authDrivers.length === 0) {\n return undefined;\n }\n\n return [{ driver: \"jwt\", key: this.getLastJwt() }, ...authDrivers] as types.authDriver[];\n }\n\n /** Gets the last stored JWT secret key or generates it and stores in a file. */\n public getLastJwt() {\n const jwtFile = state.path(\"auth.jwt\");\n const encoding = \"utf-8\";\n\n let lastJwt = \"\";\n if (fs.existsSync(jwtFile)) {\n lastJwt = fs.readFileSync(jwtFile, { encoding });\n }\n\n if (lastJwt == \"\") {\n lastJwt = util.randomStr(64);\n fs.writeFileSync(jwtFile, lastJwt, { encoding });\n }\n\n return lastJwt;\n }\n\n private checkLicense(value?: string, file?: string) {\n if (value !== undefined && value != \"\") return;\n\n if (file !== undefined && file != \"\") return;\n\n this.logger.error(`A license for Platforma Backend must be set.\n\nYou can provide the license directly using the '--license' flag\nor use the '--license-file' flag if the license is stored in a file.\n\nAlternatively, you can set it via the environment variables 'MI_LICENSE' or 'PL_LICENSE'.\n\nThe license file can also be set with the variables 'MI_LICENSE_FILE' or 'PL_LICENSE_FILE',\nor stored in '$HOME/.pl.license'.\n\nYou can obtain the license from \"https://platforma.bio/getlicense\".`);\n\n throw new Error(`The license was not provided.`);\n }\n\n private configureDockerStorage(\n storageID: string,\n storage: types.storageOptions,\n ): NodeJS.ProcessEnv {\n const envs: NodeJS.ProcessEnv = {};\n const sType = storage.type;\n storageID = storageID.toUpperCase();\n\n switch (sType) {\n case \"S3\":\n switch (storageID) {\n case \"PRIMARY\": {\n // Construct the S3 URL for primary storage\n if (storage.endpoint && storage.bucketName) {\n envs[\"PL_PRIMARY_STORAGE_S3\"] = `${storage.endpoint}${storage.bucketName}`;\n }\n if (storage.endpoint) envs[\"PL_PRIMARY_STORAGE_S3_ENDPOINT\"] = storage.endpoint;\n if (storage.presignEndpoint)\n envs[\"PL_PRIMARY_STORAGE_S3_EXTERNAL_ENDPOINT\"] = storage.presignEndpoint;\n if (storage.region) envs[\"PL_PRIMARY_STORAGE_S3_REGION\"] = storage.region;\n if (storage.key) envs[\"PL_PRIMARY_STORAGE_S3_KEY\"] = storage.key;\n if (storage.secret) envs[\"PL_PRIMARY_STORAGE_S3_SECRET\"] = storage.secret;\n break;\n }\n case \"LIBRARY\": {\n // Construct the S3 URL for library storage\n if (storage.endpoint && storage.bucketName) {\n envs[\"PL_DATA_LIBRARY_S3_URL\"] = `library=${storage.endpoint}${storage.bucketName}`;\n }\n if (storage.endpoint)\n envs[\"PL_DATA_LIBRARY_S3_ENDPOINT\"] = `library=${storage.endpoint}`;\n if (storage.presignEndpoint)\n envs[\"PL_DATA_LIBRARY_S3_EXTERNAL_ENDPOINT\"] = `library=${storage.presignEndpoint}`;\n if (storage.region) envs[\"PL_DATA_LIBRARY_S3_REGION\"] = `library=${storage.region}`;\n if (storage.key) envs[\"PL_DATA_LIBRARY_S3_KEY\"] = `library=${storage.key}`;\n if (storage.secret) envs[\"PL_DATA_LIBRARY_S3_SECRET\"] = `library=${storage.secret}`;\n break;\n }\n default:\n throw new Error(`Unknown storage ID: ${storageID}`);\n }\n return envs;\n case \"FS\":\n switch (storageID) {\n case \"PRIMARY\":\n if (storage.rootPath) envs[\"PL_PRIMARY_STORAGE_FS\"] = storage.rootPath;\n break;\n case \"LIBRARY\":\n if (storage.rootPath) envs[\"PL_DATA_LIBRARY_FS_PATH\"] = storage.rootPath;\n break;\n default:\n throw new Error(`Unknown storage ID: ${storageID}`);\n }\n return envs;\n\n default:\n util.assertNever(sType);\n }\n\n return {};\n }\n\n private renderRunInfo(\n runInfo: {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n },\n indent: number = 10,\n ) {\n const report: string[] = [];\n\n const column = (t: string) => t.padStart(indent, \" \");\n if (runInfo.configPath) {\n report.push(`${column(\"config\")}: ${runInfo.configPath}`);\n }\n\n if (runInfo.apiAddr) {\n report.push(`${column(\"API\")}: ${runInfo.apiAddr}`);\n } else if (runInfo.apiPort) {\n report.push(`${column(\"API\")}: 127.0.0.1:${runInfo.apiPort.toString()}`);\n } else {\n report.push(`${column(\"API\")}: 127.0.0.1:6345`);\n }\n\n if (runInfo.logPath) {\n report.push(`${column(\"log\")}: ${runInfo.logPath}`);\n }\n\n const primaryType = runInfo.primary?.type;\n switch (primaryType) {\n case undefined:\n break;\n\n case \"FS\":\n report.push(`${column(\"primary\")}: ${runInfo.primary!.rootPath!}`);\n break;\n\n case \"S3\":\n report.push(\n `${column(\"primary\")}: S3 at '${runInfo.primary!.endpoint ?? \"AWS\"}', bucket '${runInfo.primary!.bucketName!}', prefix: '${runInfo.primary!.keyPrefix ?? \"\"}'`,\n );\n break;\n\n default:\n util.assertNever(primaryType);\n }\n\n const libraryType = runInfo.library?.type;\n switch (libraryType) {\n case undefined:\n break;\n\n case \"FS\":\n report.push(`${column(\"library\")}: ${runInfo.library!.rootPath!}`);\n break;\n\n case \"S3\":\n report.push(\n `${column(\"library\")}: S3 at '${runInfo.library!.endpoint ?? \"AWS\"}', bucket '${runInfo.library!.bucketName!}', prefix: '${runInfo.library!.keyPrefix ?? \"\"}'`,\n );\n break;\n\n default:\n util.assertNever(libraryType);\n }\n\n if (runInfo.work) {\n report.push(`${column(\"workdirs\")}: ${runInfo.work.rootPath}`);\n }\n\n if (runInfo.dbPath) {\n report.push(`${column(\"db\")}: ${runInfo.dbPath}`);\n }\n\n return report.join(\"\\n\");\n }\n}\n\nexport function checkRunError(result: SpawnSyncReturns<Buffer>[], message?: string) {\n for (const buffer of result) {\n if (buffer.error) {\n throw buffer.error;\n }\n\n const msg = message ?? \"failed to run command\";\n\n if (buffer.status !== 0) {\n throw new Error(`${msg}, process exited with code '${buffer.status}'`);\n }\n }\n}\n\nexport type createLocalOptions = {\n version?: string;\n sourcesPath?: string;\n binaryPath?: string;\n configPath?: string;\n configOptions?: plCfg.plOptions;\n workdir?: string;\n\n primaryURL?: string;\n libraryURL?: string;\n\n backendCommands?: string[];\n};\n\nexport type createLocalFSOptions = createLocalOptions;\n\nexport type createLocalS3Options = createLocalOptions & {\n minioPort?: number;\n minioConsolePort?: number;\n};\n"],"names":["run.runCommands","util.assertNever","platforma.binaryPath","plCfg.storageSettingsFromURL","plCfg.loadDefaults","pkg.assets","plCfg.render","composeCfg.render","util.ensureDir","pkg.plImageTag","util.askYN","util.randomStr"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","names":["state","path","os","fs"],"sources":["../src/core.ts"],"sourcesContent":["import type { ChildProcess, SpawnSyncReturns } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as pkg from \"./package\";\nimport * as run from \"./run\";\nimport * as composeCfg from \"./templates/compose\";\nimport * as plCfg from \"./templates/pl-config\";\nimport type * as types from \"./templates/types\";\nimport * as platforma from \"./platforma\";\nimport type { instanceInfo, instanceCommand } from \"./state\";\nimport state from \"./state\";\nimport * as util from \"./util\";\nimport type winston from \"winston\";\n\nexport default class Core {\n constructor(private readonly logger: winston.Logger) {}\n\n public startLast(): ChildProcess[] {\n const instance = state.currentInstance;\n if (!instance) {\n this.logger.error(\n \"failed to bring back Platforma Backend in the last started configuration: no last configuration found\",\n );\n throw new Error(\"no previous run info found\");\n }\n\n return this.startInstance(instance);\n }\n\n public startInstance(instance: instanceInfo): ChildProcess[] {\n if (instance.runInfo) {\n const runInfo = this.renderRunInfo(instance.runInfo);\n this.logger.info(`Starting platforma backend instance '${instance.name}':\\n${runInfo}`);\n }\n\n const result = run.runCommands(this.logger, instance.upCommands);\n checkRunError(result.executed);\n\n if (result.spawned.length > 0 && instance.type === \"process\") {\n instance.pid = result.spawned[result.spawned.length - 1].pid;\n state.setInstanceInfo(instance.name, instance);\n this.logger.info(`instance '${instance.name}' started`);\n }\n\n state.currentInstanceName = instance.name;\n\n return result.spawned;\n }\n\n public stopInstance(instance: instanceInfo) {\n this.logger.info(`stopping platforma backend instance '${instance.name}'...`);\n const result = run.runCommands(this.logger, instance.downCommands);\n checkRunError(result.executed);\n\n const iType = instance.type;\n switch (iType) {\n case \"docker\": {\n return;\n }\n\n case \"process\": {\n if (instance.pid && state.isInstanceActive(instance)) {\n process.kill(instance.pid);\n }\n\n return;\n }\n default:\n util.assertNever(iType);\n }\n }\n\n public switchInstance(instance: instanceInfo): ChildProcess[] {\n // Stop all other active instances before switching to new one;\n for (const iName of state.instanceList) {\n if (iName !== instance.name) {\n const iToStop = state.getInstanceInfo(iName);\n if (state.isInstanceActive(iToStop)) {\n this.stopInstance(iToStop);\n }\n }\n }\n\n return this.startInstance(instance);\n }\n\n public createLocal(instanceName: string, options?: createLocalOptions): instanceInfo {\n let plBinaryPath = platforma.binaryPath(options?.version, \"binaries\", \"platforma\");\n if (options?.sourcesPath) {\n plBinaryPath = path.join(os.tmpdir(), \"platforma-custom-build\");\n }\n if (options?.binaryPath) {\n plBinaryPath = options.binaryPath;\n }\n\n let configPath = options?.configPath;\n const workdir: string =\n options?.workdir ?? (configPath ? process.cwd() : state.instanceDir(instanceName));\n\n if (options?.primaryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n primary: plCfg.storageSettingsFromURL(\n options.primaryURL,\n workdir,\n options.configOptions?.storages?.primary,\n ),\n },\n };\n }\n if (options?.libraryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n library: plCfg.storageSettingsFromURL(\n options.libraryURL,\n workdir,\n options.configOptions?.storages?.library,\n ),\n },\n };\n }\n\n const configOptions = plCfg.loadDefaults(this.getLastJwt(), options?.configOptions);\n\n this.logger.debug(` checking license...`);\n this.checkLicense(\n options?.configOptions?.license?.value,\n options?.configOptions?.license?.file,\n );\n\n const storageDirs: string[] = [\n `${configOptions.localRoot}/packages`,\n `${configOptions.localRoot}/packages-local`,\n `${configOptions.localRoot}/blocks-local`,\n ];\n if (configOptions.storages.primary.type === \"FS\") {\n storageDirs.push(configOptions.storages.primary.rootPath);\n }\n if (configOptions.storages.library.type === \"FS\") {\n storageDirs.push(configOptions.storages.library.rootPath);\n configOptions.hacks.libraryDownloadable = false;\n }\n if (configOptions.storages.work.type === \"FS\") {\n storageDirs.push(configOptions.storages.work.rootPath);\n }\n\n this.logger.debug(\" creating pl state directories...\");\n for (const dir of storageDirs) {\n if (!fs.existsSync(dir)) {\n this.logger.debug(` '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n for (const drv of configOptions.core.auth.drivers) {\n if (drv.driver === \"htpasswd\") {\n if (!fs.existsSync(drv.path)) {\n this.logger.debug(` installing default 'users.htpasswd' to ${drv.path}...`);\n fs.copyFileSync(pkg.assets(\"users.htpasswd\"), drv.path);\n }\n }\n }\n\n if (!configPath) {\n configPath = path.join(configOptions.localRoot, \"config.yaml\");\n this.logger.debug(` rendering configuration '${configPath}'...`);\n fs.writeFileSync(configPath, plCfg.render(configOptions));\n }\n\n const upCommands: instanceCommand[] = [];\n if (options?.sourcesPath) {\n upCommands.push({\n cmd: \"go\",\n args: [\"build\", \"-o\", plBinaryPath, \".\"],\n workdir: path.resolve(options.sourcesPath, \"cmd\", \"platforma\"),\n runOpts: {\n stdio: \"inherit\",\n },\n });\n }\n\n const runBinary: instanceCommand = {\n async: true,\n cmd: plBinaryPath,\n args: [\"--quiet\", \"--config\", configPath],\n workdir: workdir,\n runOpts: {\n stdio: \"inherit\",\n },\n };\n\n if (options?.configOptions?.numCpu) {\n runBinary.runOpts.env = {\n GOMAXPROCS: String(options?.configOptions?.numCpu),\n };\n }\n\n // Process additional environment variables from CLI options\n if (options?.backendCommands) {\n if (!runBinary.runOpts.env) {\n runBinary.runOpts.env = {};\n }\n for (const cmd of options.backendCommands) {\n const equalIndex = cmd.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = cmd.substring(0, equalIndex);\n const value = cmd.substring(equalIndex + 1);\n runBinary.runOpts.env[key] = value;\n } else {\n this.logger.warn(\n `Invalid environment variable format: ${cmd}. Expected format: KEY=VALUE`,\n );\n }\n }\n }\n\n // Process additional backend commands\n if (options?.backendCommands && options.backendCommands.length > 0) {\n this.logger.debug(`Adding backend commands: ${options.backendCommands.join(\" \")}`);\n // Add commands as arguments to the binary\n runBinary.args = [...runBinary.args, ...options.backendCommands];\n }\n\n upCommands.push(runBinary);\n\n state.setInstanceInfo(instanceName, {\n type: \"process\",\n upCommands: upCommands,\n downCommands: [],\n cleanupCommands: [],\n runInfo: {\n configPath,\n dbPath: configOptions.core.db.path,\n apiAddr: configOptions.grpc.listen,\n logPath: configOptions.log.path,\n primary: configOptions.storages.primary,\n work: configOptions.storages.work,\n library: configOptions.storages.library,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createLocalS3(instanceName: string, options?: createLocalS3Options): instanceInfo {\n this.logger.debug(\"creating platforma instance in 'local s3' mode...\");\n\n const minioPort = options?.minioPort ?? 9000;\n\n const instance = this.createLocal(instanceName, {\n ...options,\n primaryURL:\n options?.primaryURL ??\n `s3e://testuser:testpassword@localhost:${minioPort}/platforma-primary-bucket/?region=no-region`,\n libraryURL:\n options?.libraryURL ??\n `s3e://testuser:testpassword@localhost:${minioPort}/platforma-library-bucket/?region=no-region`,\n });\n\n const localRoot = options?.configOptions?.localRoot;\n const minioRunCmd = this.createMinio(instanceName, {\n minioPort: minioPort,\n minioConsolePort: options?.minioConsolePort,\n storage: localRoot ? path.join(localRoot, \"minio\") : undefined,\n });\n\n instance.upCommands = [minioRunCmd.start, ...instance.upCommands];\n\n instance.downCommands = [minioRunCmd.stop, ...instance.downCommands];\n\n instance.cleanupCommands = [minioRunCmd.cleanup, ...instance.cleanupCommands];\n\n state.setInstanceInfo(instanceName, instance);\n return instance;\n }\n\n public createMinio(\n instanceName: string,\n options?: {\n image?: string;\n version?: string;\n minioPort?: number;\n minioConsolePort?: number;\n storage?: string;\n },\n ): {\n start: instanceCommand;\n stop: instanceCommand;\n cleanup: instanceCommand;\n } {\n this.logger.debug(\" creating docker compose for minio service...\");\n const composeSrc = pkg.assets(\"compose-backend.yaml\");\n const composeMinio = state.instanceDir(instanceName, \"compose-minio.yaml\");\n\n composeCfg.render(\n composeSrc,\n composeMinio,\n `pl-${instanceName}-minio`,\n new Map([[\"minio\", {}]]),\n { dropVolumes: true },\n );\n\n const version = options?.version ? `:${options.version}` : \"\";\n this.logger.debug(` minio version: ${version}`);\n const image = options?.image ?? `quay.io/minio/minio${version}`;\n this.logger.debug(` minio image: ${image}`);\n\n const storage = options?.storage ?? state.instanceDir(instanceName, \"minio\");\n util.ensureDir(storage, { mode: \"0775\" });\n\n const minioPort = options?.minioPort ?? 9000;\n const minioConsolePort = options?.minioConsolePort ?? 9001;\n\n const envs = {\n MINIO_IMAGE: image,\n MINIO_STORAGE: path.resolve(storage),\n MINIO_PORT: minioPort.toString(),\n MINIO_CONSOLE_PORT: minioConsolePort.toString(),\n };\n\n return {\n start: {\n cmd: \"docker\",\n args: [\n \"compose\",\n `--file=${composeMinio}`,\n \"up\",\n \"--detach\",\n \"--remove-orphans\",\n \"--pull=missing\",\n ],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: \"inherit\" },\n },\n stop: {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeMinio}`, \"down\"],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: \"inherit\" },\n },\n cleanup: {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeMinio}`, \"down\", \"--volumes\", \"--remove-orphans\"],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: \"inherit\" },\n },\n };\n }\n\n public createDockerS3(\n instanceName: string,\n localRoot: string,\n options?: {\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n\n grpcPort?: number;\n grpcAddr?: string;\n\n presignHost?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n\n s3Port?: number;\n s3ConsolePort?: number;\n\n customMounts?: { hostPath: string; containerPath?: string }[];\n\n backendCommands?: string[];\n },\n ): instanceInfo {\n this.logger.debug(\"creating platforma instance in 'docker s3' mode...\");\n\n const composeS3Path = pkg.assets(\"compose-backend.yaml\");\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: \"0775\" });\n return p;\n };\n\n const logFilePath = storagePath(\"logs\", \"platforma.log\");\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, \"\");\n }\n\n const presignHost = options?.presignHost ?? \"localhost\";\n const presignPort = options?.s3Port ?? 9000;\n\n const primary = plCfg.storageSettingsFromURL(\n `s3e://testuser:testpassword@minio:${presignPort}/platforma-primary-bucket`,\n );\n if (primary.type !== \"S3\") {\n throw new Error(\"primary storage must have 'S3' type in 'docker s3' configuration\");\n } else {\n primary.presignEndpoint = `http://${presignHost}:${presignPort}`;\n }\n\n const library = plCfg.storageSettingsFromURL(\n `s3e://testuser:testpassword@minio:${presignPort}/platforma-library-bucket`,\n );\n if (library.type !== \"S3\") {\n throw new Error(`${library.type} storage type is not supported for library storage`);\n } else {\n library.presignEndpoint = `http://${presignHost}:${presignPort}`;\n }\n\n const dbFSPath = storageDir(\"db\");\n const workFSPath = storageDir(\"work\");\n const usersFSPath = storagePath(\"users.htpasswd\");\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets(\"users.htpasswd\"), usersFSPath);\n }\n\n const composeDstPath = storagePath(\"compose.yaml\");\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n composeCfg.render(\n composeS3Path,\n composeDstPath,\n `pl-${instanceName}`,\n new Map([\n [\"minio\", {}],\n [\n \"backend\",\n {\n platform: options?.platformOverride,\n mounts: backendMounts,\n commands: options?.backendCommands,\n },\n ],\n ]),\n );\n\n const envs: NodeJS.ProcessEnv = {\n MINIO_IMAGE: \"quay.io/minio/minio\",\n MINIO_STORAGE: storageDir(\"minio\"),\n\n PL_IMAGE: image,\n\n PL_AUTH_HTPASSWD: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: options?.logLevel ?? \"info\",\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: \"true\",\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: \"1h\",\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: storageDir(\"primary\"),\n PL_DATA_LIBRARY_ROOT: storageDir(\"library\"),\n PL_DATA_WORKDIR_ROOT: workFSPath,\n\n // Mount packages storage as volume, because APFS is case-insensitive on Mac OS X and this breaks some pl software installation.\n // PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage(\"primary\", primary),\n ...this.configureDockerStorage(\"library\", library),\n };\n\n if (options?.grpcAddr) {\n const addrParts = options.grpcAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_LISTEN_ADDRESS = addrParts[0];\n envs.PL_LISTEN_PORT = addrParts[1];\n } else {\n envs.PL_LISTEN_ADDRESS = options.grpcAddr;\n }\n } else if (options?.grpcPort) {\n envs.PL_LISTEN_PORT = options.grpcPort.toString();\n }\n\n if (options?.monitoringAddr) {\n const addrParts = options.monitoringAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_MONITORING_IP = addrParts[0];\n envs.PL_MONITORING_PORT = addrParts[1];\n } else {\n envs.PL_MONITORING_IP = options.monitoringAddr;\n }\n } else if (options?.monitoringPort) {\n envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n }\n\n if (options?.debugAddr) {\n const addrParts = options.debugAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_DEBUG_IP = addrParts[0];\n envs.PL_DEBUG_PORT = addrParts[1];\n } else {\n envs.PL_DEBUG_IP = options.debugAddr;\n }\n } else if (options?.debugPort) {\n envs.PL_DEBUG_PORT = options.debugPort.toString();\n }\n\n if (options?.s3Port) envs.MINIO_PORT = options.s3Port.toString();\n if (options?.s3ConsolePort) envs.MINIO_CONSOLE_PORT = options.s3ConsolePort.toString();\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs[\"PL_NO_AUTH\"] = \"false\";\n } else {\n envs[\"PL_NO_AUTH\"] = \"true\";\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === \"htpasswd\") {\n envs[\"PL_AUTH_HTPASSWD\"] = path.resolve(drv.path);\n drv.path = \"/etc/platforma/users.htpasswd\";\n }\n }\n envs[\"PL_AUTH_DRIVERS\"] = JSON.stringify(options.auth.drivers);\n }\n }\n\n // Process additional backend commands\n if (options?.backendCommands && options.backendCommands.length > 0) {\n this.logger.debug(`Adding backend commands: ${options.backendCommands.join(\" \")}`);\n }\n\n state.setInstanceInfo(instanceName, {\n type: \"docker\",\n upCommands: [\n {\n cmd: \"docker\",\n args: [\n \"compose\",\n `--file=${composeDstPath}`,\n \"up\",\n \"--detach\",\n \"--remove-orphans\",\n \"--pull=missing\",\n ],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n downCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n cleanupCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\", \"--volumes\", \"--remove-orphans\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: \"FS\", rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createDocker(\n instanceName: string,\n localRoot: string,\n options?: {\n primaryStorageURL?: string;\n workStoragePath?: string;\n libraryStorageURL?: string;\n customMounts?: { hostPath: string; containerPath?: string }[];\n\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n grpcPort?: number;\n grpcAddr?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n\n backendCommands?: string[];\n },\n ): instanceInfo {\n this.logger.debug(\"creating platforma instance in 'docker' mode...\");\n\n const composeFSPath = pkg.assets(\"compose-backend.yaml\");\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: \"0775\" });\n return p;\n };\n\n const logFilePath = storagePath(\"logs\", \"platforma.log\");\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, \"\");\n }\n\n const dbFSPath = storageDir(\"db\");\n const primaryFSPath = storageDir(\"primary\");\n const libraryFSPath = storageDir(\"library\");\n const workFSPath = storageDir(\"work\");\n const usersFSPath = storagePath(\"users.htpasswd\");\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets(\"users.htpasswd\"), usersFSPath);\n }\n\n const composeDstPath = storagePath(\"compose.yaml\");\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n this.logger.debug(\n `Rendering docker compose file '${composeDstPath}' using '${composeFSPath}' as base template`,\n );\n composeCfg.render(\n composeFSPath,\n composeDstPath,\n `pl-${instanceName}`,\n new Map([\n [\n \"backend\",\n {\n platform: options?.platformOverride,\n mounts: backendMounts,\n commands: options?.backendCommands,\n },\n ],\n ]),\n );\n\n const primary = plCfg.storageSettingsFromURL(\n options?.primaryStorageURL ?? `file:${primaryFSPath}`,\n \".\",\n );\n const library = plCfg.storageSettingsFromURL(\n options?.libraryStorageURL ?? `file:${libraryFSPath}`,\n \".\",\n );\n\n const envs: NodeJS.ProcessEnv = {\n PL_IMAGE: image,\n PL_AUTH_HTPASSWD: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: options?.logLevel ?? \"info\",\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: \"true\",\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: \"1h\",\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: primaryFSPath,\n PL_DATA_LIBRARY_ROOT: libraryFSPath,\n PL_DATA_WORKDIR_ROOT: workFSPath,\n PL_DATA_PACKAGE_ROOT: storageDir(\"packages\"),\n\n ...this.configureDockerStorage(\"primary\", primary),\n ...this.configureDockerStorage(\"library\", library),\n };\n\n if (options?.grpcAddr) {\n const addrParts = options.grpcAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_LISTEN_ADDRESS = addrParts[0];\n envs.PL_LISTEN_PORT = addrParts[1];\n } else {\n envs.PL_LISTEN_ADDRESS = options.grpcAddr;\n }\n } else if (options?.grpcPort) {\n envs.PL_LISTEN_PORT = options.grpcPort.toString();\n }\n\n if (options?.monitoringAddr) {\n const addrParts = options.monitoringAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_MONITORING_IP = addrParts[0];\n envs.PL_MONITORING_PORT = addrParts[1];\n } else {\n envs.PL_MONITORING_IP = options.monitoringAddr;\n }\n } else if (options?.monitoringPort) {\n envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n }\n\n if (options?.debugAddr) {\n const addrParts = options.debugAddr.split(\":\");\n if (addrParts.length === 2) {\n envs.PL_DEBUG_IP = addrParts[0];\n envs.PL_DEBUG_PORT = addrParts[1];\n } else {\n envs.PL_DEBUG_IP = options.debugAddr;\n }\n } else if (options?.debugPort) {\n envs.PL_DEBUG_PORT = options.debugPort.toString();\n }\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs[\"PL_NO_AUTH\"] = \"false\";\n } else {\n envs[\"PL_NO_AUTH\"] = \"true\";\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === \"htpasswd\") {\n envs[\"PL_AUTH_HTPASSWD\"] = path.resolve(drv.path);\n drv.path = \"/etc/platforma/users.htpasswd\";\n }\n }\n envs[\"PL_AUTH_DRIVERS\"] = JSON.stringify(options.auth.drivers);\n }\n }\n\n // Process additional backend commands\n if (options?.backendCommands && options.backendCommands.length > 0) {\n this.logger.debug(`Adding backend commands: ${options.backendCommands.join(\" \")}`);\n }\n\n state.setInstanceInfo(instanceName, {\n type: \"docker\",\n upCommands: [\n {\n cmd: \"docker\",\n args: [\n \"compose\",\n `--file=${composeDstPath}`,\n \"up\",\n \"--detach\",\n \"--remove-orphans\",\n \"--pull=missing\",\n ],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n downCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n cleanupCommands: [\n {\n cmd: \"docker\",\n args: [\"compose\", `--file=${composeDstPath}`, \"down\", \"--volumes\", \"--remove-orphans\"],\n envs: envs,\n runOpts: { stdio: \"inherit\" },\n },\n ],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: \"FS\", rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public cleanupInstance(instanceName?: string) {\n const removeWarns: string[] = [];\n const instancesToDrop = new Map<string, instanceInfo>();\n let warnMessage: string = \"\";\n\n if (instanceName) {\n const instance = state.getInstanceInfo(instanceName);\n instancesToDrop.set(instanceName, instance);\n const iType = instance.type;\n switch (iType) {\n case \"docker\": {\n removeWarns.push(\n `docker service 'pl-${instanceName}', including all its volumes and data in '${state.instanceDir(instanceName)}' will be destroyed`,\n );\n break;\n }\n case \"process\": {\n removeWarns.push(`directory '${state.instanceDir(instanceName)}' would be deleted`);\n if (instance.downCommands) {\n removeWarns.push(\n `associated docker service, including all volumes and data will be destroyed`,\n );\n }\n break;\n }\n default:\n util.assertNever(iType);\n }\n\n if (instanceName === state.currentInstanceName) {\n removeWarns.push(\n \"last command run cache ('pl-dev start' shorthand will stop working until next full start command call)\",\n );\n }\n\n warnMessage = `\nYou are going to reset the state of platforma service '${instanceName}':\n - ${removeWarns.join(\"\\n - \")}\n`;\n } else {\n for (const iName of state.instanceList) {\n instancesToDrop.set(iName, state.getInstanceInfo(iName));\n }\n\n removeWarns.push(\n \"last command run cache ('pl-dev start' shorthand will stop working until next full start command call)\",\n `all service configurations stored in: ${state.instanceDir()} (including all associated docker containers and volumes)`,\n );\n\n warnMessage = `\nYou are going to reset the state of all platforma services configured with pl-bootstrap package.\n - ${removeWarns.join(\"\\n - \")}\n`;\n }\n\n this.logger.warn(warnMessage);\n if (!util.askYN(\"Are you sure?\")) {\n this.logger.info(\"Reset action was canceled\");\n return;\n }\n\n for (const [name, instance] of instancesToDrop.entries()) {\n if (instance.cleanupCommands.length) {\n this.logger.info(`Wiping instance ${name} services`);\n const result = run.runCommands(this.logger, instance.cleanupCommands);\n checkRunError(result.executed, `failed to wipe instance ${name} services`);\n }\n\n this.logger.info(`Destroying instance '${name}' data directory`);\n fs.rmSync(state.instanceDir(name), { recursive: true, force: true });\n }\n\n if (!instanceName) {\n this.logger.info(`Destroying state dir '${state.path()}'`);\n fs.rmSync(state.path(), { recursive: true, force: true });\n }\n\n this.logger.info(\n `\\nIf you want to remove all downloaded platforma binaries, delete '${state.binaries()}' dir manually\\n`,\n );\n }\n\n public mergeLicenseEnvs(flags: { license?: string; \"license-file\"?: string }) {\n if (flags.license === undefined) {\n if ((process.env.MI_LICENSE ?? \"\") != \"\") flags.license = process.env.MI_LICENSE;\n else if ((process.env.PL_LICENSE ?? \"\") != \"\") flags.license = process.env.PL_LICENSE;\n }\n\n // set 'license-file' only if license is still undefined\n if (flags[\"license-file\"] === undefined && flags.license === undefined) {\n if ((process.env.MI_LICENSE_FILE ?? \"\") != \"\")\n flags[\"license-file\"] = process.env.MI_LICENSE_FILE;\n else if ((process.env.PL_LICENSE_FILE ?? \"\") != \"\")\n flags[\"license-file\"] = process.env.PL_LICENSE_FILE;\n else if (fs.existsSync(path.resolve(os.homedir(), \".pl.license\")))\n flags[\"license-file\"] = path.resolve(os.homedir(), \".pl.license\");\n }\n }\n\n public initAuthDriversList(\n flags: {\n \"auth-htpasswd-file\"?: string;\n\n \"auth-ldap-server\"?: string;\n \"auth-ldap-default-dn\"?: string;\n },\n workdir: string,\n ): types.authDriver[] | undefined {\n const authDrivers: types.authDriver[] = [];\n if (flags[\"auth-htpasswd-file\"]) {\n authDrivers.push({\n driver: \"htpasswd\",\n path: path.resolve(workdir, flags[\"auth-htpasswd-file\"]),\n });\n }\n\n if (Boolean(flags[\"auth-ldap-server\"]) !== Boolean(flags[\"auth-ldap-default-dn\"])) {\n throw new Error(\n \"LDAP auth settings require both 'server' and 'default DN' options to be set\",\n );\n }\n\n if (flags[\"auth-ldap-server\"]) {\n authDrivers.push({\n driver: \"ldap\",\n serverUrl: flags[\"auth-ldap-server\"],\n defaultDN: flags[\"auth-ldap-default-dn\"]!,\n });\n }\n\n if (authDrivers.length === 0) {\n return undefined;\n }\n\n return [{ driver: \"jwt\", key: this.getLastJwt() }, ...authDrivers] as types.authDriver[];\n }\n\n /** Gets the last stored JWT secret key or generates it and stores in a file. */\n public getLastJwt() {\n const jwtFile = state.path(\"auth.jwt\");\n const encoding = \"utf-8\";\n\n let lastJwt = \"\";\n if (fs.existsSync(jwtFile)) {\n lastJwt = fs.readFileSync(jwtFile, { encoding });\n }\n\n if (lastJwt == \"\") {\n lastJwt = util.randomStr(64);\n fs.writeFileSync(jwtFile, lastJwt, { encoding });\n }\n\n return lastJwt;\n }\n\n private checkLicense(value?: string, file?: string) {\n if (value !== undefined && value != \"\") return;\n\n if (file !== undefined && file != \"\") return;\n\n this.logger.error(`A license for Platforma Backend must be set.\n\nYou can provide the license directly using the '--license' flag\nor use the '--license-file' flag if the license is stored in a file.\n\nAlternatively, you can set it via the environment variables 'MI_LICENSE' or 'PL_LICENSE'.\n\nThe license file can also be set with the variables 'MI_LICENSE_FILE' or 'PL_LICENSE_FILE',\nor stored in '$HOME/.pl.license'.\n\nYou can obtain the license from \"https://platforma.bio/getlicense\".`);\n\n throw new Error(`The license was not provided.`);\n }\n\n private configureDockerStorage(\n storageID: string,\n storage: types.storageOptions,\n ): NodeJS.ProcessEnv {\n const envs: NodeJS.ProcessEnv = {};\n const sType = storage.type;\n storageID = storageID.toUpperCase();\n\n switch (sType) {\n case \"S3\":\n switch (storageID) {\n case \"PRIMARY\": {\n // Construct the S3 URL for primary storage\n if (storage.endpoint && storage.bucketName) {\n envs[\"PL_PRIMARY_STORAGE_S3\"] = `${storage.endpoint}${storage.bucketName}`;\n }\n if (storage.endpoint) envs[\"PL_PRIMARY_STORAGE_S3_ENDPOINT\"] = storage.endpoint;\n if (storage.presignEndpoint)\n envs[\"PL_PRIMARY_STORAGE_S3_EXTERNAL_ENDPOINT\"] = storage.presignEndpoint;\n if (storage.region) envs[\"PL_PRIMARY_STORAGE_S3_REGION\"] = storage.region;\n if (storage.key) envs[\"PL_PRIMARY_STORAGE_S3_KEY\"] = storage.key;\n if (storage.secret) envs[\"PL_PRIMARY_STORAGE_S3_SECRET\"] = storage.secret;\n break;\n }\n case \"LIBRARY\": {\n // Construct the S3 URL for library storage\n if (storage.endpoint && storage.bucketName) {\n envs[\"PL_DATA_LIBRARY_S3_URL\"] = `library=${storage.endpoint}${storage.bucketName}`;\n }\n if (storage.endpoint)\n envs[\"PL_DATA_LIBRARY_S3_ENDPOINT\"] = `library=${storage.endpoint}`;\n if (storage.presignEndpoint)\n envs[\"PL_DATA_LIBRARY_S3_EXTERNAL_ENDPOINT\"] = `library=${storage.presignEndpoint}`;\n if (storage.region) envs[\"PL_DATA_LIBRARY_S3_REGION\"] = `library=${storage.region}`;\n if (storage.key) envs[\"PL_DATA_LIBRARY_S3_KEY\"] = `library=${storage.key}`;\n if (storage.secret) envs[\"PL_DATA_LIBRARY_S3_SECRET\"] = `library=${storage.secret}`;\n break;\n }\n default:\n throw new Error(`Unknown storage ID: ${storageID}`);\n }\n return envs;\n case \"FS\":\n switch (storageID) {\n case \"PRIMARY\":\n if (storage.rootPath) envs[\"PL_PRIMARY_STORAGE_FS\"] = storage.rootPath;\n break;\n case \"LIBRARY\":\n if (storage.rootPath) envs[\"PL_DATA_LIBRARY_FS_PATH\"] = storage.rootPath;\n break;\n default:\n throw new Error(`Unknown storage ID: ${storageID}`);\n }\n return envs;\n\n default:\n util.assertNever(sType);\n }\n\n return {};\n }\n\n private renderRunInfo(\n runInfo: {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n },\n indent: number = 10,\n ) {\n const report: string[] = [];\n\n const column = (t: string) => t.padStart(indent, \" \");\n if (runInfo.configPath) {\n report.push(`${column(\"config\")}: ${runInfo.configPath}`);\n }\n\n if (runInfo.apiAddr) {\n report.push(`${column(\"API\")}: ${runInfo.apiAddr}`);\n } else if (runInfo.apiPort) {\n report.push(`${column(\"API\")}: 127.0.0.1:${runInfo.apiPort.toString()}`);\n } else {\n report.push(`${column(\"API\")}: 127.0.0.1:6345`);\n }\n\n if (runInfo.logPath) {\n report.push(`${column(\"log\")}: ${runInfo.logPath}`);\n }\n\n const primaryType = runInfo.primary?.type;\n switch (primaryType) {\n case undefined:\n break;\n\n case \"FS\":\n report.push(`${column(\"primary\")}: ${runInfo.primary!.rootPath!}`);\n break;\n\n case \"S3\":\n report.push(\n `${column(\"primary\")}: S3 at '${runInfo.primary!.endpoint ?? \"AWS\"}', bucket '${runInfo.primary!.bucketName!}', prefix: '${runInfo.primary!.keyPrefix ?? \"\"}'`,\n );\n break;\n\n default:\n util.assertNever(primaryType);\n }\n\n const libraryType = runInfo.library?.type;\n switch (libraryType) {\n case undefined:\n break;\n\n case \"FS\":\n report.push(`${column(\"library\")}: ${runInfo.library!.rootPath!}`);\n break;\n\n case \"S3\":\n report.push(\n `${column(\"library\")}: S3 at '${runInfo.library!.endpoint ?? \"AWS\"}', bucket '${runInfo.library!.bucketName!}', prefix: '${runInfo.library!.keyPrefix ?? \"\"}'`,\n );\n break;\n\n default:\n util.assertNever(libraryType);\n }\n\n if (runInfo.work) {\n report.push(`${column(\"workdirs\")}: ${runInfo.work.rootPath}`);\n }\n\n if (runInfo.dbPath) {\n report.push(`${column(\"db\")}: ${runInfo.dbPath}`);\n }\n\n return report.join(\"\\n\");\n }\n}\n\nexport function checkRunError(result: SpawnSyncReturns<Buffer>[], message?: string) {\n for (const buffer of result) {\n if (buffer.error) {\n throw buffer.error;\n }\n\n const msg = message ?? \"failed to run command\";\n\n if (buffer.status !== 0) {\n throw new Error(`${msg}, process exited with code '${buffer.status}'`);\n }\n }\n}\n\nexport type createLocalOptions = {\n version?: string;\n sourcesPath?: string;\n binaryPath?: string;\n configPath?: string;\n configOptions?: plCfg.plOptions;\n workdir?: string;\n\n primaryURL?: string;\n libraryURL?: string;\n\n backendCommands?: string[];\n};\n\nexport type createLocalFSOptions = createLocalOptions;\n\nexport type createLocalS3Options = createLocalOptions & {\n minioPort?: number;\n minioConsolePort?: number;\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,IAAqB,OAArB,MAA0B;CACxB,YAAY,AAAiB,QAAwB;EAAxB;;CAE7B,AAAO,YAA4B;EACjC,MAAM,WAAWA,sBAAM;AACvB,MAAI,CAAC,UAAU;AACb,QAAK,OAAO,MACV,wGACD;AACD,SAAM,IAAI,MAAM,6BAA6B;;AAG/C,SAAO,KAAK,cAAc,SAAS;;CAGrC,AAAO,cAAc,UAAwC;AAC3D,MAAI,SAAS,SAAS;GACpB,MAAM,UAAU,KAAK,cAAc,SAAS,QAAQ;AACpD,QAAK,OAAO,KAAK,wCAAwC,SAAS,KAAK,MAAM,UAAU;;EAGzF,MAAM,iCAAyB,KAAK,QAAQ,SAAS,WAAW;AAChE,gBAAc,OAAO,SAAS;AAE9B,MAAI,OAAO,QAAQ,SAAS,KAAK,SAAS,SAAS,WAAW;AAC5D,YAAS,MAAM,OAAO,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACzD,yBAAM,gBAAgB,SAAS,MAAM,SAAS;AAC9C,QAAK,OAAO,KAAK,aAAa,SAAS,KAAK,WAAW;;AAGzD,wBAAM,sBAAsB,SAAS;AAErC,SAAO,OAAO;;CAGhB,AAAO,aAAa,UAAwB;AAC1C,OAAK,OAAO,KAAK,wCAAwC,SAAS,KAAK,MAAM;AAE7E,wCAD+B,KAAK,QAAQ,SAAS,aAAa,CAC7C,SAAS;EAE9B,MAAM,QAAQ,SAAS;AACvB,UAAQ,OAAR;GACE,KAAK,SACH;GAGF,KAAK;AACH,QAAI,SAAS,OAAOA,sBAAM,iBAAiB,SAAS,CAClD,SAAQ,KAAK,SAAS,IAAI;AAG5B;GAEF,QACE,0BAAiB,MAAM;;;CAI7B,AAAO,eAAe,UAAwC;AAE5D,OAAK,MAAM,SAASA,sBAAM,aACxB,KAAI,UAAU,SAAS,MAAM;GAC3B,MAAM,UAAUA,sBAAM,gBAAgB,MAAM;AAC5C,OAAIA,sBAAM,iBAAiB,QAAQ,CACjC,MAAK,aAAa,QAAQ;;AAKhC,SAAO,KAAK,cAAc,SAAS;;CAGrC,AAAO,YAAY,cAAsB,SAA4C;EACnF,IAAI,4CAAoC,SAAS,SAAS,YAAY,YAAY;AAClF,MAAI,SAAS,YACX,gBAAeC,kBAAK,KAAKC,gBAAG,QAAQ,EAAE,yBAAyB;AAEjE,MAAI,SAAS,WACX,gBAAe,QAAQ;EAGzB,IAAI,aAAa,SAAS;EAC1B,MAAM,UACJ,SAAS,YAAY,aAAa,QAAQ,KAAK,GAAGF,sBAAM,YAAY,aAAa;AAEnF,MAAI,SAAS,WACX,SAAQ,gBAAgB;GACtB,GAAG,QAAQ;GACX,UAAU;IACR,GAAG,QAAQ,eAAe;IAC1B,kDACE,QAAQ,YACR,SACA,QAAQ,eAAe,UAAU,QAClC;IACF;GACF;AAEH,MAAI,SAAS,WACX,SAAQ,gBAAgB;GACtB,GAAG,QAAQ;GACX,UAAU;IACR,GAAG,QAAQ,eAAe;IAC1B,kDACE,QAAQ,YACR,SACA,QAAQ,eAAe,UAAU,QAClC;IACF;GACF;EAGH,MAAM,+CAAmC,KAAK,YAAY,EAAE,SAAS,cAAc;AAEnF,OAAK,OAAO,MAAM,wBAAwB;AAC1C,OAAK,aACH,SAAS,eAAe,SAAS,OACjC,SAAS,eAAe,SAAS,KAClC;EAED,MAAM,cAAwB;GAC5B,GAAG,cAAc,UAAU;GAC3B,GAAG,cAAc,UAAU;GAC3B,GAAG,cAAc,UAAU;GAC5B;AACD,MAAI,cAAc,SAAS,QAAQ,SAAS,KAC1C,aAAY,KAAK,cAAc,SAAS,QAAQ,SAAS;AAE3D,MAAI,cAAc,SAAS,QAAQ,SAAS,MAAM;AAChD,eAAY,KAAK,cAAc,SAAS,QAAQ,SAAS;AACzD,iBAAc,MAAM,sBAAsB;;AAE5C,MAAI,cAAc,SAAS,KAAK,SAAS,KACvC,aAAY,KAAK,cAAc,SAAS,KAAK,SAAS;AAGxD,OAAK,OAAO,MAAM,qCAAqC;AACvD,OAAK,MAAM,OAAO,YAChB,KAAI,CAACG,gBAAG,WAAW,IAAI,EAAE;AACvB,QAAK,OAAO,MAAM,QAAQ,IAAI,GAAG;AACjC,mBAAG,UAAU,KAAK,EAAE,WAAW,MAAM,CAAC;;AAI1C,OAAK,MAAM,OAAO,cAAc,KAAK,KAAK,QACxC,KAAI,IAAI,WAAW,YACjB;OAAI,CAACA,gBAAG,WAAW,IAAI,KAAK,EAAE;AAC5B,SAAK,OAAO,MAAM,4CAA4C,IAAI,KAAK,KAAK;AAC5E,oBAAG,oCAAwB,iBAAiB,EAAE,IAAI,KAAK;;;AAK7D,MAAI,CAAC,YAAY;AACf,gBAAaF,kBAAK,KAAK,cAAc,WAAW,cAAc;AAC9D,QAAK,OAAO,MAAM,8BAA8B,WAAW,MAAM;AACjE,mBAAG,cAAc,qCAAyB,cAAc,CAAC;;EAG3D,MAAM,aAAgC,EAAE;AACxC,MAAI,SAAS,YACX,YAAW,KAAK;GACd,KAAK;GACL,MAAM;IAAC;IAAS;IAAM;IAAc;IAAI;GACxC,SAASA,kBAAK,QAAQ,QAAQ,aAAa,OAAO,YAAY;GAC9D,SAAS,EACP,OAAO,WACR;GACF,CAAC;EAGJ,MAAM,YAA6B;GACjC,OAAO;GACP,KAAK;GACL,MAAM;IAAC;IAAW;IAAY;IAAW;GAChC;GACT,SAAS,EACP,OAAO,WACR;GACF;AAED,MAAI,SAAS,eAAe,OAC1B,WAAU,QAAQ,MAAM,EACtB,YAAY,OAAO,SAAS,eAAe,OAAO,EACnD;AAIH,MAAI,SAAS,iBAAiB;AAC5B,OAAI,CAAC,UAAU,QAAQ,IACrB,WAAU,QAAQ,MAAM,EAAE;AAE5B,QAAK,MAAM,OAAO,QAAQ,iBAAiB;IACzC,MAAM,aAAa,IAAI,QAAQ,IAAI;AACnC,QAAI,aAAa,GAAG;KAClB,MAAM,MAAM,IAAI,UAAU,GAAG,WAAW;KACxC,MAAM,QAAQ,IAAI,UAAU,aAAa,EAAE;AAC3C,eAAU,QAAQ,IAAI,OAAO;UAE7B,MAAK,OAAO,KACV,wCAAwC,IAAI,8BAC7C;;;AAMP,MAAI,SAAS,mBAAmB,QAAQ,gBAAgB,SAAS,GAAG;AAClE,QAAK,OAAO,MAAM,4BAA4B,QAAQ,gBAAgB,KAAK,IAAI,GAAG;AAElF,aAAU,OAAO,CAAC,GAAG,UAAU,MAAM,GAAG,QAAQ,gBAAgB;;AAGlE,aAAW,KAAK,UAAU;AAE1B,wBAAM,gBAAgB,cAAc;GAClC,MAAM;GACM;GACZ,cAAc,EAAE;GAChB,iBAAiB,EAAE;GACnB,SAAS;IACP;IACA,QAAQ,cAAc,KAAK,GAAG;IAC9B,SAAS,cAAc,KAAK;IAC5B,SAAS,cAAc,IAAI;IAC3B,SAAS,cAAc,SAAS;IAChC,MAAM,cAAc,SAAS;IAC7B,SAAS,cAAc,SAAS;IACjC;GACF,CAAC;AAEF,SAAOD,sBAAM,gBAAgB,aAAa;;CAG5C,AAAO,cAAc,cAAsB,SAA8C;AACvF,OAAK,OAAO,MAAM,oDAAoD;EAEtE,MAAM,YAAY,SAAS,aAAa;EAExC,MAAM,WAAW,KAAK,YAAY,cAAc;GAC9C,GAAG;GACH,YACE,SAAS,cACT,yCAAyC,UAAU;GACrD,YACE,SAAS,cACT,yCAAyC,UAAU;GACtD,CAAC;EAEF,MAAM,YAAY,SAAS,eAAe;EAC1C,MAAM,cAAc,KAAK,YAAY,cAAc;GACtC;GACX,kBAAkB,SAAS;GAC3B,SAAS,YAAYC,kBAAK,KAAK,WAAW,QAAQ,GAAG;GACtD,CAAC;AAEF,WAAS,aAAa,CAAC,YAAY,OAAO,GAAG,SAAS,WAAW;AAEjE,WAAS,eAAe,CAAC,YAAY,MAAM,GAAG,SAAS,aAAa;AAEpE,WAAS,kBAAkB,CAAC,YAAY,SAAS,GAAG,SAAS,gBAAgB;AAE7E,wBAAM,gBAAgB,cAAc,SAAS;AAC7C,SAAO;;CAGT,AAAO,YACL,cACA,SAWA;AACA,OAAK,OAAO,MAAM,iDAAiD;EACnE,MAAM,oCAAwB,uBAAuB;EACrD,MAAM,eAAeD,sBAAM,YAAY,cAAc,qBAAqB;AAE1E,yBACE,YACA,cACA,MAAM,aAAa,SACnB,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EACxB,EAAE,aAAa,MAAM,CACtB;EAED,MAAM,UAAU,SAAS,UAAU,IAAI,QAAQ,YAAY;AAC3D,OAAK,OAAO,MAAM,sBAAsB,UAAU;EAClD,MAAM,QAAQ,SAAS,SAAS,sBAAsB;AACtD,OAAK,OAAO,MAAM,oBAAoB,QAAQ;EAE9C,MAAM,UAAU,SAAS,WAAWA,sBAAM,YAAY,cAAc,QAAQ;AAC5E,yBAAe,SAAS,EAAE,MAAM,QAAQ,CAAC;EAEzC,MAAM,YAAY,SAAS,aAAa;EACxC,MAAM,mBAAmB,SAAS,oBAAoB;EAEtD,MAAM,OAAO;GACX,aAAa;GACb,eAAeC,kBAAK,QAAQ,QAAQ;GACpC,YAAY,UAAU,UAAU;GAChC,oBAAoB,iBAAiB,UAAU;GAChD;AAED,SAAO;GACL,OAAO;IACL,KAAK;IACL,MAAM;KACJ;KACA,UAAU;KACV;KACA;KACA;KACA;KACD;IACK;IACN,SAASD,sBAAM,YAAY,aAAa;IACxC,SAAS,EAAE,OAAO,WAAW;IAC9B;GACD,MAAM;IACJ,KAAK;IACL,MAAM;KAAC;KAAW,UAAU;KAAgB;KAAO;IAC7C;IACN,SAASA,sBAAM,YAAY,aAAa;IACxC,SAAS,EAAE,OAAO,WAAW;IAC9B;GACD,SAAS;IACP,KAAK;IACL,MAAM;KAAC;KAAW,UAAU;KAAgB;KAAQ;KAAa;KAAmB;IAC9E;IACN,SAASA,sBAAM,YAAY,aAAa;IACxC,SAAS,EAAE,OAAO,WAAW;IAC9B;GACF;;CAGH,AAAO,eACL,cACA,WACA,SA6Bc;AACd,OAAK,OAAO,MAAM,qDAAqD;EAEvE,MAAM,uCAA2B,uBAAuB;EACxD,MAAM,QAAQ,SAAS,oCAAwB,SAAS,QAAQ;AAEhE,OAAK,aAAa,SAAS,SAAS,SAAS,YAAY;EAEzD,MAAM,eAAe,GAAG,MAAgBC,kBAAK,KAAK,WAAW,GAAG,EAAE;EAClE,MAAM,cAAc,MAAc;GAChC,MAAM,IAAI,YAAY,EAAE;AACxB,0BAAe,GAAG,EAAE,MAAM,QAAQ,CAAC;AACnC,UAAO;;EAGT,MAAM,cAAc,YAAY,QAAQ,gBAAgB;AACxD,MAAI,CAACE,gBAAG,WAAW,YAAY,EAAE;AAC/B,mBAAG,UAAUF,kBAAK,QAAQ,YAAY,EAAE,EAAE,WAAW,MAAM,CAAC;AAC5D,mBAAG,cAAc,aAAa,GAAG;;EAGnC,MAAM,cAAc,SAAS,eAAe;EAC5C,MAAM,cAAc,SAAS,UAAU;EAEvC,MAAM,mDACJ,qCAAqC,YAAY,2BAClD;AACD,MAAI,QAAQ,SAAS,KACnB,OAAM,IAAI,MAAM,mEAAmE;MAEnF,SAAQ,kBAAkB,UAAU,YAAY,GAAG;EAGrD,MAAM,mDACJ,qCAAqC,YAAY,2BAClD;AACD,MAAI,QAAQ,SAAS,KACnB,OAAM,IAAI,MAAM,GAAG,QAAQ,KAAK,oDAAoD;MAEpF,SAAQ,kBAAkB,UAAU,YAAY,GAAG;EAGrD,MAAM,WAAW,WAAW,KAAK;EACjC,MAAM,aAAa,WAAW,OAAO;EACrC,MAAM,cAAc,YAAY,iBAAiB;AACjD,MAAI,CAACE,gBAAG,WAAW,YAAY,CAC7B,iBAAG,oCAAwB,iBAAiB,EAAE,YAAY;EAG5D,MAAM,iBAAiB,YAAY,eAAe;AAClD,MAAIA,gBAAG,WAAW,eAAe,CAC/B,MAAK,OAAO,KAAK,iCAAiC,iBAAiB;EAGrE,MAAM,gBAAgD,EAAE;AACxD,OAAK,MAAM,OAAO,SAAS,gBAAgB,EAAE,CAC3C,eAAc,KAAK;GACjB,UAAU,IAAI;GACd,eAAe,IAAI,iBAAiB,IAAI;GACzC,CAAC;AAEJ,yBACE,eACA,gBACA,MAAM,gBACN,IAAI,IAAI,CACN,CAAC,SAAS,EAAE,CAAC,EACb,CACE,WACA;GACE,UAAU,SAAS;GACnB,QAAQ;GACR,UAAU,SAAS;GACpB,CACF,CACF,CAAC,CACH;EAED,MAAM,OAA0B;GAC9B,aAAa;GACb,eAAe,WAAW,QAAQ;GAElC,UAAU;GAEV,kBAAkB;GAClB,YAAY,SAAS;GACrB,iBAAiB,SAAS;GAE1B,cAAc,SAAS,YAAY;GACnC,YAAYF,kBAAK,QAAQ,YAAY;GACrC,yBAAyB;GAEzB,+BAA+B;GAE/B,iBAAiB;GACjB,sBAAsB,WAAW,UAAU;GAC3C,sBAAsB,WAAW,UAAU;GAC3C,sBAAsB;GAKtB,GAAG,KAAK,uBAAuB,WAAW,QAAQ;GAClD,GAAG,KAAK,uBAAuB,WAAW,QAAQ;GACnD;AAED,MAAI,SAAS,UAAU;GACrB,MAAM,YAAY,QAAQ,SAAS,MAAM,IAAI;AAC7C,OAAI,UAAU,WAAW,GAAG;AAC1B,SAAK,oBAAoB,UAAU;AACnC,SAAK,iBAAiB,UAAU;SAEhC,MAAK,oBAAoB,QAAQ;aAE1B,SAAS,SAClB,MAAK,iBAAiB,QAAQ,SAAS,UAAU;AAGnD,MAAI,SAAS,gBAAgB;GAC3B,MAAM,YAAY,QAAQ,eAAe,MAAM,IAAI;AACnD,OAAI,UAAU,WAAW,GAAG;AAC1B,SAAK,mBAAmB,UAAU;AAClC,SAAK,qBAAqB,UAAU;SAEpC,MAAK,mBAAmB,QAAQ;aAEzB,SAAS,eAClB,MAAK,qBAAqB,QAAQ,eAAe,UAAU;AAG7D,MAAI,SAAS,WAAW;GACtB,MAAM,YAAY,QAAQ,UAAU,MAAM,IAAI;AAC9C,OAAI,UAAU,WAAW,GAAG;AAC1B,SAAK,cAAc,UAAU;AAC7B,SAAK,gBAAgB,UAAU;SAE/B,MAAK,cAAc,QAAQ;aAEpB,SAAS,UAClB,MAAK,gBAAgB,QAAQ,UAAU,UAAU;AAGnD,MAAI,SAAS,OAAQ,MAAK,aAAa,QAAQ,OAAO,UAAU;AAChE,MAAI,SAAS,cAAe,MAAK,qBAAqB,QAAQ,cAAc,UAAU;AAEtF,MAAI,SAAS,MAAM;AACjB,OAAI,QAAQ,KAAK,QACf,MAAK,gBAAgB;OAErB,MAAK,gBAAgB;AAEvB,OAAI,QAAQ,KAAK,SAAS;AACxB,SAAK,MAAM,OAAO,QAAQ,KAAK,QAC7B,KAAI,IAAI,WAAW,YAAY;AAC7B,UAAK,sBAAsBA,kBAAK,QAAQ,IAAI,KAAK;AACjD,SAAI,OAAO;;AAGf,SAAK,qBAAqB,KAAK,UAAU,QAAQ,KAAK,QAAQ;;;AAKlE,MAAI,SAAS,mBAAmB,QAAQ,gBAAgB,SAAS,EAC/D,MAAK,OAAO,MAAM,4BAA4B,QAAQ,gBAAgB,KAAK,IAAI,GAAG;AAGpF,wBAAM,gBAAgB,cAAc;GAClC,MAAM;GACN,YAAY,CACV;IACE,KAAK;IACL,MAAM;KACJ;KACA,UAAU;KACV;KACA;KACA;KACA;KACD;IACK;IACN,SAAS,EAAE,OAAO,WAAW;IAC9B,CACF;GACD,cAAc,CACZ;IACE,KAAK;IACL,MAAM;KAAC;KAAW,UAAU;KAAkB;KAAO;IAC/C;IACN,SAAS,EAAE,OAAO,WAAW;IAC9B,CACF;GACD,iBAAiB,CACf;IACE,KAAK;IACL,MAAM;KAAC;KAAW,UAAU;KAAkB;KAAQ;KAAa;KAAmB;IAChF;IACN,SAAS,EAAE,OAAO,WAAW;IAC9B,CACF;GACD,SAAS;IACP,SAAS,SAAS;IAClB,SAAS,SAAS;IAClB,SAAS;IACA;IACT,MAAM;KAAE,MAAM;KAAM,UAAU;KAAY;IACjC;IACT,QAAQ;IACT;GACF,CAAC;AAEF,SAAOD,sBAAM,gBAAgB,aAAa;;CAG5C,AAAO,aACL,cACA,WACA,SA2Bc;AACd,OAAK,OAAO,MAAM,kDAAkD;EAEpE,MAAM,uCAA2B,uBAAuB;EACxD,MAAM,QAAQ,SAAS,oCAAwB,SAAS,QAAQ;AAEhE,OAAK,aAAa,SAAS,SAAS,SAAS,YAAY;EAEzD,MAAM,eAAe,GAAG,MAAgBC,kBAAK,KAAK,WAAW,GAAG,EAAE;EAClE,MAAM,cAAc,MAAc;GAChC,MAAM,IAAI,YAAY,EAAE;AACxB,0BAAe,GAAG,EAAE,MAAM,QAAQ,CAAC;AACnC,UAAO;;EAGT,MAAM,cAAc,YAAY,QAAQ,gBAAgB;AACxD,MAAI,CAACE,gBAAG,WAAW,YAAY,EAAE;AAC/B,mBAAG,UAAUF,kBAAK,QAAQ,YAAY,EAAE,EAAE,WAAW,MAAM,CAAC;AAC5D,mBAAG,cAAc,aAAa,GAAG;;EAGnC,MAAM,WAAW,WAAW,KAAK;EACjC,MAAM,gBAAgB,WAAW,UAAU;EAC3C,MAAM,gBAAgB,WAAW,UAAU;EAC3C,MAAM,aAAa,WAAW,OAAO;EACrC,MAAM,cAAc,YAAY,iBAAiB;AACjD,MAAI,CAACE,gBAAG,WAAW,YAAY,CAC7B,iBAAG,oCAAwB,iBAAiB,EAAE,YAAY;EAG5D,MAAM,iBAAiB,YAAY,eAAe;AAClD,MAAIA,gBAAG,WAAW,eAAe,CAC/B,MAAK,OAAO,KAAK,iCAAiC,iBAAiB;EAGrE,MAAM,gBAAgD,EAAE;AACxD,OAAK,MAAM,OAAO,SAAS,gBAAgB,EAAE,CAC3C,eAAc,KAAK;GACjB,UAAU,IAAI;GACd,eAAe,IAAI,iBAAiB,IAAI;GACzC,CAAC;AAEJ,OAAK,OAAO,MACV,kCAAkC,eAAe,WAAW,cAAc,oBAC3E;AACD,yBACE,eACA,gBACA,MAAM,gBACN,IAAI,IAAI,CACN,CACE,WACA;GACE,UAAU,SAAS;GACnB,QAAQ;GACR,UAAU,SAAS;GACpB,CACF,CACF,CAAC,CACH;EAED,MAAM,mDACJ,SAAS,qBAAqB,QAAQ,iBACtC,IACD;EACD,MAAM,mDACJ,SAAS,qBAAqB,QAAQ,iBACtC,IACD;EAED,MAAM,OAA0B;GAC9B,UAAU;GACV,kBAAkB;GAClB,YAAY,SAAS;GACrB,iBAAiB,SAAS;GAE1B,cAAc,SAAS,YAAY;GACnC,YAAYF,kBAAK,QAAQ,YAAY;GACrC,yBAAyB;GAEzB,+BAA+B;GAE/B,iBAAiB;GACjB,sBAAsB;GACtB,sBAAsB;GACtB,sBAAsB;GACtB,sBAAsB,WAAW,WAAW;GAE5C,GAAG,KAAK,uBAAuB,WAAW,QAAQ;GAClD,GAAG,KAAK,uBAAuB,WAAW,QAAQ;GACnD;AAED,MAAI,SAAS,UAAU;GACrB,MAAM,YAAY,QAAQ,SAAS,MAAM,IAAI;AAC7C,OAAI,UAAU,WAAW,GAAG;AAC1B,SAAK,oBAAoB,UAAU;AACnC,SAAK,iBAAiB,UAAU;SAEhC,MAAK,oBAAoB,QAAQ;aAE1B,SAAS,SAClB,MAAK,iBAAiB,QAAQ,SAAS,UAAU;AAGnD,MAAI,SAAS,gBAAgB;GAC3B,MAAM,YAAY,QAAQ,eAAe,MAAM,IAAI;AACnD,OAAI,UAAU,WAAW,GAAG;AAC1B,SAAK,mBAAmB,UAAU;AAClC,SAAK,qBAAqB,UAAU;SAEpC,MAAK,mBAAmB,QAAQ;aAEzB,SAAS,eAClB,MAAK,qBAAqB,QAAQ,eAAe,UAAU;AAG7D,MAAI,SAAS,WAAW;GACtB,MAAM,YAAY,QAAQ,UAAU,MAAM,IAAI;AAC9C,OAAI,UAAU,WAAW,GAAG;AAC1B,SAAK,cAAc,UAAU;AAC7B,SAAK,gBAAgB,UAAU;SAE/B,MAAK,cAAc,QAAQ;aAEpB,SAAS,UAClB,MAAK,gBAAgB,QAAQ,UAAU,UAAU;AAGnD,MAAI,SAAS,MAAM;AACjB,OAAI,QAAQ,KAAK,QACf,MAAK,gBAAgB;OAErB,MAAK,gBAAgB;AAEvB,OAAI,QAAQ,KAAK,SAAS;AACxB,SAAK,MAAM,OAAO,QAAQ,KAAK,QAC7B,KAAI,IAAI,WAAW,YAAY;AAC7B,UAAK,sBAAsBA,kBAAK,QAAQ,IAAI,KAAK;AACjD,SAAI,OAAO;;AAGf,SAAK,qBAAqB,KAAK,UAAU,QAAQ,KAAK,QAAQ;;;AAKlE,MAAI,SAAS,mBAAmB,QAAQ,gBAAgB,SAAS,EAC/D,MAAK,OAAO,MAAM,4BAA4B,QAAQ,gBAAgB,KAAK,IAAI,GAAG;AAGpF,wBAAM,gBAAgB,cAAc;GAClC,MAAM;GACN,YAAY,CACV;IACE,KAAK;IACL,MAAM;KACJ;KACA,UAAU;KACV;KACA;KACA;KACA;KACD;IACK;IACN,SAAS,EAAE,OAAO,WAAW;IAC9B,CACF;GACD,cAAc,CACZ;IACE,KAAK;IACL,MAAM;KAAC;KAAW,UAAU;KAAkB;KAAO;IAC/C;IACN,SAAS,EAAE,OAAO,WAAW;IAC9B,CACF;GACD,iBAAiB,CACf;IACE,KAAK;IACL,MAAM;KAAC;KAAW,UAAU;KAAkB;KAAQ;KAAa;KAAmB;IAChF;IACN,SAAS,EAAE,OAAO,WAAW;IAC9B,CACF;GACD,SAAS;IACP,SAAS,SAAS;IAClB,SAAS,SAAS;IAClB,SAAS;IACA;IACT,MAAM;KAAE,MAAM;KAAM,UAAU;KAAY;IACjC;IACT,QAAQ;IACT;GACF,CAAC;AAEF,SAAOD,sBAAM,gBAAgB,aAAa;;CAG5C,AAAO,gBAAgB,cAAuB;EAC5C,MAAM,cAAwB,EAAE;EAChC,MAAM,kCAAkB,IAAI,KAA2B;EACvD,IAAI,cAAsB;AAE1B,MAAI,cAAc;GAChB,MAAM,WAAWA,sBAAM,gBAAgB,aAAa;AACpD,mBAAgB,IAAI,cAAc,SAAS;GAC3C,MAAM,QAAQ,SAAS;AACvB,WAAQ,OAAR;IACE,KAAK;AACH,iBAAY,KACV,sBAAsB,aAAa,4CAA4CA,sBAAM,YAAY,aAAa,CAAC,qBAChH;AACD;IAEF,KAAK;AACH,iBAAY,KAAK,cAAcA,sBAAM,YAAY,aAAa,CAAC,oBAAoB;AACnF,SAAI,SAAS,aACX,aAAY,KACV,8EACD;AAEH;IAEF,QACE,0BAAiB,MAAM;;AAG3B,OAAI,iBAAiBA,sBAAM,oBACzB,aAAY,KACV,yGACD;AAGH,iBAAc;yDACqC,aAAa;MAChE,YAAY,KAAK,SAAS,CAAC;;SAEtB;AACL,QAAK,MAAM,SAASA,sBAAM,aACxB,iBAAgB,IAAI,OAAOA,sBAAM,gBAAgB,MAAM,CAAC;AAG1D,eAAY,KACV,0GACA,yCAAyCA,sBAAM,aAAa,CAAC,2DAC9D;AAED,iBAAc;;MAEd,YAAY,KAAK,SAAS,CAAC;;;AAI7B,OAAK,OAAO,KAAK,YAAY;AAC7B,MAAI,oBAAY,gBAAgB,EAAE;AAChC,QAAK,OAAO,KAAK,4BAA4B;AAC7C;;AAGF,OAAK,MAAM,CAAC,MAAM,aAAa,gBAAgB,SAAS,EAAE;AACxD,OAAI,SAAS,gBAAgB,QAAQ;AACnC,SAAK,OAAO,KAAK,mBAAmB,KAAK,WAAW;AAEpD,0CAD+B,KAAK,QAAQ,SAAS,gBAAgB,CAChD,UAAU,2BAA2B,KAAK,WAAW;;AAG5E,QAAK,OAAO,KAAK,wBAAwB,KAAK,kBAAkB;AAChE,mBAAG,OAAOA,sBAAM,YAAY,KAAK,EAAE;IAAE,WAAW;IAAM,OAAO;IAAM,CAAC;;AAGtE,MAAI,CAAC,cAAc;AACjB,QAAK,OAAO,KAAK,yBAAyBA,sBAAM,MAAM,CAAC,GAAG;AAC1D,mBAAG,OAAOA,sBAAM,MAAM,EAAE;IAAE,WAAW;IAAM,OAAO;IAAM,CAAC;;AAG3D,OAAK,OAAO,KACV,sEAAsEA,sBAAM,UAAU,CAAC,kBACxF;;CAGH,AAAO,iBAAiB,OAAsD;AAC5E,MAAI,MAAM,YAAY,QACpB;QAAK,QAAQ,IAAI,cAAc,OAAO,GAAI,OAAM,UAAU,QAAQ,IAAI;aAC5D,QAAQ,IAAI,cAAc,OAAO,GAAI,OAAM,UAAU,QAAQ,IAAI;;AAI7E,MAAI,MAAM,oBAAoB,UAAa,MAAM,YAAY,QAC3D;QAAK,QAAQ,IAAI,mBAAmB,OAAO,GACzC,OAAM,kBAAkB,QAAQ,IAAI;aAC5B,QAAQ,IAAI,mBAAmB,OAAO,GAC9C,OAAM,kBAAkB,QAAQ,IAAI;YAC7BG,gBAAG,WAAWF,kBAAK,QAAQC,gBAAG,SAAS,EAAE,cAAc,CAAC,CAC/D,OAAM,kBAAkBD,kBAAK,QAAQC,gBAAG,SAAS,EAAE,cAAc;;;CAIvE,AAAO,oBACL,OAMA,SACgC;EAChC,MAAM,cAAkC,EAAE;AAC1C,MAAI,MAAM,sBACR,aAAY,KAAK;GACf,QAAQ;GACR,MAAMD,kBAAK,QAAQ,SAAS,MAAM,sBAAsB;GACzD,CAAC;AAGJ,MAAI,QAAQ,MAAM,oBAAoB,KAAK,QAAQ,MAAM,wBAAwB,CAC/E,OAAM,IAAI,MACR,8EACD;AAGH,MAAI,MAAM,oBACR,aAAY,KAAK;GACf,QAAQ;GACR,WAAW,MAAM;GACjB,WAAW,MAAM;GAClB,CAAC;AAGJ,MAAI,YAAY,WAAW,EACzB;AAGF,SAAO,CAAC;GAAE,QAAQ;GAAO,KAAK,KAAK,YAAY;GAAE,EAAE,GAAG,YAAY;;;CAIpE,AAAO,aAAa;EAClB,MAAM,UAAUD,sBAAM,KAAK,WAAW;EACtC,MAAM,WAAW;EAEjB,IAAI,UAAU;AACd,MAAIG,gBAAG,WAAW,QAAQ,CACxB,WAAUA,gBAAG,aAAa,SAAS,EAAE,UAAU,CAAC;AAGlD,MAAI,WAAW,IAAI;AACjB,oCAAyB,GAAG;AAC5B,mBAAG,cAAc,SAAS,SAAS,EAAE,UAAU,CAAC;;AAGlD,SAAO;;CAGT,AAAQ,aAAa,OAAgB,MAAe;AAClD,MAAI,UAAU,UAAa,SAAS,GAAI;AAExC,MAAI,SAAS,UAAa,QAAQ,GAAI;AAEtC,OAAK,OAAO,MAAM;;;;;;;;;;qEAU+C;AAEjE,QAAM,IAAI,MAAM,gCAAgC;;CAGlD,AAAQ,uBACN,WACA,SACmB;EACnB,MAAM,OAA0B,EAAE;EAClC,MAAM,QAAQ,QAAQ;AACtB,cAAY,UAAU,aAAa;AAEnC,UAAQ,OAAR;GACE,KAAK;AACH,YAAQ,WAAR;KACE,KAAK;AAEH,UAAI,QAAQ,YAAY,QAAQ,WAC9B,MAAK,2BAA2B,GAAG,QAAQ,WAAW,QAAQ;AAEhE,UAAI,QAAQ,SAAU,MAAK,oCAAoC,QAAQ;AACvE,UAAI,QAAQ,gBACV,MAAK,6CAA6C,QAAQ;AAC5D,UAAI,QAAQ,OAAQ,MAAK,kCAAkC,QAAQ;AACnE,UAAI,QAAQ,IAAK,MAAK,+BAA+B,QAAQ;AAC7D,UAAI,QAAQ,OAAQ,MAAK,kCAAkC,QAAQ;AACnE;KAEF,KAAK;AAEH,UAAI,QAAQ,YAAY,QAAQ,WAC9B,MAAK,4BAA4B,WAAW,QAAQ,WAAW,QAAQ;AAEzE,UAAI,QAAQ,SACV,MAAK,iCAAiC,WAAW,QAAQ;AAC3D,UAAI,QAAQ,gBACV,MAAK,0CAA0C,WAAW,QAAQ;AACpE,UAAI,QAAQ,OAAQ,MAAK,+BAA+B,WAAW,QAAQ;AAC3E,UAAI,QAAQ,IAAK,MAAK,4BAA4B,WAAW,QAAQ;AACrE,UAAI,QAAQ,OAAQ,MAAK,+BAA+B,WAAW,QAAQ;AAC3E;KAEF,QACE,OAAM,IAAI,MAAM,uBAAuB,YAAY;;AAEvD,WAAO;GACT,KAAK;AACH,YAAQ,WAAR;KACE,KAAK;AACH,UAAI,QAAQ,SAAU,MAAK,2BAA2B,QAAQ;AAC9D;KACF,KAAK;AACH,UAAI,QAAQ,SAAU,MAAK,6BAA6B,QAAQ;AAChE;KACF,QACE,OAAM,IAAI,MAAM,uBAAuB,YAAY;;AAEvD,WAAO;GAET,QACE,0BAAiB,MAAM;;AAG3B,SAAO,EAAE;;CAGX,AAAQ,cACN,SAUA,SAAiB,IACjB;EACA,MAAM,SAAmB,EAAE;EAE3B,MAAM,UAAU,MAAc,EAAE,SAAS,QAAQ,IAAI;AACrD,MAAI,QAAQ,WACV,QAAO,KAAK,GAAG,OAAO,SAAS,CAAC,IAAI,QAAQ,aAAa;AAG3D,MAAI,QAAQ,QACV,QAAO,KAAK,GAAG,OAAO,MAAM,CAAC,IAAI,QAAQ,UAAU;WAC1C,QAAQ,QACjB,QAAO,KAAK,GAAG,OAAO,MAAM,CAAC,cAAc,QAAQ,QAAQ,UAAU,GAAG;MAExE,QAAO,KAAK,GAAG,OAAO,MAAM,CAAC,kBAAkB;AAGjD,MAAI,QAAQ,QACV,QAAO,KAAK,GAAG,OAAO,MAAM,CAAC,IAAI,QAAQ,UAAU;EAGrD,MAAM,cAAc,QAAQ,SAAS;AACrC,UAAQ,aAAR;GACE,KAAK,OACH;GAEF,KAAK;AACH,WAAO,KAAK,GAAG,OAAO,UAAU,CAAC,IAAI,QAAQ,QAAS,WAAY;AAClE;GAEF,KAAK;AACH,WAAO,KACL,GAAG,OAAO,UAAU,CAAC,WAAW,QAAQ,QAAS,YAAY,MAAM,aAAa,QAAQ,QAAS,WAAY,cAAc,QAAQ,QAAS,aAAa,GAAG,GAC7J;AACD;GAEF,QACE,0BAAiB,YAAY;;EAGjC,MAAM,cAAc,QAAQ,SAAS;AACrC,UAAQ,aAAR;GACE,KAAK,OACH;GAEF,KAAK;AACH,WAAO,KAAK,GAAG,OAAO,UAAU,CAAC,IAAI,QAAQ,QAAS,WAAY;AAClE;GAEF,KAAK;AACH,WAAO,KACL,GAAG,OAAO,UAAU,CAAC,WAAW,QAAQ,QAAS,YAAY,MAAM,aAAa,QAAQ,QAAS,WAAY,cAAc,QAAQ,QAAS,aAAa,GAAG,GAC7J;AACD;GAEF,QACE,0BAAiB,YAAY;;AAGjC,MAAI,QAAQ,KACV,QAAO,KAAK,GAAG,OAAO,WAAW,CAAC,IAAI,QAAQ,KAAK,WAAW;AAGhE,MAAI,QAAQ,OACV,QAAO,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,QAAQ,SAAS;AAGnD,SAAO,OAAO,KAAK,KAAK;;;AAI5B,SAAgB,cAAc,QAAoC,SAAkB;AAClF,MAAK,MAAM,UAAU,QAAQ;AAC3B,MAAI,OAAO,MACT,OAAM,OAAO;EAGf,MAAM,MAAM,WAAW;AAEvB,MAAI,OAAO,WAAW,EACpB,OAAM,IAAI,MAAM,GAAG,IAAI,8BAA8B,OAAO,OAAO,GAAG"}