@platforma-sdk/bootstrap 2.8.5 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/cmd-opts.ts","../src/util.ts","../src/block.ts","../src/commands/create-block.ts","../src/package.ts","../src/state.ts","../src/run.ts","../src/templates/types.ts","../src/templates/pl-config.ts","../src/platforma.ts","../src/core.ts","../src/commands/reset.ts","../src/commands/start.ts","../src/commands/stop.ts","../src/commands/start/docker.ts","../src/commands/start/local.ts","../src/commands/start/docker/s3.ts","../src/commands/start/local/s3.ts","../src/index.ts"],"sourcesContent":["import { Flags } from '@oclif/core';\n\nexport const GlobalFlags = {\n 'log-level': Flags.string({\n description: 'logging level',\n default: 'info',\n options: ['error', 'warn', 'info', 'debug'],\n required: false\n })\n};\n\nexport const ImageFlag = {\n image: Flags.string({\n description: 'use custom docker image to run platforma'\n })\n};\n\nexport const VersionFlag = {\n version: Flags.string({\n description: 'use custom platforma release (official docker image or binary package)'\n })\n};\n\nexport const LicenseFlags = {\n license: Flags.string({\n description: 'pass a license code. The license can be got from \"https://licensing.milaboratories.com\".'\n }),\n 'license-file': Flags.file({\n exists: true,\n description:\n \"specify a path to the file with a license. The license can be got from 'https://licensing.milaboratories.com'.\"\n })\n};\n\nexport const AddressesFlags = {\n 'grpc-port': Flags.integer({\n description: 'port for Platforma Backend gRPC API. Default is 6345',\n env: 'PLATFORMA_GRPC_PORT'\n }),\n\n 'grpc-listen': Flags.string({\n description: 'full listen addr for Platforma Backend gRPC API. Default is 127.0.0.1:6345',\n env: 'PLATFORMA_GRPC_LISTEN'\n }),\n\n 'monitoring-port': Flags.integer({\n description: 'port for Platforma Backend monitoring API. Default is 9090',\n env: 'PLATFORMA_MONITORING_PORT'\n }),\n\n 'monitoring-listen': Flags.string({\n description: 'full listen addr for Platforma Backend monitoring API. Default is 127.0.0.1:9090',\n env: 'PLATFORMA_MONITORING_LISTEN'\n }),\n\n 'debug-port': Flags.integer({\n description: 'port for Platforma Backend debug API. Default is 9091',\n env: 'PLATFORMA_DEBUG_PORT'\n }),\n\n 'debug-listen': Flags.string({\n description: 'full listen addr for Platforma Backend debug API. Default is 127.0.0.1:9091',\n env: 'PLATFORMA_DEBUG_LISTEN'\n })\n};\n\nexport const S3AddressesFlags = {\n 's3-address-port': Flags.integer({\n description: 'port that S3 will listen, default is 9000',\n default: 9000,\n env: 'PLATFORMA_S3_PORT'\n }),\n\n 's3-console-address-port': Flags.integer({\n description: 'port that a console of S3 will listen, default is 9001',\n default: 9001,\n env: 'PLATFORMA_S3_CONSOLE_PORT'\n })\n};\n\nexport const StorageFlag = {\n storage: Flags.string({\n description: 'specify path on host to be used as storage for all Platforma Backend data'\n })\n};\n\nexport const PlLogFileFlag = {\n ['pl-log-file']: Flags.file({\n description: 'specify path for Platforma Backend log file'\n })\n};\n\nexport const PlWorkdirFlag = {\n ['pl-workdir']: Flags.file({\n description: 'specify working directory for Platforma Backend process'\n })\n};\n\nexport const PlBinaryFlag = {\n ['pl-binary']: Flags.file({\n description: 'start given Platforma Backend binary instead of automatically downloaded version'\n })\n};\n\nexport const PlSourcesFlag = {\n ['pl-sources']: Flags.file({\n description: 'path to pl repository root: build Platforma Backend from sources and start the resulting binary'\n })\n};\n\nexport const ConfigFlag = {\n config: Flags.string({\n description: 'use custom Platforma Backend config'\n })\n};\n\nexport const StoragePrimaryPathFlag = {\n 'storage-primary': Flags.file({\n description: \"specify path on host to be used as 'primary' storage\"\n })\n};\n\nexport const StorageWorkPathFlag = {\n 'storage-work': Flags.file({\n description: \"specify path on host to be used as 'work' storage\"\n })\n};\n\nexport const StorageLibraryPathFlag = {\n 'storage-primary': Flags.file({\n description: \"specify path on host to be used as 'library' storage\"\n })\n};\n\nexport const StoragePrimaryURLFlag = {\n 'storage-primary': Flags.string({\n description:\n \"specify 'primary' storage destination URL.\\n\" +\n '\\tfile:/path/to/dir for directory on local FS\\n' +\n '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n' +\n '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n' +\n '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https'\n })\n};\n\nexport const StorageLibraryURLFlag = {\n 'storage-library': Flags.string({\n description:\n \"specify 'library' storage destination URL.\\n\" +\n '\\tfile:/path/to/dir for directory on local FS\\n' +\n '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n' +\n '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n' +\n '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https'\n })\n};\n\nexport const AuthEnabledFlag = {\n 'auth-enabled': Flags.boolean({\n description: 'enable authorization'\n })\n};\n\nexport const HTPasswdFileFlag = {\n 'auth-htpasswd-file': Flags.file({\n description: 'path to .htpasswd file with Platforma users (static user DB auth source)'\n })\n};\n\nexport const LDAPAddressFlag = {\n 'auth-ldap-server': Flags.string({\n description: 'address of LDAP server to use for auth in Platforma (auth source)'\n })\n};\n\nexport const LDAPDefaultDNFlag = {\n 'auth-ldap-default-dn': Flags.string({\n description: 'DN to use when checking user with LDAP bind operation: e.g. cn=%u,ou=users,dc=example,dc=com'\n })\n};\n\nexport const AuthFlags = {\n ...AuthEnabledFlag,\n ...HTPasswdFileFlag,\n\n ...LDAPAddressFlag,\n ...LDAPDefaultDNFlag\n};\n","import os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\n\nimport winston from 'winston';\nimport { randomBytes } from 'crypto';\nimport readlineSync from 'readline-sync';\n\nexport function askYN(prompt: string): boolean {\n const answer = readlineSync.question(`${prompt} [y/N] `);\n return answer.toLowerCase() === 'y';\n}\n\nexport function assertNever(n: never) {\n throw new Error('this should never happen');\n}\n\nexport function createLogger(level: string = 'debug'): winston.Logger {\n return winston.createLogger({\n level: level,\n\n format: winston.format.printf(({ level, message }) => {\n const indent = ' '.repeat(level.length + 2); // For ': ' after the level\n if (typeof message !== 'string') {\n const messageJson = JSON.stringify(message);\n throw Error(`logger message ${messageJson} is not a string`);\n }\n const indentedMessage = message\n .split('\\n')\n .map((line: string, index: number) => (index === 0 ? line : indent + line))\n .join('\\n');\n\n const colorize = (l: string) => winston.format.colorize().colorize(l, l);\n\n return `${colorize(level)}: ${indentedMessage}`;\n }),\n\n transports: [\n new winston.transports.Console({\n stderrLevels: ['error', 'warn', 'info', 'debug'],\n handleExceptions: true\n })\n ]\n });\n}\n\nexport function randomStr(len: number): string {\n return randomBytes(Math.ceil(len / 2))\n .toString('hex')\n .slice(0, len);\n}\n\nexport function resolveTilde(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nexport function ensureDir(p: string, options?: {\n mode?: fs.Mode\n}) {\n if (fs.existsSync(p)) {\n return\n }\n\n fs.mkdirSync(p, { recursive: true })\n if (options?.mode) {\n fs.chmodSync(p, options.mode)\n }\n}\n\nexport function getProcessName(pid: number): string {\n try {\n if (os.platform() !== 'win32') {\n return execSync(`ps -p ${pid} -o comm=`, { encoding: 'utf8' }).trim();\n }\n\n const command = `wmic process where processid=${pid} get Caption`;\n const lines = execSync(command, { encoding: 'utf8' }).split('\\n');\n\n // lines = [\"Caption:\", \"<process name>\"]\n if (lines.length <= 1) {\n return '';\n }\n\n return lines[1].trim();\n } catch (e) {\n return '';\n }\n}\n","import { createWriteStream } from 'fs';\nimport * as fs from 'fs/promises';\nimport path from 'path';\nimport winston from 'winston';\nimport { Writable, Transform } from 'node:stream';\nimport os from 'os';\nimport readlineSync from 'readline-sync';\nimport { z } from 'zod';\nimport decompress from 'decompress';\nimport yaml from 'yaml';\n\nconst blockPlatformsToChoose = ['Python'];\nconst allPlatforms = ['Tengo', 'Python'] as const;\nconst CreateBlockPlatforms = z.union([z.literal('Tengo'), z.literal('Python')]);\nexport type CreateBlockPlatform = z.infer<typeof CreateBlockPlatforms>;\n\nconst CreateBlockOptions = z.object({\n npmOrgName: z.string().min(1),\n orgName: z.string().min(1),\n blockName: z.string().min(1),\n softwarePlatforms: z.array(CreateBlockPlatforms).refine((p) => new Set(p).size === p.length, {\n message: 'Must be an array of unique software platforms'\n })\n});\nexport type CreateBlockOptions = z.infer<typeof CreateBlockOptions>;\n\n/** Creates a block by cloning block-boilerplate repository. */\nexport async function createBlock(logger: winston.Logger) {\n const { npmOrgName, orgName, blockName, softwarePlatforms } = askForOptions();\n const targetPath = path.join(process.cwd(), blockName);\n\n logger.info(`Downloading boilerplate code...`);\n await downloadAndUnzip(\n // 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/software_platforms.zip',\n // 'platforma-block-boilerplate-software_platforms',\n 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/main.zip',\n 'platforma-block-boilerplate-main',\n targetPath\n );\n\n const platformsToRemove = allPlatforms.filter((p) => softwarePlatforms.indexOf(p) < 0);\n const noPlatforms = blockPlatformsToChoose.length == platformsToRemove.length;\n logger.info(`Keep platforms '${softwarePlatforms}', remove: '${platformsToRemove}'. Will remove all platforms? ${noPlatforms}`);\n for (const p of platformsToRemove) {\n await removePlatform(targetPath, p);\n }\n if (noPlatforms) {\n await removePlatformsCompletely(targetPath);\n }\n\n logger.info(`Replace everything in the template with provided options...`);\n replaceRegexInAllFiles(targetPath, [\n // '@' literal ensures only npm org name will be renamed,\n // as public registry for software also is called platforma-open, but without '@'.\n // Also, don't rename an organization for runenv-python-3 package.\n { from: /@platforma-open(?!.*runenv-python-3)/g, to: `@${npmOrgName}` },\n\n { from: /my-org/g, to: orgName },\n\n { from: /block-boilerplate/g, to: blockName }\n ]);\n}\n\nfunction askForOptions(): CreateBlockOptions {\n let npmOrgName = readlineSync.question(\n 'Write an organization name for npm. Default is \"platforma-open\": '\n );\n if (npmOrgName === '') {\n npmOrgName = 'platforma-open';\n }\n const orgName = readlineSync.question('Write an organization name, e.g. \"my-org\": ');\n const blockName = readlineSync.question('Write a name of the block, e.g. \"hello-world\": ');\n\n const needSoftware = readlineSync.keyInYN(\"Create package for block's software?\");\n let softwarePlatforms = ['Tengo'];\n if (needSoftware) {\n while (softwarePlatforms.length < allPlatforms.length) {\n const index = readlineSync.keyInSelect(blockPlatformsToChoose, 'Choose software platform:');\n if (index < 0) break;\n softwarePlatforms.push(blockPlatformsToChoose[index]);\n }\n }\n softwarePlatforms = Array.from(new Set(softwarePlatforms)).sort();\n\n return CreateBlockOptions.parse({ npmOrgName, orgName, blockName, softwarePlatforms });\n}\n\nasync function downloadAndUnzip(url: string, pathInArchive: string, outputPath: string) {\n const response = await fetch(url);\n const content = await response.blob();\n\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'create-repo'));\n\n const tmpFile = path.join(tmpDir, 'packed-repo.zip');\n const f = Writable.toWeb(createWriteStream(tmpFile));\n await content.stream().pipeTo(f);\n\n const tmpRepo = path.join(tmpDir, 'unpacked-repo');\n await fs.mkdir(tmpRepo);\n await decompress(tmpFile, tmpRepo);\n\n await fs.cp(path.join(tmpRepo, pathInArchive), outputPath, { recursive: true });\n}\n\n/** Removes a bunch of dependencies to the platform. */\nasync function removePlatform(dir: string, platform: CreateBlockPlatform) {\n const p = platform.toLowerCase();\n\n // Remove <PlAlert> line from MainPage.vue\n // https://regex101.com/r/oCTyHk/1\n await deleteRegexInFile(\n path.join(dir, 'ui', 'src', 'pages', 'MainPage.vue'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g')\n );\n\n // Remove an output from the model.\n await deleteRegexInFile(\n path.join(dir, 'model', 'src', 'index.ts'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g')\n );\n\n // This regexp represents a block of code until the empty line.\n // https://regex101.com/r/Os8kX1/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}.*exec.builder.*[\\\\s\\\\S]*?\\\\n\\\\n`, 'g')\n );\n\n // Remove a line from the workflow output.\n // https://regex101.com/r/PkHwQ8/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}Message.*\\\\n`, 'g')\n );\n\n // Remove 2 lines: the one with the language message and the one with expect\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'wf.test.ts'),\n new RegExp(`.*${p}Message.*\\\\n.*expect.*\\\\n\\\\n`, 'g')\n );\n\n await fs.rm(path.join(dir, 'software', `src_${p}`), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'software', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['block-software']['artifacts'][`hello-${p}-artifact`];\n delete json['block-software']['entrypoints'][`hello-world-${p}`];\n return JSON.stringify(json, null, 2);\n }\n )\n}\n\n/** Removes software directory completely and all references to it from the workspace. */\nasync function removePlatformsCompletely(dir: string) {\n await fs.rm(path.join(dir, 'software'), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'workflow', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['dependencies'][\"@platforma-open/my-org.block-boilerplate.software\"];\n return JSON.stringify(json, null, 2);\n }\n );\n\n await deleteRegexInFile(\n path.join(dir, 'pnpm-workspace.yaml'),\n /.*- software$\\n/gm\n );\n}\n\nasync function replaceRegexInAllFiles(\n dir: string,\n patterns: { from: RegExp; to: string }[]\n) {\n const files = await getAllFiles(dir);\n for (const { from, to } of patterns) {\n for (const fPath of files) {\n await replaceRegexInFile(fPath, from, to);\n }\n }\n}\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const allDirents = await fs.readdir(dir, {\n withFileTypes: true,\n recursive: true\n });\n\n return allDirents.filter((f) => f.isFile()).map((f) => path.join(f.parentPath, f.name));\n}\n\nasync function replaceInFile(fPath: string, replacer: (content: string) => any) {\n const content = await fs.readFile(fPath);\n const newContent = replacer(content.toString());\n await fs.writeFile(fPath, newContent);\n}\n\nasync function replaceRegexInFile(fPath: string, from: RegExp, to: string) {\n return await replaceInFile(fPath, (content) => content.replaceAll(from, to));\n}\n\nasync function deleteRegexInFile(fPath: string, what: RegExp) {\n return await replaceRegexInFile(fPath, what, '');\n}\n","import { Command, Flags } from '@oclif/core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\nimport * as block from '../block';\n\nexport default class CreateBlock extends Command {\n static override description = \"Helps to create a new block by downloading a block's template.\";\n\n static override examples = ['<%= name %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(CreateBlock);\n const logger = util.createLogger(flags['log-level']);\n\n await block.createBlock(logger);\n }\n}\n","import { resolve, join } from 'path';\nimport fs from 'fs';\nimport { getDefaultPlVersion } from '@milaboratories/pl-local';\n\nexport function path(...p: string[]): string {\n return resolve(__dirname, '..', ...p);\n}\n\nexport function dist(...p: string[]): string {\n return path('dist', ...p);\n}\n\nexport function assets(...p: string[]): string {\n return path('assets', ...p);\n}\n\nexport function composeFiles(): string[] {\n const dockerDirEntries = fs.readdirSync(assets());\n return dockerDirEntries\n .filter((entry) => {\n return entry.startsWith('compose-') && entry.endsWith('.yaml');\n })\n .map((value) => assets(value));\n}\n\nexport function readFileSync(...p: string[]): Buffer {\n return fs.readFileSync(path(...p));\n}\n\nexport function plImageTag(version?: string): string {\n if (!version) {\n version = getDefaultPlVersion();\n }\n\n return `quay.io/milaboratories/platforma:${version}`;\n}\n","import os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport * as pkg from './package';\nimport * as util from './util';\n\nexport type runMode = 'docker' | 'process';\n\nexport type dockerRunInfo = {\n plImage?: string;\n composePath?: string;\n\n primaryPath?: string;\n workPath?: string;\n libraryPath?: string;\n};\n\nexport type processRunInfo = {\n pid?: number;\n storagePath?: string;\n};\n\nexport type lastRun = {\n docker?: dockerRunInfo;\n process?: processRunInfo;\n\n mode: runMode;\n cmd: string;\n args: readonly string[];\n workdir?: string;\n envs?: NodeJS.Dict<string>;\n};\n\nexport function reset() {\n fs.rmSync(State.getInstance().filePath);\n}\n\ntype state = {\n lastRun: lastRun | undefined;\n isActive: boolean;\n};\n\nclass State {\n private static instance: State;\n\n private state: state = {\n lastRun: undefined,\n isActive: false,\n };\n\n public readonly filePath: string;\n private readonly dirPath: string;\n\n constructor(stateDir?: string) {\n stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');\n\n const stateFile = path.join(stateDir, 'state.json');\n\n this.dirPath = stateDir;\n this.filePath = stateFile;\n\n if (!fs.existsSync(stateDir)) {\n fs.mkdirSync(stateDir, { recursive: true });\n }\n\n if (fs.existsSync(stateFile)) {\n this.state = JSON.parse(pkg.readFileSync(stateFile).toString());\n }\n }\n\n public static getInstance(): State {\n if (!State.instance) {\n State.instance = new State();\n }\n\n return State.instance;\n }\n\n public path(...p: string[]): string {\n return path.join(this.dirPath, ...p);\n }\n\n public data(...p: string[]): string {\n return this.path('data', ...p);\n }\n\n public binaries(...p: string[]): string {\n return this.path('binaries', ...p);\n }\n\n private writeState() {\n fs.writeFileSync(this.filePath, JSON.stringify(this.state));\n }\n\n get isActive(): boolean {\n if (this.state.isActive) {\n return this.state.isActive;\n }\n\n if (!this.state.lastRun?.process?.pid) {\n return false;\n }\n\n return this.isValidPID;\n }\n\n get isValidPID(): boolean {\n if (!this.state.lastRun?.process?.pid) {\n return false;\n }\n\n const processName = util.getProcessName(this.state.lastRun.process.pid);\n return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\\\platforma');\n }\n\n set isActive(value: boolean) {\n this.state.isActive = value;\n this.writeState();\n }\n\n get lastRun(): lastRun | undefined {\n return this.state.lastRun;\n }\n\n set lastRun(info: lastRun) {\n this.state.lastRun = info;\n this.writeState();\n }\n}\n\nexport default State.getInstance();\n","import fs from 'fs';\nimport { spawnSync, SpawnOptions, SpawnSyncReturns, ChildProcess, spawn } from 'child_process';\nimport state, { dockerRunInfo, processRunInfo } from './state';\nimport winston from 'winston';\n\nexport function runDocker(\n logger: winston.Logger,\n args: readonly string[],\n options: SpawnOptions,\n stateToSave?: dockerRunInfo\n) {\n state.lastRun = {\n ...state.lastRun,\n\n mode: 'docker',\n cmd: 'docker',\n args: args,\n workdir: options.cwd as string,\n envs: options.env,\n\n docker: {\n ...state.lastRun?.docker,\n ...stateToSave\n }\n };\n\n return runSync(logger, 'docker', args, options);\n}\n\nexport function runProcess(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions,\n stateToSave?: processRunInfo\n): ChildProcess {\n state.lastRun = {\n ...state.lastRun,\n\n mode: 'process',\n cmd: cmd,\n args: args,\n workdir: options.cwd as string,\n envs: options.env,\n\n process: {\n ...state.lastRun?.process,\n ...stateToSave\n }\n };\n\n const result = run(logger, cmd, args, options);\n state.lastRun.process = {\n ...state.lastRun.process,\n pid: result.pid\n };\n return result;\n}\n\nexport function rerunLast(logger: winston.Logger, options: SpawnOptions): SpawnSyncReturns<Buffer> {\n if (!state.lastRun) {\n throw new Error('no previous run info found: this is the first run after package installation');\n }\n\n options = {\n cwd: state.lastRun.workdir,\n env: {\n ...state.lastRun.envs,\n ...options.env\n },\n ...options\n };\n\n return runSync(logger, state.lastRun.cmd, state.lastRun.args, options);\n}\n\nfunction run(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): ChildProcess {\n logger.debug(\n `Running:\\n env: ${JSON.stringify(options.env)}\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd}`\n );\n\n options.env = { ...process.env, ...options.env };\n logger.debug(' spawning child process');\n const child = spawn(cmd, args, options);\n var exitAfterChild: boolean = false;\n\n //\n // Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.\n //\n const sigintHandler = () => {\n child.kill('SIGINT');\n exitAfterChild = true;\n };\n\n logger.debug(' setting up signal handler');\n process.on('SIGINT', sigintHandler);\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', sigintHandler);\n if (exitAfterChild) {\n process.exit(code);\n }\n });\n\n return child;\n}\n\nfunction runSync(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions\n): SpawnSyncReturns<Buffer> {\n logger.debug(\n `Running:\\n env: ${JSON.stringify(options.env)}\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd}`\n );\n\n options.env = { ...process.env, ...options.env };\n return spawnSync(cmd, args, options);\n}\n","export type plSettings = {\n localRoot: string;\n\n license: licenseSettings;\n log: logSettings;\n grpc: grpcSettings;\n core: coreSettings;\n storages: storagesSettings;\n\n monitoring: monitoringSettings;\n debug: debugSettings;\n\n hacks: {\n libraryDownloadable: boolean;\n };\n};\nexport type plOptions = {\n localRoot?: string;\n\n license?: licenseOptions;\n log?: logOptions;\n grpc?: grpcOptions;\n core?: coreOptions;\n storages?: storagesOptions;\n\n monitoring?: monitoringOptions;\n debug?: debugOptions;\n};\n\nexport type licenseSettings = {\n value: string;\n file: string;\n};\nexport type licenseOptions = DeepPartial<licenseSettings>;\n\nexport type logSettings = {\n level: string;\n path: string;\n};\nexport type logOptions = DeepPartial<logSettings>;\n\nexport type coreSettings = {\n auth: authSettings;\n db: dbSettings;\n};\nexport type coreOptions = {\n auth?: authOptions;\n db?: dbOptions;\n};\n\nexport type authSettings = {\n enabled: boolean;\n drivers: authDriver[];\n};\nexport type authOptions = Partial<authSettings>;\n\nexport type dbSettings = {\n path: string;\n};\nexport type dbOptions = Partial<dbSettings>;\n\nexport type authDriver =\n | {\n driver: 'ldap';\n serverUrl: string; // 'ldaps://ldap.example.com:1111'\n defaultDN: string; // 'cn=%u,ou=users,ou=users,dc=example,dc=com'\n }\n | {\n driver: 'jwt';\n key: string;\n }\n | {\n driver: 'htpasswd';\n path: string;\n };\n\nexport type grpcSettings = {\n listen: string;\n tls: tlsSettings;\n};\nexport type grpcOptions = Partial<grpcSettings>;\n\nexport type tlsSettings = {\n enable: boolean;\n clientAuthMode: tlsAuthMode;\n certFile: string;\n keyFile: string;\n};\nexport type tlsOptions = Partial<tlsSettings>;\n\nexport type tlsAuthMode = 'NoAuth' | 'RequestAnyCert' | 'RequireAnyCert' | 'RequestValidCert' | 'RequireValidCert';\n\nexport type storagesSettings = {\n primary: storageSettings;\n work: fsStorageSettings;\n library: storageSettings;\n};\nexport type storagesOptions = {\n primary?: storageOptions;\n work?: storageOptions;\n library?: storageOptions;\n};\n\nexport type storageSettings = s3StorageSettings | fsStorageSettings;\nexport type storageOptions = s3StorageOptions | fsStorageOptions;\n\ntype storageID = { id: string };\ntype commonStorageSettings = {\n indexCachePeriod: string;\n};\n\nexport type s3StorageSettings = storageID & s3StorageType & commonStorageSettings & s3StorageTypeSettings;\nexport type s3StorageOptions = s3StorageType & Partial<commonStorageSettings> & Partial<s3StorageTypeSettings>;\nexport function emptyS3Settings(id: string): s3StorageSettings {\n return {\n id: id,\n type: 'S3',\n indexCachePeriod: '0s',\n endpoint: '',\n region: '',\n presignEndpoint: '',\n bucketName: '',\n createBucket: false,\n forcePathStyle: false,\n key: '',\n secret: '',\n keyPrefix: '',\n accessPrefixes: [],\n uploadKeyPrefix: ''\n };\n}\n\ntype s3StorageType = { type: 'S3' };\ntype s3StorageTypeSettings = {\n endpoint: string;\n presignEndpoint: string;\n region: string;\n bucketName: string;\n createBucket: boolean;\n forcePathStyle: boolean;\n key: string;\n secret: string;\n keyPrefix: string;\n accessPrefixes: string[];\n uploadKeyPrefix: string;\n};\n\nexport type fsStorageSettings = storageID & fsStorageType & commonStorageSettings & fsStorageTypeSettings;\nexport type fsStorageOptions = fsStorageType & Partial<commonStorageSettings> & Partial<fsStorageTypeSettings>;\nexport function emptyFSSettings(id: string): fsStorageSettings {\n return {\n id: id,\n type: 'FS',\n indexCachePeriod: '0s',\n rootPath: ''\n };\n}\n\ntype fsStorageType = { type: 'FS' };\ntype fsStorageTypeSettings = {\n rootPath: string;\n};\n\nexport type monitoringSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type monitoringOptions = Partial<monitoringSettings>;\n\nexport type debugSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type debugOptions = Partial<debugSettings>;\n\n/** Makes all keys and keys in sub-objects optional. */\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n","import fs from 'fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:':\n var bucketName = url.hostname;\n var region = url.searchParams.get('region');\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region\n } as types.storageOptions;\n\n case 's3e:':\n var p = url.pathname.split('/').slice(1); // '/bucket/keyPrefix' -> ['', 'bucket', 'keyPrefix'] -> ['bucket', 'keyPrefix']\n var bucketName = p[0];\n var keyPrefix = p.length > 1 ? p[1] : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : ''\n } as types.storageOptions;\n\n case 's3es:':\n var p = url.pathname.split('/').slice(1); // '/bucket/keyPrefix' -> ['', 'bucket', 'keyPrefix'] -> ['bucket', 'keyPrefix']\n var bucketName = p[0];\n var keyPrefix = p.length > 1 ? p[1] : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : ''\n } as types.storageOptions;\n\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.data('local-custom');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls\n }\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` }\n ]\n },\n db: {\n path: `${localRoot}/db`\n }\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'main-bucket',\n options?.storages?.primary\n );\n\n var work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error(\"work storage MUST have 'FS' type as it is used for working directories management\");\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'library-bucket',\n options?.storages?.library\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090'\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091'\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? ''\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true }\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions\n): types.storageSettings {\n var storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint ?? 'http://localhost:9000';\n storage.presignEndpoint = options?.presignEndpoint ?? 'http://localhost:9000';\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n\n var miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work as types.fsStorageSettings).rootPath}'\n workdirCacheOnFailure: 1h\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows: {}\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n","import os from 'os';\nimport fs from 'fs';\nimport https from 'https';\nimport path from 'path';\n\nimport * as tar from 'tar';\nimport winston from 'winston';\nimport state from './state';\nimport { getDefaultPlVersion } from '@milaboratories/pl-local';\n\nexport const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\nexport function archiveOS(osName?: string): OSType {\n const platform = osName ?? os.platform();\n\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: ` +\n JSON.stringify(OSes)\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\nexport function archiveArch(archName?: string): ArchType {\n const arch = archName ?? os.arch();\n\n switch (arch) {\n case 'arm64':\n return 'arm64';\n case 'x64':\n return 'amd64';\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: ` +\n JSON.stringify(Arches)\n );\n }\n}\n\nexport function downloadArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n showProgress?: boolean;\n downloadURL?: string;\n saveTo?: string;\n }\n): Promise<string> {\n const version = options?.version ?? getDefaultPlVersion();\n const showProgress = options?.showProgress ?? process.stdout.isTTY;\n\n const archiveName = `pl-${version}-${archiveArch()}.tgz`;\n const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;\n\n const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);\n if (fs.existsSync(archiveFilePath)) {\n logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);\n return Promise.resolve(archiveFilePath);\n }\n\n fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });\n\n logger.info(`Downloading Platforma Backend archive:\\n URL: ${downloadURL}\\n Save to: ${archiveFilePath}`);\n\n const request = https.get(downloadURL);\n\n return new Promise((resolve, reject) => {\n request.on('response', (response) => {\n if (!response.statusCode) {\n const err = new Error('failed to download archive: no HTTP status code in response from server');\n request.destroy();\n reject(err);\n return;\n }\n if (response.statusCode !== 200) {\n const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);\n request.destroy();\n reject(err);\n return;\n }\n\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n const archive = fs.createWriteStream(archiveFilePath);\n\n response.pipe(archive);\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progress = (downloadedBytes / totalBytes) * 100;\n if (showProgress) {\n process.stdout.write(` downloading: ${progress.toFixed(2)}%\\r`);\n }\n });\n\n response.on('error', (err: Error) => {\n fs.unlinkSync(archiveFilePath);\n logger.error(`Failed to download Platforma Binary: ${err.message}`);\n request.destroy();\n reject(err);\n });\n\n archive.on('finish', () => {\n archive.close();\n logger.info(` ... download done.`);\n request.destroy();\n resolve(archiveFilePath);\n });\n });\n });\n}\n\nexport function extractArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n archivePath?: string;\n extractTo?: string;\n }\n): string {\n logger.debug('extracting archive...');\n\n const version = options?.version ?? getDefaultPlVersion();\n logger.debug(` version: '${version}'`);\n const archiveName = `${binaryDirName({ version })}.tgz`;\n\n const archivePath = options?.archivePath ?? state.binaries(archiveName);\n logger.debug(` archive path: '${archivePath}'`);\n\n const targetDir = options?.extractTo ?? trimExtension(archivePath);\n logger.debug(` target dir: '${targetDir}'`);\n\n if (fs.existsSync(targetDir)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);\n return targetDir;\n }\n\n if (!fs.existsSync(archivePath)) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n if (!fs.existsSync(targetDir)) {\n logger.debug(` creating target dir '${targetDir}'`);\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n logger.info(`Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${targetDir}`);\n\n tar.x({\n file: archivePath,\n cwd: targetDir,\n gzip: true,\n sync: true\n });\n\n logger.info(` ... unpack done.`);\n\n return targetDir;\n}\n\nexport function getBinary(\n logger: winston.Logger,\n options?: { version?: string; showProgress?: boolean }\n): Promise<string> {\n return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));\n}\n\nfunction binaryDirName(options?: { version?: string }): string {\n const version = options?.version ?? getDefaultPlVersion();\n return `pl-${version}-${archiveArch()}`;\n}\n\nexport function binaryPath(version?: string, ...p: string[]): string {\n return state.binaries(binaryDirName({ version }), ...p);\n}\n\nfunction trimExtension(filename: string): string {\n const lastDotIndex = filename.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return filename;\n }\n return filename.slice(0, lastDotIndex);\n}\n","import { ChildProcess, SpawnSyncReturns, spawn, spawnSync } from 'child_process';\nimport yaml from 'yaml';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport * as pkg from './package';\nimport * as run from './run';\nimport * as plCfg from './templates/pl-config';\nimport * as types from './templates/types';\nimport * as platforma from './platforma';\nimport state from './state';\nimport * as util from './util';\nimport winston from 'winston';\n\nexport default class Core {\n constructor(private readonly logger: winston.Logger) { }\n\n public startLast() {\n const result = run.rerunLast(this.logger, { stdio: 'inherit' });\n checkRunError(result, 'failed to bring back Platforma Backend in the last started configuration');\n }\n\n public startLocal(options?: startLocalOptions): ChildProcess {\n const cmd = options?.binaryPath ?? platforma.binaryPath(options?.version, 'binaries', 'platforma');\n var configPath = options?.configPath;\n const workdir: string = options?.workdir ?? (configPath ? process.cwd() : state.path());\n\n if (options?.primaryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n primary: plCfg.storageSettingsFromURL(options.primaryURL, workdir, options.configOptions?.storages?.primary)\n }\n };\n }\n if (options?.libraryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n library: plCfg.storageSettingsFromURL(options.libraryURL, workdir, options.configOptions?.storages?.library)\n }\n };\n }\n\n const configOptions = plCfg.loadDefaults(this.getLastJwt(), options?.configOptions);\n\n this.logger.debug(` checking license...`);\n this.checkLicense(options?.configOptions?.license?.value, options?.configOptions?.license?.file);\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 runInfo = this.renderRunInfo({\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 this.logger.info(`Starting platforma:\\n${runInfo}`);\n\n return run.runProcess(\n this.logger,\n cmd,\n ['-config', configPath],\n {\n cwd: workdir,\n stdio: 'inherit'\n },\n {\n storagePath: configOptions.localRoot\n }\n );\n }\n\n public startLocalS3(options?: startLocalS3Options): ChildProcess {\n this.logger.debug(\"starting platforma in 'local s3' mode...\");\n\n const minioPort = options?.minioPort ?? 9000;\n const localRoot = options?.configOptions?.localRoot;\n this.startMinio({\n minioPort: minioPort,\n minioConsolePort: options?.minioConsolePort,\n storage: localRoot ? path.join(localRoot, 'minio') : undefined\n });\n\n return this.startLocal({\n ...options,\n primaryURL:\n options?.primaryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/main-bucket/?region=no-region`,\n libraryURL:\n options?.libraryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/library-bucket/?region=no-region`\n });\n }\n\n public startMinio(options?: {\n image?: string;\n version?: string;\n minioPort?: number;\n minioConsolePort?: number;\n storage?: string;\n }) {\n this.logger.debug(' starting minio...');\n var composeMinio = pkg.assets('compose-backend.yaml');\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.data('minio');\n util.ensureDir(storage, { mode: \"0775\" })\n const stubStorage = state.data('stub');\n util.ensureDir(stubStorage)\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 PL_DATA_DB_ROOT: stubStorage,\n PL_DATA_PRIMARY_ROOT: stubStorage,\n PL_DATA_LIBRARY_ROOT: stubStorage,\n PL_DATA_WORKDIR_ROOT: stubStorage,\n PL_DATA_PACKAGE_ROOT: stubStorage,\n PL_IMAGE: 'scratch'\n };\n\n this.logger.debug(` spawning child 'docker' process...`);\n const result = spawnSync(\n 'docker',\n ['compose', `--file=${composeMinio}`, 'up', '--detach', '--remove-orphans', '--pull=missing', 'minio'],\n {\n env: {\n ...process.env,\n ...envs\n },\n stdio: 'inherit'\n }\n );\n\n checkRunError(result, 'failed to start MinIO service in docker');\n }\n\n public buildPlatforma(options: { repoRoot: string; binPath?: string }): string {\n const cmdPath: string = path.resolve(options.repoRoot, 'cmd', 'platforma');\n const binPath: string = options.binPath ?? path.join(os.tmpdir(), 'platforma-local-build');\n\n this.logger.info('Building Platforma Backend binary from sources');\n this.logger.info(` sources path: ${options.repoRoot}`);\n this.logger.info(` binary path: ${binPath}`);\n\n const result = spawnSync('go', ['build', '-o', binPath, '.'], {\n cwd: cmdPath,\n stdio: 'inherit'\n });\n\n checkRunError(result, \"failed to build platforma binary from sources using 'go build' command\");\n return binPath;\n }\n\n public startDockerS3(\n localRoot: string,\n options?: {\n image?: string;\n version?: string;\n logLevel?: string;\n\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n\n grpcPort?: number;\n grpcAddr?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n }\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 primary = plCfg.storageSettingsFromURL('s3e://testuser:testpassword@minio:9000/main-bucket');\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://localhost:9000';\n }\n\n const library = plCfg.storageSettingsFromURL('s3e://testuser:testpassword@minio:9000/library-bucket');\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://localhost:9000';\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 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_PATH: 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_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 PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage('primary', primary),\n ...this.configureDockerStorage('library', library)\n };\n\n if (options?.grpcAddr) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = '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'] = 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 const result = run.runDocker(\n this.logger,\n [\n 'compose',\n `--file=${composeS3Path}`,\n 'up',\n '--detach',\n '--remove-orphans',\n '--pull=missing',\n 'minio',\n 'backend'\n ],\n {\n env: envs,\n stdio: 'inherit'\n },\n {\n plImage: image,\n composePath: composeS3Path\n }\n );\n\n checkRunError(result, 'failed to start Platforma Backend in Docker');\n state.isActive = true;\n\n const runInfo = this.renderRunInfo({\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 this.logger.info(`Started platforma:\\n${runInfo}`);\n }\n\n public startDocker(\n localRoot: string,\n options?: {\n primaryStorageURL?: string;\n workStoragePath?: string;\n libraryStorageURL?: string;\n\n image?: string;\n version?: 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 ) {\n var 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 primary = plCfg.storageSettingsFromURL(options?.primaryStorageURL ?? `file:${primaryFSPath}`, '.');\n const library = plCfg.storageSettingsFromURL(options?.libraryStorageURL ?? `file:${libraryFSPath}`, '.');\n\n const envs: NodeJS.ProcessEnv = {\n MINIO_IMAGE: 'quay.io/minio/minio',\n MINIO_STORAGE: storageDir('minio'),\n\n PL_IMAGE: image,\n PL_AUTH_HTPASSWD_PATH: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: 'info',\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: 'true',\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) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = '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'] = 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 const result = run.runDocker(\n this.logger,\n ['compose', `--file=${composeFSPath}`, 'up', '--detach', '--remove-orphans', '--pull=missing', 'backend'],\n {\n env: envs,\n stdio: 'inherit'\n },\n {\n plImage: image,\n composePath: composeFSPath,\n primaryPath: primaryFSPath,\n workPath: workFSPath,\n libraryPath: libraryFSPath\n }\n );\n\n checkRunError(result, 'failed to start Platforma Backend in Docker');\n state.isActive = true;\n\n const runInfo = this.renderRunInfo({\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 this.logger.info(`Started platforma:\\n${runInfo}`);\n }\n\n public stop() {\n if (!state.isActive) {\n console.log('no running service detected');\n return;\n }\n\n const lastRun = state.lastRun!;\n\n switch (lastRun.mode) {\n case 'docker':\n const result = spawnSync('docker', ['compose', '--file', lastRun.docker!.composePath!, 'down'], {\n env: {\n ...process.env,\n ...lastRun.envs\n },\n stdio: 'inherit'\n });\n state.isActive = false;\n if (result.status !== 0) process.exit(result.status);\n return;\n\n case 'process':\n if (state.isValidPID) {\n process.kill(lastRun.process!.pid!);\n }\n state.isActive = false;\n return;\n\n default:\n util.assertNever(lastRun.mode);\n }\n }\n\n public cleanup() {\n const removeWarns = [\n \"last command run cache ('pl-service start' shorthand will stop working until next full start command call)\",\n `'platforma' docker compose service containers and volumes`\n ];\n const defaultDataRoot = state.data();\n const dirsToRemove: string[] = [defaultDataRoot];\n\n if (state.lastRun?.docker?.primaryPath) {\n const dockerStoragePath = state.lastRun?.docker?.primaryPath;\n if (!dockerStoragePath.startsWith(defaultDataRoot)) {\n dirsToRemove.push(dockerStoragePath);\n }\n }\n\n if (state.lastRun?.docker?.workPath) {\n const workStoragePath = state.lastRun?.docker?.workPath;\n if (!workStoragePath.startsWith(defaultDataRoot)) {\n dirsToRemove.push(workStoragePath);\n }\n }\n\n if (state.lastRun?.process?.storagePath) {\n const localStoragePath = state.lastRun?.process?.storagePath;\n if (!localStoragePath.startsWith(defaultDataRoot)) {\n dirsToRemove.push(localStoragePath);\n }\n }\n\n const storageWarns =\n dirsToRemove.length > 0\n ? ` - storages (you'll loose all projects and calculation results stored in service instances):\\n - ${dirsToRemove.join('\\n - ')}`\n : '';\n\n var warnMessage = `\nYou are going to reset the state of platforma service\nThings to be removed:\n - ${removeWarns.join('\\n - ')}\n${storageWarns}\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 const composeToDestroy = new Set<string>(pkg.composeFiles());\n if (state.lastRun?.docker?.composePath) {\n composeToDestroy.add(state.lastRun.docker.composePath);\n }\n\n for (const composeFile of composeToDestroy) {\n this.logger.info(`Destroying docker compose '${composeFile}'`);\n this.destroyDocker(composeFile, pkg.plImageTag());\n }\n\n for (const dir of dirsToRemove) {\n this.logger.info(`Destroying '${dir}'`);\n fs.rmSync(dir, { recursive: true, force: true });\n }\n\n this.logger.info(`Destroying state dir '${state.path()}'`);\n fs.rmSync(state.path(), { recursive: true, force: true });\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 ?? '') != '') flags['license-file'] = process.env.MI_LICENSE_FILE;\n else if ((process.env.PL_LICENSE_FILE ?? '') != '') 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 var 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(\"LDAP auth settings require both 'server' and 'default DN' options to be set\");\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 try {\n lastJwt = fs.readFileSync(jwtFile, { encoding });\n } catch (e: any) { }\n\n if (lastJwt == '') {\n lastJwt = util.randomStr(64);\n fs.writeFileSync(jwtFile, lastJwt, { encoding });\n }\n\n return lastJwt;\n }\n\n private destroyDocker(composePath: string, image: string) {\n const stubStoragePath = state.data('stub');\n const result = spawnSync('docker', ['compose', '--file', composePath, 'down', '--volumes', '--remove-orphans'], {\n env: {\n ...process.env,\n PL_IMAGE: 'scratch',\n\n PL_DATA_DB_ROOT: stubStoragePath,\n PL_DATA_PRIMARY_ROOT: stubStoragePath,\n PL_DATA_LIBRARY_ROOT: stubStoragePath,\n PL_DATA_WORKDIR_ROOT: stubStoragePath,\n PL_DATA_PACKAGE_ROOT: stubStoragePath,\n\n MINIO_IMAGE: 'scratch',\n MINIO_STORAGE: stubStoragePath\n },\n stdio: 'inherit'\n });\n\n if (result.status !== 0) process.exit(result.status);\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://licensing.milaboratories.com\".`);\n\n throw new Error(`The license was not provided.`);\n }\n\n private configureDockerStorage(storageID: string, storage: types.storageOptions): NodeJS.ProcessEnv {\n const envs: NodeJS.ProcessEnv = {};\n const sType = storage.type;\n storageID = storageID.toUpperCase();\n\n switch (sType) {\n case 'S3':\n envs[`PL_DATA_${storageID}_TYPE`] = 'S3';\n envs[`PL_DATA_${storageID}_S3_BUCKET`] = storage.bucketName!;\n\n if (storage.endpoint) envs[`PL_DATA_${storageID}_S3_ENDPOINT`] = storage.endpoint;\n if (storage.presignEndpoint) envs[`PL_DATA_${storageID}_S3_PRESIGN_ENDPOINT`] = storage.presignEndpoint;\n if (storage.region) envs[`PL_DATA_${storageID}_S3_REGION`] = storage.region;\n if (storage.key) envs[`PL_DATA_${storageID}_S3_KEY`] = storage.key;\n if (storage.secret) envs[`PL_DATA_${storageID}_S3_SECRET`] = storage.secret;\n\n return envs;\n\n case 'FS':\n envs[`PL_DATA_${storageID}_TYPE`] = 'FS';\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 private readComposeFile(fPath: string): any {\n const yamlData = fs.readFileSync(fPath);\n return yaml.parse(yamlData.toString());\n }\n private writeComposeFile(fPath: string, data: any) {\n fs.writeFileSync(fPath, yaml.stringify(data));\n }\n}\n\nexport function checkRunError(result: SpawnSyncReturns<Buffer>, message?: string) {\n if (result.error) {\n throw result.error;\n }\n\n const msg = message ?? 'failed to run command';\n\n if (result.status !== 0) {\n throw new Error(`${msg}, process exited with code '${result.status}'`);\n }\n}\n\nexport type startLocalOptions = {\n version?: string;\n binaryPath?: string;\n configPath?: string;\n configOptions?: plCfg.plOptions;\n workdir?: string;\n\n primaryURL?: string;\n libraryURL?: string;\n};\n\nexport type startLocalFSOptions = startLocalOptions;\n\nexport type startLocalS3Options = startLocalOptions & {\n minioPort?: number;\n minioConsolePort?: number;\n};\n","import { Command, Flags } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Reset extends Command {\n static override description =\n 'Clear service state (forget last run command, destroy docker services, volumes and so on)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Reset);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.cleanup();\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Start extends Command {\n static override description = 'Start last run service configuraiton';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Start);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n core.startLast();\n }\n}\n","import { Command } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Stop extends Command {\n static override description = 'Stop platforma service';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Stop);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n core.stop();\n }\n}\n","import path from 'path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport * as types from '../../templates/types';\nimport state from '../../state';\n\nexport default class Docker extends Command {\n static override description = \"Run platforma backend service with 'FS' primary storage type\";\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Docker);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.')\n }\n : undefined;\n const storage = flags.storage ? path.join('.', flags.storage) : state.data('docker');\n\n core.startDocker(storage, {\n primaryStorageURL: flags['storage-primary'],\n workStoragePath: flags['storage-work'],\n libraryStorageURL: flags['storage-library'],\n\n image: flags.image,\n version: flags.version,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port']\n });\n }\n}\n","import { Command } from '@oclif/core';\nimport path from 'path';\nimport Core, { startLocalOptions } from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as platforma from '../../platforma';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.data('local');\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n var binaryPath = flags['pl-binary'];\n if (flags['pl-sources']) {\n binaryPath = core.buildPlatforma({ repoRoot: flags['pl-sources'] });\n }\n\n var listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n var listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n var listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: startLocalOptions = {\n binaryPath: binaryPath,\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] }\n }\n }\n };\n\n if (startOptions.binaryPath) {\n core.startLocal(startOptions);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => core.startLocal(startOptions))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","import path from 'path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport * as types from '../../../templates/types';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = \"Run platforma backend service with 'S3' primary storage type\";\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.StorageFlag,\n\n ...cmdOpts.LicenseFlags,\n ...cmdOpts.AuthFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.')\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.data('docker-s3');\n\n core.startDockerS3(storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port']\n });\n }\n}\n","import path from 'path';\n\nimport { Command } from '@oclif/core';\nimport Core, { startLocalS3Options } from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as platforma from '../../../platforma';\nimport * as util from '../../../util';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.S3AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.data('local-s3');\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n var binaryPath = flags['pl-binary'];\n if (flags['pl-sources']) {\n binaryPath = core.buildPlatforma({ repoRoot: flags['pl-sources'] });\n }\n\n var listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n var listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n var listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: startLocalS3Options = {\n binaryPath: binaryPath,\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n minioPort: flags['s3-address-port'],\n minioConsolePort: flags['s3-console-address-port'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: {\n auth: { enabled: authEnabled, drivers: authDrivers }\n },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] }\n }\n }\n };\n\n if (startOptions.binaryPath) {\n core.startLocalS3(startOptions);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => core.startLocalS3(startOptions))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","// DO NOT EDIT. This file was generated by oclif-index utility.\n\nimport Cmd0 from './commands/create-block';\nimport Cmd1 from './commands/reset';\nimport Cmd2 from './commands/start';\nimport Cmd3 from './commands/stop';\nimport Cmd4 from './commands/start/docker';\nimport Cmd5 from './commands/start/local';\nimport Cmd6 from './commands/start/docker/s3';\nimport Cmd7 from './commands/start/local/s3';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'create-block': Cmd0,\n 'reset': Cmd1,\n 'start': Cmd2,\n 'stop': Cmd3,\n 'start:docker': Cmd4,\n 'start:local': Cmd5,\n 'start:docker:s3': Cmd6,\n 'start:local:s3': Cmd7,\n};\n"],"names":["GlobalFlags","Flags","ImageFlag","VersionFlag","LicenseFlags","AddressesFlags","S3AddressesFlags","StorageFlag","PlLogFileFlag","PlWorkdirFlag","PlBinaryFlag","PlSourcesFlag","ConfigFlag","StorageWorkPathFlag","StoragePrimaryURLFlag","StorageLibraryURLFlag","AuthEnabledFlag","HTPasswdFileFlag","LDAPAddressFlag","LDAPDefaultDNFlag","AuthFlags","askYN","prompt","readlineSync","assertNever","n","createLogger","level","winston","message","indent","messageJson","indentedMessage","line","index","l","randomStr","len","randomBytes","resolveTilde","p","path","os","ensureDir","options","fs","getProcessName","pid","execSync","command","lines","blockPlatformsToChoose","allPlatforms","CreateBlockPlatforms","z","CreateBlockOptions","createBlock","logger","npmOrgName","orgName","blockName","softwarePlatforms","askForOptions","targetPath","downloadAndUnzip","platformsToRemove","noPlatforms","removePlatform","removePlatformsCompletely","replaceRegexInAllFiles","needSoftware","url","pathInArchive","outputPath","content","tmpDir","tmpFile","f","Writable","createWriteStream","tmpRepo","decompress","dir","platform","deleteRegexInFile","replaceInFile","json","patterns","files","getAllFiles","from","to","fPath","replaceRegexInFile","replacer","newContent","what","_CreateBlock","Command","flags","util.createLogger","block.createBlock","__publicField","cmdOpts.GlobalFlags","CreateBlock","resolve","assets","composeFiles","entry","value","readFileSync","plImageTag","version","getDefaultPlVersion","_State","stateDir","stateFile","pkg.readFileSync","_b","_a","processName","util.getProcessName","info","State","state","runDocker","args","stateToSave","runSync","runProcess","cmd","result","run","rerunLast","child","spawn","exitAfterChild","sigintHandler","code","spawnSync","emptyS3Settings","id","emptyFSSettings","storageSettingsFromURL","storageURL","baseDir","defaults","bucketName","region","keyPrefix","loadDefaults","jwtKey","localRoot","log","grpc","_c","defaultBool","_e","_d","_g","_f","_i","_h","_k","_j","_l","core","_n","_m","_p","_o","primary","defaultStorageSettings","_q","work","_s","_r","types.emptyFSSettings","_u","_t","_w","_v","library","_x","monitoring","_y","_z","debug","_A","_B","license","_C","_D","storageID","defaultLocation","defaultBucket","storage","types.emptyS3Settings","render","disableMon","disableDbg","libraryDownloadable","miLicenseSecret","v","def","OSes","archiveOS","osName","Arches","archiveArch","archName","arch","downloadArchive","showProgress","archiveName","downloadURL","archiveFilePath","request","https","reject","response","err","totalBytes","downloadedBytes","archive","chunk","progress","extractArchive","binaryDirName","archivePath","targetDir","trimExtension","msg","tar","getBinary","binaryPath","filename","lastDotIndex","Core","run.rerunLast","checkRunError","platforma.binaryPath","configPath","workdir","plCfg.storageSettingsFromURL","configOptions","plCfg.loadDefaults","storageDirs","drv","pkg.assets","plCfg.render","runInfo","run.runProcess","minioPort","composeMinio","image","util.ensureDir","stubStorage","minioConsolePort","envs","cmdPath","binPath","composeS3Path","pkg.plImageTag","storagePath","s","storageDir","logFilePath","dbFSPath","workFSPath","usersFSPath","run.runDocker","composeFSPath","primaryFSPath","libraryFSPath","lastRun","util.assertNever","removeWarns","defaultDataRoot","dirsToRemove","dockerStoragePath","workStoragePath","localStoragePath","storageWarns","warnMessage","util.askYN","composeToDestroy","pkg.composeFiles","composeFile","authDrivers","jwtFile","encoding","lastJwt","util.randomStr","composePath","stubStoragePath","file","sType","report","column","t","yamlData","yaml","data","_Reset","Reset","_Start","Start","_Stop","Stop","_Docker","authEnabled","authOptions","cmdOpts.AddressesFlags","cmdOpts.ImageFlag","cmdOpts.VersionFlag","cmdOpts.AuthFlags","cmdOpts.LicenseFlags","cmdOpts.StorageFlag","cmdOpts.StoragePrimaryURLFlag","cmdOpts.StorageWorkPathFlag","cmdOpts.StorageLibraryURLFlag","Docker","_Local","logFile","listenGrpc","listenMon","listenDbg","startOptions","platforma.getBinary","cmdOpts.PlBinaryFlag","cmdOpts.PlSourcesFlag","cmdOpts.ConfigFlag","cmdOpts.PlLogFileFlag","cmdOpts.PlWorkdirFlag","Local","_S3","cmdOpts.S3AddressesFlags","S3","COMMANDS","Cmd0","Cmd1","Cmd2","Cmd3","Cmd4","Cmd5","Cmd6","Cmd7"],"mappings":"g7BAEaA,EAAc,CACzB,YAAaC,QAAM,OAAO,CACxB,YAAa,gBACb,QAAS,OACT,QAAS,CAAC,QAAS,OAAQ,OAAQ,OAAO,EAC1C,SAAU,EACX,CAAA,CACH,EAEaC,GAAY,CACvB,MAAOD,QAAM,OAAO,CAClB,YAAa,0CACd,CAAA,CACH,EAEaE,EAAc,CACzB,QAASF,QAAM,OAAO,CACpB,YAAa,wEACd,CAAA,CACH,EAEaG,GAAe,CAC1B,QAASH,QAAM,OAAO,CACpB,YAAa,0FAAA,CACd,EACD,eAAgBA,QAAM,KAAK,CACzB,OAAQ,GACR,YACE,gHACH,CAAA,CACH,EAEaI,GAAiB,CAC5B,YAAaJ,QAAM,QAAQ,CACzB,YAAa,uDACb,IAAK,qBAAA,CACN,EAED,cAAeA,QAAM,OAAO,CAC1B,YAAa,6EACb,IAAK,uBAAA,CACN,EAED,kBAAmBA,QAAM,QAAQ,CAC/B,YAAa,6DACb,IAAK,2BAAA,CACN,EAED,oBAAqBA,QAAM,OAAO,CAChC,YAAa,mFACb,IAAK,6BAAA,CACN,EAED,aAAcA,QAAM,QAAQ,CAC1B,YAAa,wDACb,IAAK,sBAAA,CACN,EAED,eAAgBA,QAAM,OAAO,CAC3B,YAAa,8EACb,IAAK,wBACN,CAAA,CACH,EAEaK,GAAmB,CAC9B,kBAAmBL,QAAM,QAAQ,CAC/B,YAAa,4CACb,QAAS,IACT,IAAK,mBAAA,CACN,EAED,0BAA2BA,QAAM,QAAQ,CACvC,YAAa,yDACb,QAAS,KACT,IAAK,2BACN,CAAA,CACH,EAEaM,GAAc,CACzB,QAASN,QAAM,OAAO,CACpB,YAAa,2EACd,CAAA,CACH,EAEaO,GAAgB,CAC1B,cAAgBP,EAAA,MAAM,KAAK,CAC1B,YAAa,6CACd,CAAA,CACH,EAEaQ,GAAgB,CAC1B,aAAeR,EAAA,MAAM,KAAK,CACzB,YAAa,yDACd,CAAA,CACH,EAEaS,GAAe,CACzB,YAAcT,EAAA,MAAM,KAAK,CACxB,YAAa,kFACd,CAAA,CACH,EAEaU,GAAgB,CAC1B,aAAeV,EAAA,MAAM,KAAK,CACzB,YAAa,iGACd,CAAA,CACH,EAEaW,GAAa,CACxB,OAAQX,QAAM,OAAO,CACnB,YAAa,qCACd,CAAA,CACH,EAGqBA,QAAM,KAAK,CAC5B,YAAa,sDACd,CAAA,EAGI,MAAMY,GAAsB,CACjC,eAAgBZ,QAAM,KAAK,CACzB,YAAa,mDACd,CAAA,CACH,EAGqBA,QAAM,KAAK,CAC5B,YAAa,sDACd,CAAA,EAGI,MAAMa,GAAwB,CACnC,kBAAmBb,QAAM,OAAO,CAC9B,YACE;AAAA;AAAA;AAAA;AAAA,uFAKH,CAAA,CACH,EAEac,GAAwB,CACnC,kBAAmBd,QAAM,OAAO,CAC9B,YACE;AAAA;AAAA;AAAA;AAAA,uFAKH,CAAA,CACH,EAEae,GAAkB,CAC7B,eAAgBf,QAAM,QAAQ,CAC5B,YAAa,sBACd,CAAA,CACH,EAEagB,GAAmB,CAC9B,qBAAsBhB,QAAM,KAAK,CAC/B,YAAa,0EACd,CAAA,CACH,EAEaiB,GAAkB,CAC7B,mBAAoBjB,QAAM,OAAO,CAC/B,YAAa,mEACd,CAAA,CACH,EAEakB,GAAoB,CAC/B,uBAAwBlB,QAAM,OAAO,CACnC,YAAa,8FACd,CAAA,CACH,EAEamB,GAAY,CACvB,GAAGJ,GACH,GAAGC,GAEH,GAAGC,GACH,GAAGC,EACL,ECjLO,SAASE,GAAMC,EAAyB,CAEtC,OADQC,EAAa,SAAS,GAAGD,CAAM,SAAS,EACzC,gBAAkB,GAClC,CAEO,SAASE,EAAYC,EAAU,CAC9B,MAAA,IAAI,MAAM,0BAA0B,CAC5C,CAEgB,SAAAC,EAAaC,EAAgB,QAAyB,CACpE,OAAOC,EAAQ,aAAa,CAC1B,MAAAD,EAEA,OAAQC,EAAQ,OAAO,OAAO,CAAC,CAAE,MAAAD,EAAO,QAAAE,KAAc,CACpD,MAAMC,EAAS,IAAI,OAAOH,EAAM,OAAS,CAAC,EACtC,GAAA,OAAOE,GAAY,SAAU,CACzB,MAAAE,EAAc,KAAK,UAAUF,CAAO,EACpC,MAAA,MAAM,kBAAkBE,CAAW,kBAAkB,CAAA,CAE7D,MAAMC,EAAkBH,EACrB,MAAM;AAAA,CAAI,EACV,IAAI,CAACI,EAAcC,IAAmBA,IAAU,EAAID,EAAOH,EAASG,CAAK,EACzE,KAAK;AAAA,CAAI,EAIZ,MAAO,IAFWE,GAAcP,EAAQ,OAAO,WAAW,SAASO,EAAGA,CAAC,GAEpDR,CAAK,CAAC,KAAKK,CAAe,EAAA,CAC9C,EAED,WAAY,CACV,IAAIJ,EAAQ,WAAW,QAAQ,CAC7B,aAAc,CAAC,QAAS,OAAQ,OAAQ,OAAO,EAC/C,iBAAkB,EACnB,CAAA,CAAA,CACH,CACD,CACH,CAEO,SAASQ,GAAUC,EAAqB,CAC7C,OAAOC,eAAY,KAAK,KAAKD,EAAM,CAAC,CAAC,EAClC,SAAS,KAAK,EACd,MAAM,EAAGA,CAAG,CACjB,CAEO,SAASE,GAAaC,EAAmB,CAC1C,OAAAA,EAAE,WAAW,GAAG,EACXC,EAAK,KAAKC,EAAG,UAAWF,EAAE,MAAM,CAAC,CAAC,EAEpCA,CACT,CAEgB,SAAAG,EAAUH,EAAWI,EAElC,CACGC,EAAG,WAAWL,CAAC,IAInBK,EAAG,UAAUL,EAAG,CAAE,UAAW,GAAM,EAC/BI,GAAA,MAAAA,EAAS,MACRC,EAAA,UAAUL,EAAGI,EAAQ,IAAI,EAEhC,CAEO,SAASE,GAAeC,EAAqB,CAC9C,GAAA,CACE,GAAAL,EAAG,SAAS,IAAM,QACb,OAAAM,EAAA,SAAS,SAASD,CAAG,YAAa,CAAE,SAAU,OAAQ,EAAE,KAAK,EAGhE,MAAAE,EAAU,gCAAgCF,CAAG,eAC7CG,EAAQF,WAASC,EAAS,CAAE,SAAU,MAAQ,CAAA,EAAE,MAAM;AAAA,CAAI,EAG5D,OAAAC,EAAM,QAAU,EACX,GAGFA,EAAM,CAAC,EAAE,KAAK,OACX,CACH,MAAA,EAAA,CAEX,CChFA,MAAMC,GAAyB,CAAC,QAAQ,EAClCC,GAAe,CAAC,QAAS,QAAQ,EACjCC,GAAuBC,EAAA,EAAE,MAAM,CAACA,IAAE,QAAQ,OAAO,EAAGA,EAAE,EAAA,QAAQ,QAAQ,CAAC,CAAC,EAGxEC,GAAqBD,IAAE,OAAO,CAClC,WAAYA,EAAAA,EAAE,SAAS,IAAI,CAAC,EAC5B,QAASA,EAAAA,EAAE,SAAS,IAAI,CAAC,EACzB,UAAWA,EAAAA,EAAE,SAAS,IAAI,CAAC,EAC3B,kBAAmBA,EAAAA,EAAE,MAAMD,EAAoB,EAAE,OAAQb,GAAM,IAAI,IAAIA,CAAC,EAAE,OAASA,EAAE,OAAQ,CAC3F,QAAS,+CACV,CAAA,CACH,CAAC,EAID,eAAsBgB,GAAYC,EAAwB,CACxD,KAAM,CAAE,WAAAC,EAAY,QAAAC,EAAS,UAAAC,EAAW,kBAAAC,CAAA,EAAsBC,GAAc,EACtEC,EAAatB,EAAK,KAAK,QAAQ,MAAOmB,CAAS,EAErDH,EAAO,KAAK,iCAAiC,EACvC,MAAAO,GAGJ,0FACA,mCACAD,CACF,EAEM,MAAAE,EAAoBb,GAAa,OAAQZ,GAAMqB,EAAkB,QAAQrB,CAAC,EAAI,CAAC,EAC/E0B,EAAcf,GAAuB,QAAUc,EAAkB,OACvER,EAAO,KAAK,mBAAmBI,CAAiB,eAAeI,CAAiB,iCAAiCC,CAAW,EAAE,EAC9H,UAAW1B,KAAKyB,EACR,MAAAE,GAAeJ,EAAYvB,CAAC,EAEhC0B,GACF,MAAME,GAA0BL,CAAU,EAG5CN,EAAO,KAAK,6DAA6D,EACzEY,GAAuBN,EAAY,CAIjC,CAAE,KAAM,wCAAyC,GAAI,IAAIL,CAAU,EAAG,EAEtE,CAAE,KAAM,UAAW,GAAIC,CAAQ,EAE/B,CAAE,KAAM,qBAAsB,GAAIC,CAAU,CAAA,CAC7C,CACH,CAEA,SAASE,IAAoC,CAC3C,IAAIJ,EAAanC,EAAa,SAC5B,mEACF,EACImC,IAAe,KACJA,EAAA,kBAET,MAAAC,EAAUpC,EAAa,SAAS,6CAA6C,EAC7EqC,EAAYrC,EAAa,SAAS,iDAAiD,EAEnF+C,EAAe/C,EAAa,QAAQ,sCAAsC,EAC5E,IAAAsC,EAAoB,CAAC,OAAO,EAChC,GAAIS,EACK,KAAAT,EAAkB,OAAST,GAAa,QAAQ,CACrD,MAAMlB,EAAQX,EAAa,YAAY4B,GAAwB,2BAA2B,EAC1F,GAAIjB,EAAQ,EAAG,MACG2B,EAAA,KAAKV,GAAuBjB,CAAK,CAAC,CAAA,CAGxD,OAAA2B,EAAoB,MAAM,KAAK,IAAI,IAAIA,CAAiB,CAAC,EAAE,KAAK,EAEzDN,GAAmB,MAAM,CAAE,WAAAG,EAAY,QAAAC,EAAS,UAAAC,EAAW,kBAAAC,EAAmB,CACvF,CAEA,eAAeG,GAAiBO,EAAaC,EAAuBC,EAAoB,CAEhF,MAAAC,EAAU,MADC,MAAM,MAAMH,CAAG,GACD,KAAK,EAE9BI,EAAS,MAAM9B,EAAG,QAAQJ,EAAK,KAAKC,EAAG,SAAU,aAAa,CAAC,EAE/DkC,EAAUnC,EAAK,KAAKkC,EAAQ,iBAAiB,EAC7CE,EAAIC,GAAA,SAAS,MAAMC,EAAA,kBAAkBH,CAAO,CAAC,EACnD,MAAMF,EAAQ,SAAS,OAAOG,CAAC,EAE/B,MAAMG,EAAUvC,EAAK,KAAKkC,EAAQ,eAAe,EAC3C,MAAA9B,EAAG,MAAMmC,CAAO,EAChB,MAAAC,GAAWL,EAASI,CAAO,EAE3B,MAAAnC,EAAG,GAAGJ,EAAK,KAAKuC,EAASR,CAAa,EAAGC,EAAY,CAAE,UAAW,EAAA,CAAM,CAChF,CAGA,eAAeN,GAAee,EAAaC,EAA+B,CAClE,MAAA3C,EAAI2C,EAAS,YAAY,EAIzB,MAAAC,EACJ3C,EAAK,KAAKyC,EAAK,KAAM,MAAO,QAAS,cAAc,EACnD,IAAI,OAAO,KAAK1C,CAAC,kBAAmB,GAAG,CACzC,EAGM,MAAA4C,EACJ3C,EAAK,KAAKyC,EAAK,QAAS,MAAO,UAAU,EACzC,IAAI,OAAO,KAAK1C,CAAC,kBAAmB,GAAG,CACzC,EAIM,MAAA4C,EACJ3C,EAAK,KAAKyC,EAAK,WAAY,MAAO,gBAAgB,EAClD,IAAI,OAAO,KAAK1C,CAAC,mCAAoC,GAAG,CAC1D,EAIM,MAAA4C,EACJ3C,EAAK,KAAKyC,EAAK,WAAY,MAAO,gBAAgB,EAClD,IAAI,OAAO,KAAK1C,CAAC,eAAgB,GAAG,CACtC,EAGM,MAAA4C,EACJ3C,EAAK,KAAKyC,EAAK,WAAY,MAAO,YAAY,EAC9C,IAAI,OAAO,KAAK1C,CAAC,+BAAgC,GAAG,CACtD,EAEA,MAAMK,EAAG,GAAGJ,EAAK,KAAKyC,EAAK,WAAY,OAAO1C,CAAC,EAAE,EAAG,CAAE,UAAW,GAAM,EAEjE,MAAA6C,GACJ5C,EAAK,KAAKyC,EAAK,WAAY,cAAc,EACxCR,GAAY,CACL,MAAAY,EAAO,KAAK,MAAMZ,CAAO,EAC/B,cAAOY,EAAK,gBAAgB,EAAE,UAAa,SAAS9C,CAAC,WAAW,EAChE,OAAO8C,EAAK,gBAAgB,EAAE,YAAe,eAAe9C,CAAC,EAAE,EACxD,KAAK,UAAU8C,EAAM,KAAM,CAAC,CAAA,CAEvC,CACF,CAGA,eAAelB,GAA0Bc,EAAa,CAC9C,MAAArC,EAAG,GAAGJ,EAAK,KAAKyC,EAAK,UAAU,EAAG,CAAE,UAAW,GAAM,EAErD,MAAAG,GACJ5C,EAAK,KAAKyC,EAAK,WAAY,cAAc,EACxCR,GAAY,CACL,MAAAY,EAAO,KAAK,MAAMZ,CAAO,EACxB,cAAAY,EAAK,aAAgB,mDAAmD,EACxE,KAAK,UAAUA,EAAM,KAAM,CAAC,CAAA,CAEvC,EAEM,MAAAF,EACJ3C,EAAK,KAAKyC,EAAK,qBAAqB,EACpC,mBACF,CACF,CAEA,eAAeb,GACba,EACAK,EACA,CACM,MAAAC,EAAQ,MAAMC,GAAYP,CAAG,EACnC,SAAW,CAAE,KAAAQ,EAAM,GAAAC,CAAG,IAAKJ,EACzB,UAAWK,KAASJ,EACZ,MAAAK,GAAmBD,EAAOF,EAAMC,CAAE,CAG9C,CAEA,eAAeF,GAAYP,EAAgC,CAMzD,OALmB,MAAMrC,EAAG,QAAQqC,EAAK,CACvC,cAAe,GACf,UAAW,EAAA,CACZ,GAEiB,OAAQL,GAAMA,EAAE,QAAQ,EAAE,IAAKA,GAAMpC,EAAK,KAAKoC,EAAE,WAAYA,EAAE,IAAI,CAAC,CACxF,CAEA,eAAeQ,GAAcO,EAAeE,EAAoC,CAC9E,MAAMpB,EAAU,MAAM7B,EAAG,SAAS+C,CAAK,EACjCG,EAAaD,EAASpB,EAAQ,SAAA,CAAU,EACxC,MAAA7B,EAAG,UAAU+C,EAAOG,CAAU,CACtC,CAEA,eAAeF,GAAmBD,EAAeF,EAAcC,EAAY,CAClE,OAAA,MAAMN,GAAcO,EAAQlB,GAAYA,EAAQ,WAAWgB,EAAMC,CAAE,CAAC,CAC7E,CAEA,eAAeP,EAAkBQ,EAAeI,EAAc,CAC5D,OAAO,MAAMH,GAAmBD,EAAOI,EAAM,EAAE,CACjD,CCzMA,MAAqBC,EAArB,MAAqBA,UAAoBC,EAAAA,OAAQ,CAS/C,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAMF,CAAW,EACxCxC,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EAE7C,MAAAE,GAAkB5C,CAAM,CAAA,CAElC,EAdE6C,EADmBL,EACH,cAAc,kEAE9BK,EAHmBL,EAGH,WAAW,CAAC,aAAa,GAEzCK,EALmBL,EAKH,QAAQ,CACtB,GAAGM,CACL,GAPF,IAAqBC,GAArBP,ECDO,SAASxD,MAAQD,EAAqB,CAC3C,OAAOiE,UAAQ,UAAW,KAAM,GAAGjE,CAAC,CACtC,CAMO,SAASkE,KAAUlE,EAAqB,CACtC,OAAAC,GAAK,SAAU,GAAGD,CAAC,CAC5B,CAEO,SAASmE,IAAyB,CAEhC,OADkB9D,EAAG,YAAY6D,EAAA,CAAQ,EAE7C,OAAQE,GACAA,EAAM,WAAW,UAAU,GAAKA,EAAM,SAAS,OAAO,CAC9D,EACA,IAAKC,GAAUH,EAAOG,CAAK,CAAC,CACjC,CAEO,SAASC,MAAgBtE,EAAqB,CACnD,OAAOK,EAAG,aAAaJ,GAAK,GAAGD,CAAC,CAAC,CACnC,CAEO,SAASuE,GAAWC,EAA0B,CACnD,OAAKA,IACHA,EAAUC,EAAAA,oBAAoB,GAGzB,oCAAoCD,CAAO,EACpD,CCOA,MAAME,EAAN,MAAMA,CAAM,CAWV,YAAYC,EAAmB,CARvBb,EAAA,aAAe,CACrB,QAAS,OACT,SAAU,EACZ,GAEgBA,EAAA,iBACCA,EAAA,gBAGfa,EAAWA,GAAY1E,EAAK,QAAQC,EAAG,QAAQ,EAAG,UAAW,cAAc,EAE3E,MAAM0E,EAAY3E,EAAK,KAAK0E,EAAU,YAAY,EAElD,KAAK,QAAUA,EACf,KAAK,SAAWC,EAEXvE,EAAG,WAAWsE,CAAQ,GACzBtE,EAAG,UAAUsE,EAAU,CAAE,UAAW,GAAM,EAGxCtE,EAAG,WAAWuE,CAAS,IACpB,KAAA,MAAQ,KAAK,MAAMC,GAAiBD,CAAS,EAAE,UAAU,EAChE,CAGF,OAAc,aAAqB,CAC7B,OAACF,EAAM,WACHA,EAAA,SAAW,IAAIA,GAGhBA,EAAM,QAAA,CAGR,QAAQ1E,EAAqB,CAClC,OAAOC,EAAK,KAAK,KAAK,QAAS,GAAGD,CAAC,CAAA,CAG9B,QAAQA,EAAqB,CAClC,OAAO,KAAK,KAAK,OAAQ,GAAGA,CAAC,CAAA,CAGxB,YAAYA,EAAqB,CACtC,OAAO,KAAK,KAAK,WAAY,GAAGA,CAAC,CAAA,CAG3B,YAAa,CACnBK,EAAG,cAAc,KAAK,SAAU,KAAK,UAAU,KAAK,KAAK,CAAC,CAAA,CAG5D,IAAI,UAAoB,SAClB,OAAA,KAAK,MAAM,SACN,KAAK,MAAM,UAGfyE,GAAAC,EAAA,KAAK,MAAM,UAAX,YAAAA,EAAoB,UAApB,MAAAD,EAA6B,IAI3B,KAAK,WAHH,EAGG,CAGd,IAAI,YAAsB,SACxB,GAAI,GAACA,GAAAC,EAAA,KAAK,MAAM,UAAX,YAAAA,EAAoB,UAApB,MAAAD,EAA6B,KACzB,MAAA,GAGT,MAAME,EAAcC,GAAoB,KAAK,MAAM,QAAQ,QAAQ,GAAG,EAC/D,OAAAD,IAAgB,aAAeA,EAAY,SAAS,YAAY,GAAKA,EAAY,SAAS,aAAa,CAAA,CAGhH,IAAI,SAASX,EAAgB,CAC3B,KAAK,MAAM,SAAWA,EACtB,KAAK,WAAW,CAAA,CAGlB,IAAI,SAA+B,CACjC,OAAO,KAAK,MAAM,OAAA,CAGpB,IAAI,QAAQa,EAAe,CACzB,KAAK,MAAM,QAAUA,EACrB,KAAK,WAAW,CAAA,CAEpB,EArFEpB,EADIY,EACW,YADjB,IAAMS,GAANT,EAwFA,MAAeU,EAAAD,GAAM,YAAY,EC7H1B,SAASE,GACdpE,EACAqE,EACAlF,EACAmF,EACA,OACA,OAAAH,EAAM,QAAU,CACd,GAAGA,EAAM,QAET,KAAM,SACN,IAAK,SACL,KAAAE,EACA,QAASlF,EAAQ,IACjB,KAAMA,EAAQ,IAEd,OAAQ,CACN,IAAG2E,EAAAK,EAAM,UAAN,YAAAL,EAAe,OAClB,GAAGQ,CAAA,CAEP,EAEOC,GAAQvE,EAAQ,SAAUqE,EAAMlF,CAAO,CAChD,CAEO,SAASqF,GACdxE,EACAyE,EACAJ,EACAlF,EACAmF,EACc,OACdH,EAAM,QAAU,CACd,GAAGA,EAAM,QAET,KAAM,UACN,IAAAM,EACA,KAAAJ,EACA,QAASlF,EAAQ,IACjB,KAAMA,EAAQ,IAEd,QAAS,CACP,IAAG2E,EAAAK,EAAM,UAAN,YAAAL,EAAe,QAClB,GAAGQ,CAAA,CAEP,EAEA,MAAMI,EAASC,GAAI3E,EAAQyE,EAAKJ,EAAMlF,CAAO,EAC7C,OAAAgF,EAAM,QAAQ,QAAU,CACtB,GAAGA,EAAM,QAAQ,QACjB,IAAKO,EAAO,GACd,EACOA,CACT,CAEgB,SAAAE,GAAU5E,EAAwBb,EAAiD,CAC7F,GAAA,CAACgF,EAAM,QACH,MAAA,IAAI,MAAM,8EAA8E,EAGtF,OAAAhF,EAAA,CACR,IAAKgF,EAAM,QAAQ,QACnB,IAAK,CACH,GAAGA,EAAM,QAAQ,KACjB,GAAGhF,EAAQ,GACb,EACA,GAAGA,CACL,EAEOoF,GAAQvE,EAAQmE,EAAM,QAAQ,IAAKA,EAAM,QAAQ,KAAMhF,CAAO,CACvE,CAEA,SAASwF,GAAI3E,EAAwByE,EAAaJ,EAAyBlF,EAAqC,CACvGa,EAAA,MACL;AAAA,SAAoB,KAAK,UAAUb,EAAQ,GAAG,CAAC;AAAA,SAAY,KAAK,UAAU,CAACsF,EAAK,GAAGJ,CAAI,CAAC,CAAC;AAAA,QAAWlF,EAAQ,GAAG,EACjH,EAEAA,EAAQ,IAAM,CAAE,GAAG,QAAQ,IAAK,GAAGA,EAAQ,GAAI,EAC/Ca,EAAO,MAAM,0BAA0B,EACvC,MAAM6E,EAAQC,EAAA,MAAML,EAAKJ,EAAMlF,CAAO,EACtC,IAAI4F,EAA0B,GAK9B,MAAMC,EAAgB,IAAM,CAC1BH,EAAM,KAAK,QAAQ,EACFE,EAAA,EACnB,EAEA,OAAA/E,EAAO,MAAM,6BAA6B,EAClC,QAAA,GAAG,SAAUgF,CAAa,EAE5BH,EAAA,GAAG,QAAUI,GAAS,CAClB,QAAA,eAAe,SAAUD,CAAa,EAC1CD,GACF,QAAQ,KAAKE,CAAI,CACnB,CACD,EAEMJ,CACT,CAEA,SAASN,GACPvE,EACAyE,EACAJ,EACAlF,EAC0B,CACnB,OAAAa,EAAA,MACL;AAAA,SAAoB,KAAK,UAAUb,EAAQ,GAAG,CAAC;AAAA,SAAY,KAAK,UAAU,CAACsF,EAAK,GAAGJ,CAAI,CAAC,CAAC;AAAA,QAAWlF,EAAQ,GAAG,EACjH,EAEAA,EAAQ,IAAM,CAAE,GAAG,QAAQ,IAAK,GAAGA,EAAQ,GAAI,EACxC+F,YAAUT,EAAKJ,EAAMlF,CAAO,CACrC,CCNO,SAASgG,GAAgBC,EAA+B,CACtD,MAAA,CACL,GAAAA,EACA,KAAM,KACN,iBAAkB,KAClB,SAAU,GACV,OAAQ,GACR,gBAAiB,GACjB,WAAY,GACZ,aAAc,GACd,eAAgB,GAChB,IAAK,GACL,OAAQ,GACR,UAAW,GACX,eAAgB,CAAC,EACjB,gBAAiB,EACnB,CACF,CAmBO,SAASC,GAAgBD,EAA+B,CACtD,MAAA,CACL,GAAAA,EACA,KAAM,KACN,iBAAkB,KAClB,SAAU,EACZ,CACF,CCrJgB,SAAAE,EACdC,EACAC,EACAC,EACsB,CACtBF,EAAazG,GAAayG,CAAU,EACpC,MAAMzE,EAAM,IAAI,IAAIyE,EAAY,QAAQC,CAAO,EAAE,EAEjD,OAAQ1E,EAAI,SAAU,CACpB,IAAK,MACH,IAAI4E,EAAa5E,EAAI,SACjB6E,EAAS7E,EAAI,aAAa,IAAI,QAAQ,EAEnC,MAAA,CACL,GAAG2E,EAEH,KAAM,KACN,WAAAC,EACA,OAAAC,CACF,EAEF,IAAK,OACH,IAAI5G,EAAI+B,EAAI,SAAS,MAAM,GAAG,EAAE,MAAM,CAAC,EACnC4E,EAAa3G,EAAE,CAAC,EAChB6G,EAAY7G,EAAE,OAAS,EAAIA,EAAE,CAAC,EAAI,GAE/B,MAAA,CACL,GAAG0G,EAEH,KAAM,KACN,SAAU,UAAU3E,EAAI,IAAI,IAC5B,WAAA4E,EACA,UAAAE,EACA,OAAQ9E,EAAI,aAAa,IAAI,QAAQ,EACrC,IAAKA,EAAI,SAAW,UAAUA,EAAI,QAAQ,GAAK,GAC/C,OAAQA,EAAI,SAAW,UAAUA,EAAI,QAAQ,GAAK,EACpD,EAEF,IAAK,QACH,IAAI/B,EAAI+B,EAAI,SAAS,MAAM,GAAG,EAAE,MAAM,CAAC,EACnC4E,EAAa3G,EAAE,CAAC,EAChB6G,EAAY7G,EAAE,OAAS,EAAIA,EAAE,CAAC,EAAI,GAE/B,MAAA,CACL,GAAG0G,EAEH,KAAM,KACN,SAAU,WAAW3E,EAAI,IAAI,IAC7B,WAAA4E,EACA,UAAAE,EACA,OAAQ9E,EAAI,aAAa,IAAI,QAAQ,EACrC,IAAKA,EAAI,SAAW,UAAUA,EAAI,QAAQ,GAAK,GAC/C,OAAQA,EAAI,SAAW,UAAUA,EAAI,QAAQ,GAAK,EACpD,EAEF,IAAK,QACI,MAAA,CACL,KAAM,KACN,SAAUA,EAAI,QAChB,EAEF,QACE,MAAM,IAAI,MAAM,qBAAqBA,EAAI,QAAQ,oBAAoB,CAAA,CAE3E,CAEgB,SAAA+E,GAAaC,EAAgB3G,EAA6C,sFACxF,MAAM4G,GAAY5G,GAAA,YAAAA,EAAS,YAAagF,EAAM,KAAK,cAAc,EAE3D6B,EAAyB,CAC7B,QAAOlC,EAAA3E,GAAA,YAAAA,EAAS,MAAT,YAAA2E,EAAc,QAAS,OAC9B,OAAMD,EAAA1E,GAAA,YAAAA,EAAS,MAAT,YAAA0E,EAAc,OAAQ,GAAGkC,CAAS,qBAC1C,EAEME,EAA2B,CAC/B,SAAQC,EAAA/G,GAAA,YAAAA,EAAS,OAAT,YAAA+G,EAAe,SAAU,iBACjC,IAAK,CACH,OAAQC,GAAYC,GAAAC,EAAAlH,GAAA,YAAAA,EAAS,OAAT,YAAAkH,EAAe,MAAf,YAAAD,EAAoB,OAAQ,EAAK,EACrD,iBAAgBE,GAAAC,EAAApH,GAAA,YAAAA,EAAS,OAAT,YAAAoH,EAAe,MAAf,YAAAD,EAAoB,iBAAkB,SACtD,WAAUE,GAAAC,EAAAtH,GAAA,YAAAA,EAAS,OAAT,YAAAsH,EAAe,MAAf,YAAAD,EAAoB,WAAY,GAAGT,CAAS,kBACtD,UAASW,IAAAC,GAAAxH,GAAA,YAAAA,EAAS,OAAT,YAAAwH,GAAe,MAAf,YAAAD,GAAoB,UAAW,GAAGX,CAAS,iBAEpD,IAAGa,GAAAzH,GAAA,YAAAA,EAAS,OAAT,YAAAyH,GAAe,GAAA,CAEtB,EAEMC,EAA2B,CAC/B,KAAM,CACJ,UAASC,IAAAC,GAAA5H,GAAA,YAAAA,EAAS,OAAT,YAAA4H,GAAe,OAAf,YAAAD,GAAqB,UAAW,GACzC,UAASE,IAAAC,GAAA9H,GAAA,YAAAA,EAAS,OAAT,YAAA8H,GAAe,OAAf,YAAAD,GAAqB,UAAW,CACvC,CAAE,OAAQ,MAAO,IAAKlB,CAAO,EAC7B,CAAE,OAAQ,WAAY,KAAM,GAAGC,CAAS,iBAAkB,CAAA,CAE9D,EACA,GAAI,CACF,KAAM,GAAGA,CAAS,KAAA,CAEtB,EAEMmB,EAAUC,GACd,OACA,GAAGpB,CAAS,iBACZ,eACAqB,GAAAjI,GAAA,YAAAA,EAAS,WAAT,YAAAiI,GAAmB,OACrB,EAEI,IAAAC,EAEJ,QADcC,IAAAC,GAAApI,GAAA,YAAAA,EAAS,WAAT,YAAAoI,GAAmB,OAAnB,YAAAD,GAAyB,KACxB,CACb,KAAK,OACL,IAAK,KACID,EAAAG,GAAsB,MAAM,EACnCH,EAAK,WAAWI,IAAAC,GAAAvI,GAAA,YAAAA,EAAS,WAAT,YAAAuI,GAAmB,OAAnB,YAAAD,GAAyB,WAAY,GAAG1B,CAAS,iBACjEsB,EAAK,mBAAmBM,IAAAC,GAAAzI,GAAA,YAAAA,EAAS,WAAT,YAAAyI,GAAmB,OAAnB,YAAAD,GAAyB,mBAAoB,KACrE,MAEF,QACQ,MAAA,IAAI,MAAM,mFAAmF,CAAA,CAGvG,MAAME,EAAUV,GACd,UACA,GAAGpB,CAAS,oBACZ,kBACA+B,GAAA3I,GAAA,YAAAA,EAAS,WAAT,YAAA2I,GAAmB,OACrB,EAEMC,EAAuC,CAC3C,QAAS5B,GAAY6B,GAAA7I,GAAA,YAAAA,EAAS,aAAT,YAAA6I,GAAqB,QAAS,EAAI,EACvD,SAAQC,GAAA9I,GAAA,YAAAA,EAAS,aAAT,YAAA8I,GAAqB,SAAU,gBACzC,EACMC,EAA6B,CACjC,QAAS/B,GAAYgC,GAAAhJ,GAAA,YAAAA,EAAS,QAAT,YAAAgJ,GAAgB,QAAS,EAAI,EAClD,SAAQC,GAAAjJ,GAAA,YAAAA,EAAS,QAAT,YAAAiJ,GAAgB,SAAU,gBACpC,EACMC,EAAiC,CACrC,QAAOC,GAAAnJ,GAAA,YAAAA,EAAS,UAAT,YAAAmJ,GAAkB,QAAS,GAClC,OAAMC,GAAApJ,GAAA,YAAAA,EAAS,UAAT,YAAAoJ,GAAkB,OAAQ,EAClC,EAEO,MAAA,CACL,UAAAxC,EACA,QAAAsC,EACA,IAAArC,EACA,KAAAC,EACA,KAAAY,EACA,WAAAkB,EACA,MAAAG,EACA,SAAU,CAAE,QAAAhB,EAAS,KAAAG,EAAM,QAAAQ,CAAQ,EACnC,MAAO,CAAE,oBAAqB,EAAK,CACrC,CACF,CAEA,SAASV,GACPqB,EACAC,EACAC,EACAvJ,EACuB,CACnB,IAAAwJ,EAEJ,OADcxJ,GAAA,YAAAA,EAAS,KACR,CACb,KAAK,OACL,IAAK,KACOwJ,EAAAnB,GAAsBgB,CAAS,EACjCG,EAAA,UAAWxJ,GAAA,YAAAA,EAAS,WAAYsJ,EACxC,MAEF,IAAK,KACOE,EAAAC,GAAsBJ,CAAS,EAEjCG,EAAA,UAAWxJ,GAAA,YAAAA,EAAS,WAAY,wBAChCwJ,EAAA,iBAAkBxJ,GAAA,YAAAA,EAAS,kBAAmB,wBAC9CwJ,EAAA,YAAaxJ,GAAA,YAAAA,EAAS,aAAcuJ,EAC5CC,EAAQ,aAAexC,EAAYhH,GAAA,YAAAA,EAAS,aAAc,EAAI,EAC9DwJ,EAAQ,eAAiBxC,EAAYhH,GAAA,YAAAA,EAAS,eAAgB,EAAI,EAC1DwJ,EAAA,KAAMxJ,GAAA,YAAAA,EAAS,MAAO,GACtBwJ,EAAA,QAASxJ,GAAA,YAAAA,EAAS,SAAU,GAC5BwJ,EAAA,WAAYxJ,GAAA,YAAAA,EAAS,YAAa,GAC1CwJ,EAAQ,gBAAiBxJ,GAAA,YAAAA,EAAS,iBAAkB,CAAC,EAAE,EAC/CwJ,EAAA,iBAAkBxJ,GAAA,YAAAA,EAAS,kBAAmB,GACtD,MAEF,QACE,MAAApB,EAAiB,EACX,IAAI,MAAM,sBAAsB,CAAA,CAGnC,OAAA4K,CACT,CAEO,SAASE,GAAO1J,EAAmC,CACxD,MAAM2J,EAAa3J,EAAQ,WAAW,QAAU,GAAK,YAC/C4J,EAAa5J,EAAQ,MAAM,QAAU,GAAK,YAC1C6J,EAAsB7J,EAAQ,MAAM,oBAAsB,OAAS,QAErE,IAAA8J,EAAkB9J,EAAQ,QAAQ,MAClC,OAAAA,EAAQ,QAAQ,MAAQ,KACR8J,EAAA7J,EAAG,aAAaD,EAAQ,QAAQ,IAAI,EAAE,WAAW,QAAQ,GAGtE;AAAA;AAAA,YAEGA,EAAQ,QAAQ,KAAK;AAAA,WACtBA,EAAQ,QAAQ,IAAI;AAAA;AAAA;AAAA,YAGnBA,EAAQ,IAAI,KAAK;AAAA;AAAA,eAEdA,EAAQ,IAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMnB2J,CAAU;AAAA,aACT3J,EAAQ,WAAW,MAAM;AAAA;AAAA,OAE/B4J,CAAU;AAAA,aACJ5J,EAAQ,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQlBA,EAAQ,KAAK,MAAM;AAAA;AAAA,kBAEhB,KAAK,UAAUA,EAAQ,KAAK,IAAI,MAAM,CAAC;AAAA;AAAA,yBAEhCA,EAAQ,KAAK,IAAI,cAAc;AAAA;AAAA,uBAEjCA,EAAQ,KAAK,IAAI,QAAQ;AAAA,sBAC1BA,EAAQ,KAAK,IAAI,OAAO;AAAA;AAAA;AAAA,iBAG7B,KAAK,UAAUA,EAAQ,KAAK,KAAK,OAAO,CAAC;AAAA,UAChD,KAAK,UAAUA,EAAQ,KAAK,KAAK,OAAO,CAAC;AAAA;AAAA,aAEtCA,EAAQ,KAAK,GAAG,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAYH6J,CAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOvC,KAAK,UAAU7J,EAAQ,SAAS,OAAO,CAAC;AAAA,UACxC,KAAK,UAAUA,EAAQ,SAAS,OAAO,CAAC;AAAA,UACxC,KAAK,UAAUA,EAAQ,SAAS,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,oBAI1BA,EAAQ,SAAS,KAAiC,QAAQ;AAAA;AAAA;AAAA;AAAA,wBAIvD,KAAK,UAAU8J,CAAe,CAAC;AAAA;AAAA;AAAA,qBAGlC9J,EAAQ,SAAS;AAAA;AAAA;AAAA,CAItC,CAEA,SAASgH,EAAY+C,EAAwBC,EAAuB,CAC3D,OAAAD,IAAM,OAAYC,EAAMD,CACjC,CCrRO,MAAME,GAAO,CAAC,QAAS,QAAS,SAAS,EAGzC,SAASC,GAAUC,EAAyB,CAC3C,MAAA5H,EAAqBzC,EAAG,SAAS,EAEvC,OAAQyC,EAAU,CAChB,IAAK,SACI,MAAA,QACT,IAAK,QACI,MAAA,QACT,IAAK,QACI,MAAA,UACT,QACE,MAAM,IAAI,MACR,qBAAqBA,CAAQ,oFAC3B,KAAK,UAAU0H,EAAI,CACvB,CAAA,CAEN,CAEa,MAAAG,GAAS,CAAC,QAAS,OAAO,EAGhC,SAASC,GAAYC,EAA6B,CACjD,MAAAC,EAAmBzK,EAAG,KAAK,EAEjC,OAAQyK,EAAM,CACZ,IAAK,QACI,MAAA,QACT,IAAK,MACI,MAAA,QACT,QACE,MAAM,IAAI,MACR,2BAA2BA,CAAI,6FAC7B,KAAK,UAAUH,EAAM,CACzB,CAAA,CAEN,CAEgB,SAAAI,GACd3J,EACAb,EAMiB,CACX,MAAAoE,GAAUpE,GAAA,YAAAA,EAAS,UAAWqE,sBAAoB,EAClDoG,GAAezK,GAAA,YAAAA,EAAS,eAAgB,QAAQ,OAAO,MAEvD0K,EAAc,MAAMtG,CAAO,IAAIiG,GAAa,CAAA,OAC5CM,GAAc3K,GAAA,YAAAA,EAAS,cAAe,yCAAyCkK,GAAW,CAAA,IAAIQ,CAAW,GAEzGE,GAAkB5K,GAAA,YAAAA,EAAS,SAAUgF,EAAM,SAAS0F,CAAW,EACjE,GAAAzK,EAAG,WAAW2K,CAAe,EACxB,OAAA/J,EAAA,KAAK,gDAAgD+J,CAAe,kBAAkB,EACtF,QAAQ,QAAQA,CAAe,EAGrC3K,EAAA,UAAUJ,EAAK,QAAQ+K,CAAe,EAAG,CAAE,UAAW,GAAM,EAE/D/J,EAAO,KAAK;AAAA,aAAsD8J,CAAW;AAAA,aAAgBC,CAAe,EAAE,EAExG,MAAAC,EAAUC,GAAM,IAAIH,CAAW,EAErC,OAAO,IAAI,QAAQ,CAAC9G,EAASkH,IAAW,CAC9BF,EAAA,GAAG,WAAaG,GAAa,CAC/B,GAAA,CAACA,EAAS,WAAY,CAClB,MAAAC,EAAM,IAAI,MAAM,yEAAyE,EAC/FJ,EAAQ,QAAQ,EAChBE,EAAOE,CAAG,EACV,MAAA,CAEE,GAAAD,EAAS,aAAe,IAAK,CACzB,MAAAC,EAAM,IAAI,MAAM,+BAA+BD,EAAS,UAAU,IAAIA,EAAS,aAAa,EAAE,EACpGH,EAAQ,QAAQ,EAChBE,EAAOE,CAAG,EACV,MAAA,CAGF,MAAMC,EAAa,SAASF,EAAS,QAAQ,gBAAgB,GAAK,IAAK,EAAE,EACzE,IAAIG,EAAkB,EAEhB,MAAAC,EAAUnL,EAAG,kBAAkB2K,CAAe,EAEpDI,EAAS,KAAKI,CAAO,EACZJ,EAAA,GAAG,OAASK,GAAU,CAC7BF,GAAmBE,EAAM,OACnB,MAAAC,EAAYH,EAAkBD,EAAc,IAC9CT,GACF,QAAQ,OAAO,MAAM,kBAAkBa,EAAS,QAAQ,CAAC,CAAC,KAAK,CACjE,CACD,EAEQN,EAAA,GAAG,QAAUC,GAAe,CACnChL,EAAG,WAAW2K,CAAe,EAC7B/J,EAAO,MAAM,wCAAwCoK,EAAI,OAAO,EAAE,EAClEJ,EAAQ,QAAQ,EAChBE,EAAOE,CAAG,CAAA,CACX,EAEOG,EAAA,GAAG,SAAU,IAAM,CACzBA,EAAQ,MAAM,EACdvK,EAAO,KAAK,sBAAsB,EAClCgK,EAAQ,QAAQ,EAChBhH,EAAQ+G,CAAe,CAAA,CACxB,CAAA,CACF,CAAA,CACF,CACH,CAEgB,SAAAW,GACd1K,EACAb,EAKQ,CACRa,EAAO,MAAM,uBAAuB,EAE9B,MAAAuD,GAAUpE,GAAA,YAAAA,EAAS,UAAWqE,sBAAoB,EACjDxD,EAAA,MAAM,eAAeuD,CAAO,GAAG,EACtC,MAAMsG,EAAc,GAAGc,GAAc,CAAE,QAAApH,CAAA,CAAS,CAAC,OAE3CqH,GAAczL,GAAA,YAAAA,EAAS,cAAegF,EAAM,SAAS0F,CAAW,EAC/D7J,EAAA,MAAM,oBAAoB4K,CAAW,GAAG,EAE/C,MAAMC,GAAY1L,GAAA,YAAAA,EAAS,YAAa2L,GAAcF,CAAW,EAG7D,GAFG5K,EAAA,MAAM,kBAAkB6K,CAAS,GAAG,EAEvCzL,EAAG,WAAWyL,CAAS,EAClB,OAAA7K,EAAA,KAAK,+CAA+C6K,CAAS,UAAU,EACvEA,EAGT,GAAI,CAACzL,EAAG,WAAWwL,CAAW,EAAG,CACzB,MAAAG,EAAM,kDAAkDH,CAAW,IACzE,MAAA5K,EAAO,MAAM+K,CAAG,EACV,IAAI,MAAMA,CAAG,CAAA,CAGrB,OAAK3L,EAAG,WAAWyL,CAAS,IACnB7K,EAAA,MAAM,0BAA0B6K,CAAS,GAAG,EACnDzL,EAAG,UAAUyL,EAAW,CAAE,UAAW,GAAM,GAG7C7K,EAAO,KAAK;AAAA,eAAsD4K,CAAW;AAAA,gBAAmBC,CAAS,EAAE,EAE3GG,GAAI,EAAE,CACJ,KAAMJ,EACN,IAAKC,EACL,KAAM,GACN,KAAM,EAAA,CACP,EAED7K,EAAO,KAAK,oBAAoB,EAEzB6K,CACT,CAEgB,SAAAI,GACdjL,EACAb,EACiB,CACjB,OAAOwK,GAAgB3J,EAAQb,CAAO,EAAE,KAAMyL,GAAgBF,GAAe1K,EAAQ,CAAE,YAAA4K,CAAa,CAAA,CAAC,CACvG,CAEA,SAASD,GAAcxL,EAAwC,CAE7D,MAAO,OADSA,GAAA,YAAAA,EAAS,UAAWqE,sBAAoB,CACpC,IAAIgG,GAAa,CAAA,EACvC,CAEgB,SAAA0B,GAAW3H,KAAqBxE,EAAqB,CAC5D,OAAAoF,EAAM,SAASwG,GAAc,CAAE,QAAApH,CAAS,CAAA,EAAG,GAAGxE,CAAC,CACxD,CAEA,SAAS+L,GAAcK,EAA0B,CACzC,MAAAC,EAAeD,EAAS,YAAY,GAAG,EAC7C,OAAIC,IAAiB,GACZD,EAEFA,EAAS,MAAM,EAAGC,CAAY,CACvC,CCrLA,MAAqBC,CAAK,CACxB,YAA6BrL,EAAwB,CAAxB,KAAA,OAAAA,CAAA,CAEtB,WAAY,CACX,MAAA0E,EAAS4G,GAAc,KAAK,OAAQ,CAAE,MAAO,UAAW,EAC9DC,EAAc7G,EAAQ,0EAA0E,CAAA,CAG3F,WAAWvF,EAA2C,yBACrD,MAAAsF,GAAMtF,GAAA,YAAAA,EAAS,aAAcqM,GAAqBrM,GAAA,YAAAA,EAAS,QAAS,WAAY,WAAW,EACjG,IAAIsM,EAAatM,GAAA,YAAAA,EAAS,WACpB,MAAAuM,GAAkBvM,GAAA,YAAAA,EAAS,WAAYsM,EAAa,QAAQ,IAAI,EAAItH,EAAM,QAE5EhF,GAAA,MAAAA,EAAS,aACXA,EAAQ,cAAgB,CACtB,GAAGA,EAAQ,cACX,SAAU,CACR,IAAG2E,EAAA3E,EAAQ,gBAAR,YAAA2E,EAAuB,SAC1B,QAAS6H,EAA6BxM,EAAQ,WAAYuM,GAASxF,GAAArC,EAAA1E,EAAQ,gBAAR,YAAA0E,EAAuB,WAAvB,YAAAqC,EAAiC,OAAO,CAAA,CAE/G,GAEE/G,GAAA,MAAAA,EAAS,aACXA,EAAQ,cAAgB,CACtB,GAAGA,EAAQ,cACX,SAAU,CACR,IAAGkH,EAAAlH,EAAQ,gBAAR,YAAAkH,EAAuB,SAC1B,QAASsF,EAA6BxM,EAAQ,WAAYuM,GAASnF,GAAAH,EAAAjH,EAAQ,gBAAR,YAAAiH,EAAuB,WAAvB,YAAAG,EAAiC,OAAO,CAAA,CAE/G,GAGF,MAAMqF,EAAgBC,GAAmB,KAAK,WAAW,EAAG1M,GAAA,YAAAA,EAAS,aAAa,EAE7E,KAAA,OAAO,MAAM,uBAAuB,EACpC,KAAA,cAAasH,GAAAH,EAAAnH,GAAA,YAAAA,EAAS,gBAAT,YAAAmH,EAAwB,UAAxB,YAAAG,EAAiC,OAAOE,GAAAH,EAAArH,GAAA,YAAAA,EAAS,gBAAT,YAAAqH,EAAwB,UAAxB,YAAAG,EAAiC,IAAI,EAE/F,MAAMmF,EAAwB,CAC5B,GAAGF,EAAc,SAAS,YAC1B,GAAGA,EAAc,SAAS,kBAC1B,GAAGA,EAAc,SAAS,eAC5B,EACIA,EAAc,SAAS,QAAQ,OAAS,MAC1CE,EAAY,KAAKF,EAAc,SAAS,QAAQ,QAAQ,EAEtDA,EAAc,SAAS,QAAQ,OAAS,OAC1CE,EAAY,KAAKF,EAAc,SAAS,QAAQ,QAAQ,EACxDA,EAAc,MAAM,oBAAsB,IAExCA,EAAc,SAAS,KAAK,OAAS,MACvCE,EAAY,KAAKF,EAAc,SAAS,KAAK,QAAQ,EAGlD,KAAA,OAAO,MAAM,oCAAoC,EACtD,UAAWnK,KAAOqK,EACX1M,EAAG,WAAWqC,CAAG,IACpB,KAAK,OAAO,MAAM,QAAQA,CAAG,GAAG,EAChCrC,EAAG,UAAUqC,EAAK,CAAE,UAAW,GAAM,GAIzC,UAAWsK,KAAOH,EAAc,KAAK,KAAK,QACpCG,EAAI,SAAW,aACZ3M,EAAG,WAAW2M,EAAI,IAAI,IACzB,KAAK,OAAO,MAAM,4CAA4CA,EAAI,IAAI,KAAK,EAC3E3M,EAAG,aAAa4M,EAAW,gBAAgB,EAAGD,EAAI,IAAI,IAKvDN,IACHA,EAAazM,EAAK,KAAK4M,EAAc,UAAW,aAAa,EAC7D,KAAK,OAAO,MAAM,8BAA8BH,CAAU,MAAM,EAChErM,EAAG,cAAcqM,EAAYQ,GAAaL,CAAa,CAAC,GAGpD,MAAAM,EAAU,KAAK,cAAc,CACjC,WAAAT,EACA,OAAQG,EAAc,KAAK,GAAG,KAC9B,QAASA,EAAc,KAAK,OAC5B,QAASA,EAAc,IAAI,KAC3B,QAASA,EAAc,SAAS,QAChC,KAAMA,EAAc,SAAS,KAC7B,QAASA,EAAc,SAAS,OAAA,CACjC,EAED,YAAK,OAAO,KAAK;AAAA,EAAwBM,CAAO,EAAE,EAE3CC,GACL,KAAK,OACL1H,EACA,CAAC,UAAWgH,CAAU,EACtB,CACE,IAAKC,EACL,MAAO,SACT,EACA,CACE,YAAaE,EAAc,SAAA,CAE/B,CAAA,CAGK,aAAazM,EAA6C,OAC1D,KAAA,OAAO,MAAM,0CAA0C,EAEtD,MAAAiN,GAAYjN,GAAA,YAAAA,EAAS,YAAa,IAClC4G,GAAYjC,EAAA3E,GAAA,YAAAA,EAAS,gBAAT,YAAA2E,EAAwB,UAC1C,YAAK,WAAW,CACd,UAAAsI,EACA,iBAAkBjN,GAAA,YAAAA,EAAS,iBAC3B,QAAS4G,EAAY/G,EAAK,KAAK+G,EAAW,OAAO,EAAI,MAAA,CACtD,EAEM,KAAK,WAAW,CACrB,GAAG5G,EACH,YACEA,GAAA,YAAAA,EAAS,aAAc,yCAAyCiN,CAAS,iCAC3E,YACEjN,GAAA,YAAAA,EAAS,aAAc,yCAAyCiN,CAAS,mCAAA,CAC5E,CAAA,CAGI,WAAWjN,EAMf,CACI,KAAA,OAAO,MAAM,qBAAqB,EACnC,IAAAkN,EAAeL,EAAW,sBAAsB,EAEpD,MAAMzI,EAAUpE,GAAA,MAAAA,EAAS,QAAU,IAAIA,EAAQ,OAAQ,GAAK,GAC5D,KAAK,OAAO,MAAM,sBAAsBoE,CAAO,EAAE,EACjD,MAAM+I,GAAQnN,GAAA,YAAAA,EAAS,QAAS,sBAAsBoE,CAAO,GAC7D,KAAK,OAAO,MAAM,oBAAoB+I,CAAK,EAAE,EAE7C,MAAM3D,GAAUxJ,GAAA,YAAAA,EAAS,UAAWgF,EAAM,KAAK,OAAO,EACtDoI,EAAe5D,EAAS,CAAE,KAAM,OAAQ,EAClC,MAAA6D,EAAcrI,EAAM,KAAK,MAAM,EACrCoI,EAAeC,CAAW,EAEpB,MAAAJ,GAAYjN,GAAA,YAAAA,EAAS,YAAa,IAClCsN,GAAmBtN,GAAA,YAAAA,EAAS,mBAAoB,KAEhDuN,EAAO,CACX,YAAaJ,EACb,cAAetN,EAAK,QAAQ2J,CAAO,EACnC,WAAYyD,EAAU,SAAS,EAC/B,mBAAoBK,EAAiB,SAAS,EAE9C,gBAAiBD,EACjB,qBAAsBA,EACtB,qBAAsBA,EACtB,qBAAsBA,EACtB,qBAAsBA,EACtB,SAAU,SACZ,EAEK,KAAA,OAAO,MAAM,wCAAwC,EAC1D,MAAM9H,EAASQ,EAAA,UACb,SACA,CAAC,UAAW,UAAUmH,CAAY,GAAI,KAAM,WAAY,mBAAoB,iBAAkB,OAAO,EACrG,CACE,IAAK,CACH,GAAG,QAAQ,IACX,GAAGK,CACL,EACA,MAAO,SAAA,CAEX,EAEAnB,EAAc7G,EAAQ,yCAAyC,CAAA,CAG1D,eAAevF,EAAyD,CAC7E,MAAMwN,EAAkB3N,EAAK,QAAQG,EAAQ,SAAU,MAAO,WAAW,EACnEyN,EAAkBzN,EAAQ,SAAWH,EAAK,KAAKC,EAAG,SAAU,uBAAuB,EAEpF,KAAA,OAAO,KAAK,gDAAgD,EACjE,KAAK,OAAO,KAAK,mBAAmBE,EAAQ,QAAQ,EAAE,EACtD,KAAK,OAAO,KAAK,kBAAkByN,CAAO,EAAE,EAEtC,MAAAlI,EAASQ,YAAU,KAAM,CAAC,QAAS,KAAM0H,EAAS,GAAG,EAAG,CAC5D,IAAKD,EACL,MAAO,SAAA,CACR,EAED,OAAApB,EAAc7G,EAAQ,wEAAwE,EACvFkI,CAAA,CAGF,cACL7G,EACA5G,EAmBA,CACM,MAAA0N,EAAgBb,EAAW,sBAAsB,EACjDM,GAAQnN,GAAA,YAAAA,EAAS,QAAS2N,GAAe3N,GAAA,YAAAA,EAAS,OAAO,EAE/D,KAAK,aAAaA,GAAA,YAAAA,EAAS,QAASA,GAAA,YAAAA,EAAS,WAAW,EAExD,MAAM4N,EAAc,IAAIC,IAAgBhO,EAAK,KAAK+G,EAAW,GAAGiH,CAAC,EAC3DC,EAAcD,GAAc,CAC1B,MAAAjO,EAAIgO,EAAYC,CAAC,EACvBT,OAAAA,EAAexN,EAAG,CAAE,KAAM,OAAQ,EAC3BA,CACT,EAEMmO,EAAcH,EAAY,OAAQ,eAAe,EAClD3N,EAAG,WAAW8N,CAAW,IACzB9N,EAAA,UAAUJ,EAAK,QAAQkO,CAAW,EAAG,CAAE,UAAW,GAAM,EACxD9N,EAAA,cAAc8N,EAAa,EAAE,GAG5B,MAAAhG,EAAUyE,EAA6B,oDAAoD,EAC7F,GAAAzE,EAAQ,OAAS,KACb,MAAA,IAAI,MAAM,kEAAkE,EAElFA,EAAQ,gBAAkB,wBAGtB,MAAAW,EAAU8D,EAA6B,uDAAuD,EAChG,GAAA9D,EAAQ,OAAS,KACnB,MAAM,IAAI,MAAM,GAAGA,EAAQ,IAAI,oDAAoD,EAEnFA,EAAQ,gBAAkB,wBAGtB,MAAAsF,EAAWF,EAAW,IAAI,EAC1BG,EAAaH,EAAW,MAAM,EAC9BI,EAAcN,EAAY,gBAAgB,EAC3C3N,EAAG,WAAWiO,CAAW,GAC5BjO,EAAG,aAAa4M,EAAW,gBAAgB,EAAGqB,CAAW,EAG3D,MAAMX,EAA0B,CAC9B,YAAa,sBACb,cAAeO,EAAW,OAAO,EAEjC,SAAUX,EAEV,sBAAuBe,EACvB,WAAYlO,GAAA,YAAAA,EAAS,QACrB,gBAAiBA,GAAA,YAAAA,EAAS,YAE1B,cAAcA,GAAA,YAAAA,EAAS,WAAY,OACnC,WAAYH,EAAK,QAAQkO,CAAW,EACpC,wBAAyB,OAEzB,gBAAiBC,EACjB,qBAAsBF,EAAW,SAAS,EAC1C,qBAAsBA,EAAW,SAAS,EAC1C,qBAAsBG,EACtB,qBAAsBH,EAAW,UAAU,EAE3C,GAAG,KAAK,uBAAuB,UAAW/F,CAAO,EACjD,GAAG,KAAK,uBAAuB,UAAWW,CAAO,CACnD,EAQA,GANI1I,GAAA,MAAAA,EAAS,WAAeuN,EAAA,aAAevN,EAAQ,UAC/CA,GAAA,MAAAA,EAAS,WAAUuN,EAAK,aAAevN,EAAQ,SAAS,SAAS,GACjEA,GAAA,MAAAA,EAAS,iBAAqBuN,EAAA,mBAAqBvN,EAAQ,gBAC3DA,GAAA,MAAAA,EAAS,iBAAgBuN,EAAK,mBAAqBvN,EAAQ,eAAe,SAAS,GACnFA,GAAA,MAAAA,EAAS,YAAgBuN,EAAA,cAAgBvN,EAAQ,WACjDA,GAAA,MAAAA,EAAS,YAAWuN,EAAK,cAAgBvN,EAAQ,UAAU,SAAS,GACpEA,GAAA,MAAAA,EAAS,OACPA,EAAQ,KAAK,UACfuN,EAAK,gBAAqB,QAExBvN,EAAQ,KAAK,SAAS,CACb,UAAA4M,KAAO5M,EAAQ,KAAK,QACzB4M,EAAI,SAAW,aACjBW,EAAK,sBAA2B1N,EAAK,QAAQ+M,EAAI,IAAI,EACrDA,EAAI,KAAO,iCAGfW,EAAK,gBAAqB,KAAK,UAAUvN,EAAQ,KAAK,OAAO,CAAA,CAIjE,MAAMuF,EAAS4I,GACb,KAAK,OACL,CACE,UACA,UAAUT,CAAa,GACvB,KACA,WACA,mBACA,iBACA,QACA,SACF,EACA,CACE,IAAKH,EACL,MAAO,SACT,EACA,CACE,QAASJ,EACT,YAAaO,CAAA,CAEjB,EAEAtB,EAAc7G,EAAQ,6CAA6C,EACnEP,EAAM,SAAW,GAEX,MAAA+H,EAAU,KAAK,cAAc,CACjC,QAAS/M,GAAA,YAAAA,EAAS,SAClB,QAASA,GAAA,YAAAA,EAAS,SAClB,QAAS+N,EACT,QAAAhG,EACA,KAAM,CAAE,KAAM,KAAM,SAAUkG,CAAW,EACzC,QAAAvF,EACA,OAAQsF,CAAA,CACT,EAED,KAAK,OAAO,KAAK;AAAA,EAAuBjB,CAAO,EAAE,CAAA,CAG5C,YACLnG,EACA5G,EAuBA,CACI,IAAAoO,EAAgBvB,EAAW,sBAAsB,EACrD,MAAMM,GAAQnN,GAAA,YAAAA,EAAS,QAAS2N,GAAe3N,GAAA,YAAAA,EAAS,OAAO,EAE/D,KAAK,aAAaA,GAAA,YAAAA,EAAS,QAASA,GAAA,YAAAA,EAAS,WAAW,EAExD,MAAM4N,EAAc,IAAIC,IAAgBhO,EAAK,KAAK+G,EAAW,GAAGiH,CAAC,EAC3DC,EAAcD,GAAc,CAC1B,MAAAjO,EAAIgO,EAAYC,CAAC,EACvBT,OAAAA,EAAexN,EAAG,CAAE,KAAM,OAAQ,EAC3BA,CACT,EAEMmO,EAAcH,EAAY,OAAQ,eAAe,EAClD3N,EAAG,WAAW8N,CAAW,IACzB9N,EAAA,UAAUJ,EAAK,QAAQkO,CAAW,EAAG,CAAE,UAAW,GAAM,EACxD9N,EAAA,cAAc8N,EAAa,EAAE,GAG5B,MAAAC,EAAWF,EAAW,IAAI,EAC1BO,EAAgBP,EAAW,SAAS,EACpCQ,EAAgBR,EAAW,SAAS,EACpCG,EAAaH,EAAW,MAAM,EAC9BI,EAAcN,EAAY,gBAAgB,EAC3C3N,EAAG,WAAWiO,CAAW,GAC5BjO,EAAG,aAAa4M,EAAW,gBAAgB,EAAGqB,CAAW,EAGrD,MAAAnG,EAAUyE,GAA6BxM,GAAA,YAAAA,EAAS,oBAAqB,QAAQqO,CAAa,GAAI,GAAG,EACjG3F,EAAU8D,GAA6BxM,GAAA,YAAAA,EAAS,oBAAqB,QAAQsO,CAAa,GAAI,GAAG,EAEjGf,EAA0B,CAC9B,YAAa,sBACb,cAAeO,EAAW,OAAO,EAEjC,SAAUX,EACV,sBAAuBe,EACvB,WAAYlO,GAAA,YAAAA,EAAS,QACrB,gBAAiBA,GAAA,YAAAA,EAAS,YAE1B,aAAc,OACd,WAAYH,EAAK,QAAQkO,CAAW,EACpC,wBAAyB,OAEzB,gBAAiBC,EACjB,qBAAsBK,EACtB,qBAAsBC,EACtB,qBAAsBL,EACtB,qBAAsBH,EAAW,UAAU,EAE3C,GAAG,KAAK,uBAAuB,UAAW/F,CAAO,EACjD,GAAG,KAAK,uBAAuB,UAAWW,CAAO,CACnD,EASA,GAPI1I,GAAA,MAAAA,EAAS,WAAeuN,EAAA,aAAevN,EAAQ,UAC/CA,GAAA,MAAAA,EAAS,WAAUuN,EAAK,aAAevN,EAAQ,SAAS,SAAS,GACjEA,GAAA,MAAAA,EAAS,iBAAqBuN,EAAA,mBAAqBvN,EAAQ,gBAC3DA,GAAA,MAAAA,EAAS,iBAAgBuN,EAAK,mBAAqBvN,EAAQ,eAAe,SAAS,GACnFA,GAAA,MAAAA,EAAS,YAAgBuN,EAAA,cAAgBvN,EAAQ,WACjDA,GAAA,MAAAA,EAAS,YAAWuN,EAAK,cAAgBvN,EAAQ,UAAU,SAAS,GAEpEA,GAAA,MAAAA,EAAS,OACPA,EAAQ,KAAK,UACfuN,EAAK,gBAAqB,QAExBvN,EAAQ,KAAK,SAAS,CACb,UAAA4M,KAAO5M,EAAQ,KAAK,QACzB4M,EAAI,SAAW,aACjBW,EAAK,sBAA2B1N,EAAK,QAAQ+M,EAAI,IAAI,EACrDA,EAAI,KAAO,iCAGfW,EAAK,gBAAqB,KAAK,UAAUvN,EAAQ,KAAK,OAAO,CAAA,CAIjE,MAAMuF,EAAS4I,GACb,KAAK,OACL,CAAC,UAAW,UAAUC,CAAa,GAAI,KAAM,WAAY,mBAAoB,iBAAkB,SAAS,EACxG,CACE,IAAKb,EACL,MAAO,SACT,EACA,CACE,QAASJ,EACT,YAAaiB,EACb,YAAaC,EACb,SAAUJ,EACV,YAAaK,CAAA,CAEjB,EAEAlC,EAAc7G,EAAQ,6CAA6C,EACnEP,EAAM,SAAW,GAEX,MAAA+H,EAAU,KAAK,cAAc,CACjC,QAAS/M,GAAA,YAAAA,EAAS,SAClB,QAASA,GAAA,YAAAA,EAAS,SAClB,QAAS+N,EACT,QAAAhG,EACA,KAAM,CAAE,KAAM,KAAM,SAAUkG,CAAW,EACzC,QAAAvF,EACA,OAAQsF,CAAA,CACT,EAED,KAAK,OAAO,KAAK;AAAA,EAAuBjB,CAAO,EAAE,CAAA,CAG5C,MAAO,CACR,GAAA,CAAC/H,EAAM,SAAU,CACnB,QAAQ,IAAI,6BAA6B,EACzC,MAAA,CAGF,MAAMuJ,EAAUvJ,EAAM,QAEtB,OAAQuJ,EAAQ,KAAM,CACpB,IAAK,SACG,MAAAhJ,EAASQ,EAAAA,UAAU,SAAU,CAAC,UAAW,SAAUwI,EAAQ,OAAQ,YAAc,MAAM,EAAG,CAC9F,IAAK,CACH,GAAG,QAAQ,IACX,GAAGA,EAAQ,IACb,EACA,MAAO,SAAA,CACR,EACDvJ,EAAM,SAAW,GACbO,EAAO,SAAW,GAAW,QAAA,KAAKA,EAAO,MAAM,EACnD,OAEF,IAAK,UACCP,EAAM,YACA,QAAA,KAAKuJ,EAAQ,QAAS,GAAI,EAEpCvJ,EAAM,SAAW,GACjB,OAEF,QACOwJ,EAAYD,EAAQ,IAAI,CAAA,CACjC,CAGK,SAAU,iCACf,MAAME,EAAc,CAClB,6GACA,2DACF,EACMC,EAAkB1J,EAAM,KAAK,EAC7B2J,EAAyB,CAACD,CAAe,EAE3C,IAAAhK,GAAAC,EAAAK,EAAM,UAAN,YAAAL,EAAe,SAAf,MAAAD,EAAuB,YAAa,CAChC,MAAAkK,GAAoB1H,GAAAH,EAAA/B,EAAM,UAAN,YAAA+B,EAAe,SAAf,YAAAG,EAAuB,YAC5C0H,EAAkB,WAAWF,CAAe,GAC/CC,EAAa,KAAKC,CAAiB,CACrC,CAGE,IAAAxH,GAAAH,EAAAjC,EAAM,UAAN,YAAAiC,EAAe,SAAf,MAAAG,EAAuB,SAAU,CAC7B,MAAAyH,GAAkBvH,GAAAH,EAAAnC,EAAM,UAAN,YAAAmC,EAAe,SAAf,YAAAG,EAAuB,SAC1CuH,EAAgB,WAAWH,CAAe,GAC7CC,EAAa,KAAKE,CAAe,CACnC,CAGE,IAAArH,GAAAH,EAAArC,EAAM,UAAN,YAAAqC,EAAe,UAAf,MAAAG,EAAwB,YAAa,CACjC,MAAAsH,GAAmBrH,GAAAF,EAAAvC,EAAM,UAAN,YAAAuC,EAAe,UAAf,YAAAE,EAAwB,YAC5CqH,EAAiB,WAAWJ,CAAe,GAC9CC,EAAa,KAAKG,CAAgB,CACpC,CAGI,MAAAC,EACJJ,EAAa,OAAS,EAClB;AAAA,QAAwGA,EAAa,KAAK;AAAA,OAAU,CAAC,GACrI,GAEN,IAAIK,EAAc;AAAA;AAAA;AAAA,MAGhBP,EAAY,KAAK;AAAA,KAAQ,CAAC;AAAA,EAC9BM,CAAY;AAAA,EAGV,GADK,KAAA,OAAO,KAAKC,CAAW,EACxB,CAACC,GAAW,eAAe,EAAG,CAC3B,KAAA,OAAO,KAAK,2BAA2B,EAC5C,MAAA,CAGF,MAAMC,EAAmB,IAAI,IAAYC,IAAkB,GACvDxH,GAAAC,EAAA5C,EAAM,UAAN,YAAA4C,EAAe,SAAf,MAAAD,EAAuB,aACzBuH,EAAiB,IAAIlK,EAAM,QAAQ,OAAO,WAAW,EAGvD,UAAWoK,KAAeF,EACxB,KAAK,OAAO,KAAK,8BAA8BE,CAAW,GAAG,EAC7D,KAAK,cAAcA,EAAazB,IAAgB,EAGlD,UAAWrL,KAAOqM,EAChB,KAAK,OAAO,KAAK,eAAerM,CAAG,GAAG,EACtCrC,EAAG,OAAOqC,EAAK,CAAE,UAAW,GAAM,MAAO,GAAM,EAGjD,KAAK,OAAO,KAAK,yBAAyB0C,EAAM,KAAA,CAAM,GAAG,EACtD/E,EAAA,OAAO+E,EAAM,KAAK,EAAG,CAAE,UAAW,GAAM,MAAO,GAAM,EAExD,KAAK,OAAO,KACV;AAAA,mEAAsEA,EAAM,UAAU;AAAA,CACxF,CAAA,CAGK,iBAAiBzB,EAAsD,CACxEA,EAAM,UAAY,UACf,QAAQ,IAAI,YAAc,KAAO,GAAUA,EAAA,QAAU,QAAQ,IAAI,YAC5D,QAAQ,IAAI,YAAc,KAAO,KAAUA,EAAA,QAAU,QAAQ,IAAI,aAIzEA,EAAM,cAAc,IAAM,QAAaA,EAAM,UAAY,UACtD,QAAQ,IAAI,iBAAmB,KAAO,GAAUA,EAAA,cAAc,EAAI,QAAQ,IAAI,iBACzE,QAAQ,IAAI,iBAAmB,KAAO,GAAUA,EAAA,cAAc,EAAI,QAAQ,IAAI,gBAC/EtD,EAAG,WAAWJ,EAAK,QAAQC,EAAG,QAAQ,EAAG,aAAa,CAAC,IAC9DyD,EAAM,cAAc,EAAI1D,EAAK,QAAQC,EAAG,UAAW,aAAa,GACpE,CAGK,oBACLyD,EAMAgJ,EACgC,CAChC,IAAI8C,EAAkC,CAAC,EAQnC,GAPA9L,EAAM,oBAAoB,GAC5B8L,EAAY,KAAK,CACf,OAAQ,WACR,KAAMxP,EAAK,QAAQ0M,EAAShJ,EAAM,oBAAoB,CAAC,CAAA,CACxD,EAGC,EAAQA,EAAM,kBAAkB,GAAO,EAAQA,EAAM,sBAAsB,EACvE,MAAA,IAAI,MAAM,6EAA6E,EAW3F,GARAA,EAAM,kBAAkB,GAC1B8L,EAAY,KAAK,CACf,OAAQ,OACR,UAAW9L,EAAM,kBAAkB,EACnC,UAAWA,EAAM,sBAAsB,CAAA,CACxC,EAGC8L,EAAY,SAAW,EAIpB,MAAA,CAAC,CAAE,OAAQ,MAAO,IAAK,KAAK,WAAW,GAAK,GAAGA,CAAW,CAAA,CAI5D,YAAa,CACZ,MAAAC,EAAUtK,EAAM,KAAK,UAAU,EAC/BuK,EAAW,QAEjB,IAAIC,EAAU,GACV,GAAA,CACFA,EAAUvP,EAAG,aAAaqP,EAAS,CAAE,SAAAC,EAAU,OAChC,CAAA,CAEjB,OAAIC,GAAW,KACHA,EAAAC,GAAe,EAAE,EAC3BxP,EAAG,cAAcqP,EAASE,EAAS,CAAE,SAAAD,EAAU,GAG1CC,CAAA,CAGD,cAAcE,EAAqBvC,EAAe,CAClD,MAAAwC,EAAkB3K,EAAM,KAAK,MAAM,EACnCO,EAASQ,EAAAA,UAAU,SAAU,CAAC,UAAW,SAAU2J,EAAa,OAAQ,YAAa,kBAAkB,EAAG,CAC9G,IAAK,CACH,GAAG,QAAQ,IACX,SAAU,UAEV,gBAAiBC,EACjB,qBAAsBA,EACtB,qBAAsBA,EACtB,qBAAsBA,EACtB,qBAAsBA,EAEtB,YAAa,UACb,cAAeA,CACjB,EACA,MAAO,SAAA,CACR,EAEGpK,EAAO,SAAW,GAAW,QAAA,KAAKA,EAAO,MAAM,CAAA,CAG7C,aAAatB,EAAgB2L,EAAe,CAC9C,GAAA,EAAA3L,IAAU,QAAaA,GAAS,KAEhC,EAAA2L,IAAS,QAAaA,GAAQ,IAElC,WAAK,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wEAUkD,EAE9D,IAAI,MAAM,+BAA+B,CAAA,CAGzC,uBAAuBvG,EAAmBG,EAAkD,CAClG,MAAM+D,EAA0B,CAAC,EAC3BsC,EAAQrG,EAAQ,KAGtB,OAFAH,EAAYA,EAAU,YAAY,EAE1BwG,EAAO,CACb,IAAK,KACE,OAAAtC,EAAA,WAAWlE,CAAS,OAAO,EAAI,KACpCkE,EAAK,WAAWlE,CAAS,YAAY,EAAIG,EAAQ,WAE7CA,EAAQ,WAAU+D,EAAK,WAAWlE,CAAS,cAAc,EAAIG,EAAQ,UACrEA,EAAQ,kBAAiB+D,EAAK,WAAWlE,CAAS,sBAAsB,EAAIG,EAAQ,iBACpFA,EAAQ,SAAQ+D,EAAK,WAAWlE,CAAS,YAAY,EAAIG,EAAQ,QACjEA,EAAQ,MAAK+D,EAAK,WAAWlE,CAAS,SAAS,EAAIG,EAAQ,KAC3DA,EAAQ,SAAQ+D,EAAK,WAAWlE,CAAS,YAAY,EAAIG,EAAQ,QAE9D+D,EAET,IAAK,KACE,OAAAA,EAAA,WAAWlE,CAAS,OAAO,EAAI,KAE7BkE,EAET,QACEiB,EAAsB,CAAA,CAG1B,MAAO,CAAC,CAAA,CAGF,cACNzB,EAUA7N,EAAiB,GACjB,SACA,MAAM4Q,EAAmB,CAAC,EAEpBC,EAAUC,GAAcA,EAAE,SAAS9Q,EAAQ,GAAG,EAkBpD,OAjBI6N,EAAQ,YACH+C,EAAA,KAAK,GAAGC,EAAO,QAAQ,CAAC,KAAKhD,EAAQ,UAAU,EAAE,EAGtDA,EAAQ,QACH+C,EAAA,KAAK,GAAGC,EAAO,KAAK,CAAC,KAAKhD,EAAQ,OAAO,EAAE,EACzCA,EAAQ,QACV+C,EAAA,KAAK,GAAGC,EAAO,KAAK,CAAC,eAAehD,EAAQ,QAAQ,SAAS,CAAC,EAAE,EAEvE+C,EAAO,KAAK,GAAGC,EAAO,KAAK,CAAC,kBAAkB,EAG5ChD,EAAQ,SACH+C,EAAA,KAAK,GAAGC,EAAO,KAAK,CAAC,KAAKhD,EAAQ,OAAO,EAAE,GAGhCpI,EAAAoI,EAAQ,UAAR,YAAApI,EAAiB,KAChB,CACnB,KAAK,OACH,MAEF,IAAK,KACImL,EAAA,KAAK,GAAGC,EAAO,SAAS,CAAC,KAAKhD,EAAQ,QAAS,QAAS,EAAE,EACjE,MAEF,IAAK,KACI+C,EAAA,KACL,GAAGC,EAAO,SAAS,CAAC,YAAYhD,EAAQ,QAAS,UAAY,KAAK,cAAcA,EAAQ,QAAS,UAAW,eAAeA,EAAQ,QAAS,WAAa,EAAE,GAC7J,EACA,MAEF,QACEyB,EAA4B,CAAA,CAIhC,QADoB9J,EAAAqI,EAAQ,UAAR,YAAArI,EAAiB,KAChB,CACnB,KAAK,OACH,MAEF,IAAK,KACIoL,EAAA,KAAK,GAAGC,EAAO,SAAS,CAAC,KAAKhD,EAAQ,QAAS,QAAS,EAAE,EACjE,MAEF,IAAK,KACI+C,EAAA,KACL,GAAGC,EAAO,SAAS,CAAC,YAAYhD,EAAQ,QAAS,UAAY,KAAK,cAAcA,EAAQ,QAAS,UAAW,eAAeA,EAAQ,QAAS,WAAa,EAAE,GAC7J,EACA,MAEF,QACEyB,EAA4B,CAAA,CAGhC,OAAIzB,EAAQ,MACH+C,EAAA,KAAK,GAAGC,EAAO,UAAU,CAAC,KAAKhD,EAAQ,KAAK,QAAQ,EAAE,EAG3DA,EAAQ,QACH+C,EAAA,KAAK,GAAGC,EAAO,IAAI,CAAC,KAAKhD,EAAQ,MAAM,EAAE,EAG3C+C,EAAO,KAAK;AAAA,CAAI,CAAA,CAGjB,gBAAgB9M,EAAoB,CACpC,MAAAiN,EAAWhQ,EAAG,aAAa+C,CAAK,EACtC,OAAOkN,GAAK,MAAMD,EAAS,SAAA,CAAU,CAAA,CAE/B,iBAAiBjN,EAAemN,EAAW,CACjDlQ,EAAG,cAAc+C,EAAOkN,GAAK,UAAUC,CAAI,CAAC,CAAA,CAEhD,CAEgB,SAAA/D,EAAc7G,EAAkCtG,EAAkB,CAChF,GAAIsG,EAAO,MACT,MAAMA,EAAO,MAGf,MAAMqG,EAAM3M,GAAW,wBAEnB,GAAAsG,EAAO,SAAW,EACpB,MAAM,IAAI,MAAM,GAAGqG,CAAG,+BAA+BrG,EAAO,MAAM,GAAG,CAEzE,CCrzBA,MAAqB6K,EAArB,MAAqBA,UAAc9M,EAAAA,OAAQ,CAUzC,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAM6M,CAAK,EAElCvP,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EACtC,IAAI2I,EAAKrL,CAAM,EACvB,QAAQ,CAAA,CAEjB,EAhBE6C,EADmB0M,EACH,cACd,6FAEF1M,EAJmB0M,EAIH,WAAW,CAAC,qCAAqC,GAEjE1M,EANmB0M,EAMH,QAAQ,CACtB,GAAGzM,CACL,GARF,IAAqB0M,GAArBD,ECAA,MAAqBE,EAArB,MAAqBA,UAAchN,EAAAA,OAAQ,CASzC,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAM+M,CAAK,EAElCzP,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EACtC,IAAI2I,EAAKrL,CAAM,EAEvB,UAAU,CAAA,CAEnB,EAhBE6C,EADmB4M,EACH,cAAc,wCAE9B5M,EAHmB4M,EAGH,WAAW,CAAC,qCAAqC,GAEjE5M,EALmB4M,EAKH,QAAQ,CACtB,GAAG3M,CACL,GAPF,IAAqB4M,GAArBD,ECAA,MAAqBE,EAArB,MAAqBA,UAAalN,EAAAA,OAAQ,CASxC,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAMiN,CAAI,EAEjC3P,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EACtC,IAAI2I,EAAKrL,CAAM,EAEvB,KAAK,CAAA,CAEd,EAhBE6C,EADmB8M,EACH,cAAc,0BAE9B9M,EAHmB8M,EAGH,WAAW,CAAC,qCAAqC,GAEjE9M,EALmB8M,EAKH,QAAQ,CACtB,GAAG7M,CACL,GAPF,IAAqB8M,GAArBD,ECIA,MAAqBE,EAArB,MAAqBA,UAAepN,EAAAA,OAAQ,CAqB1C,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAMmN,CAAM,EAEnC7P,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EAC7CmE,EAAO,IAAIwE,EAAKrL,CAAM,EAC5B6G,EAAK,iBAAiBnE,CAAK,EAErB,MAAAoN,EAAcpN,EAAM,cAAc,EAClCqN,EAA6CD,EAC/C,CACE,QAASA,EACT,QAASjJ,EAAK,oBAAoBnE,EAAO,GAAG,CAE9C,EAAA,OACEiG,EAAUjG,EAAM,QAAU1D,EAAK,KAAK,IAAK0D,EAAM,OAAO,EAAIyB,EAAM,KAAK,QAAQ,EAEnF0C,EAAK,YAAY8B,EAAS,CACxB,kBAAmBjG,EAAM,iBAAiB,EAC1C,gBAAiBA,EAAM,cAAc,EACrC,kBAAmBA,EAAM,iBAAiB,EAE1C,MAAOA,EAAM,MACb,QAASA,EAAM,QAEf,QAASA,EAAM,QACf,YAAaA,EAAM,cAAc,EAEjC,KAAMqN,EAEN,SAAUrN,EAAM,aAAa,EAC7B,SAAUA,EAAM,WAAW,EAE3B,eAAgBA,EAAM,mBAAmB,EACzC,eAAgBA,EAAM,iBAAiB,EAEvC,UAAWA,EAAM,cAAc,EAC/B,UAAWA,EAAM,YAAY,CAAA,CAC9B,CAAA,CAEL,EA3DEG,EADmBgN,EACH,cAAc,gEAE9BhN,EAHmBgN,EAGH,WAAW,CAAC,qCAAqC,GAEjEhN,EALmBgN,EAKH,QAAQ,CACtB,GAAG/M,EAEH,GAAGkN,GACH,GAAGC,GACH,GAAGC,EAEH,GAAGC,GACH,GAAGC,GAEH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,EACL,GAnBF,IAAqBC,GAArBZ,ECDA,MAAqBa,EAArB,MAAqBA,UAAcjO,EAAAA,OAAQ,CA2BzC,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAMgO,CAAK,EAElC1Q,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EAC7CmE,EAAO,IAAIwE,EAAKrL,CAAM,EAC5B6G,EAAK,iBAAiBnE,CAAK,EAErB,MAAAgJ,EAAUhJ,EAAM,YAAY,GAAK,IACjCiG,EAAUjG,EAAM,QAAU1D,EAAK,KAAK0M,EAAShJ,EAAM,OAAO,EAAIyB,EAAM,KAAK,OAAO,EAChFwM,EAAUjO,EAAM,aAAa,EAAI1D,EAAK,KAAK0M,EAAShJ,EAAM,aAAa,CAAC,EAAI,OAE5E8L,EAAc3H,EAAK,oBAAoBnE,EAAOgJ,CAAO,EACrDoE,EAAcpN,EAAM,cAAc,GAAK8L,IAAgB,OAEzD,IAAAtD,EAAaxI,EAAM,WAAW,EAC9BA,EAAM,YAAY,IACpBwI,EAAarE,EAAK,eAAe,CAAE,SAAUnE,EAAM,YAAY,EAAG,GAGpE,IAAIkO,EAAqB,iBACrBlO,EAAM,aAAa,EAAGkO,EAAalO,EAAM,aAAa,EACjDA,EAAM,WAAW,MAAgB,aAAaA,EAAM,WAAW,CAAC,IAEzE,IAAImO,EAAoB,iBACpBnO,EAAM,mBAAmB,EAAGmO,EAAYnO,EAAM,mBAAmB,EAC5DA,EAAM,iBAAiB,MAAe,aAAaA,EAAM,iBAAiB,CAAC,IAEpF,IAAIoO,EAAoB,iBACpBpO,EAAM,cAAc,EAAGoO,EAAYpO,EAAM,cAAc,EAClDA,EAAM,YAAY,MAAe,aAAaA,EAAM,YAAY,CAAC,IAE1E,MAAMqO,EAAkC,CACtC,WAAA7F,EACA,QAASxI,EAAM,QACf,WAAYA,EAAM,OAClB,QAASA,EAAM,YAAY,EAE3B,WAAYA,EAAM,iBAAiB,EACnC,WAAYA,EAAM,iBAAiB,EAEnC,cAAe,CACb,KAAM,CAAE,OAAQkO,CAAW,EAC3B,WAAY,CAAE,OAAQC,CAAU,EAChC,MAAO,CAAE,OAAQC,CAAU,EAC3B,QAAS,CAAE,MAAOpO,EAAM,QAAY,KAAMA,EAAM,cAAc,CAAE,EAChE,IAAK,CAAE,KAAMiO,CAAQ,EACrB,UAAWhI,EACX,KAAM,CAAE,KAAM,CAAE,QAASmH,EAAa,QAAStB,EAAc,EAC7D,SAAU,CACR,KAAM,CAAE,KAAM,KAAM,SAAU9L,EAAM,cAAc,CAAE,CAAA,CACtD,CAEJ,EAEIqO,EAAa,WACflK,EAAK,WAAWkK,CAAY,EAE5BC,GACahR,EAAQ,CAAE,QAAS0C,EAAM,OAAS,CAAA,EAC5C,KAAK,IAAMmE,EAAK,WAAWkK,CAAY,CAAC,EACxC,MAAM,SAAU3G,EAAY,CACpBpK,EAAA,MAAMoK,EAAI,OAAO,CAAA,CACzB,CACL,CAEJ,EA3FEvH,EADmB6N,EACH,cAAc,wFAE9B7N,EAHmB6N,EAGH,WAAW,CAAC,qCAAqC,GAEjE7N,EALmB6N,EAKH,QAAQ,CACtB,GAAG5N,EACH,GAAGoN,EAEH,GAAGF,GACH,GAAGiB,GACH,GAAGC,GAEH,GAAGC,GAEH,GAAGf,GAEH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GAEH,GAAGY,GACH,GAAGC,GACH,GAAGlB,EACL,GAzBF,IAAqBmB,GAArBZ,gBCCA5M,EAAA,cAAgCrB,EAAAA,OAAQ,CAkBtC,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAMoB,CAAE,EAE/B9D,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EAC7CmE,EAAO,IAAIwE,EAAKrL,CAAM,EAC5B6G,EAAK,iBAAiBnE,CAAK,EAErB,MAAAoN,EAAcpN,EAAM,cAAc,EAClCqN,EAA6CD,EAC/C,CACE,QAASA,EACT,QAASjJ,EAAK,oBAAoBnE,EAAO,GAAG,CAE9C,EAAA,OAEEiG,EAAUjG,EAAM,QAAU1D,EAAK,KAAK,IAAK0D,EAAM,OAAO,EAAIyB,EAAM,KAAK,WAAW,EAEtF0C,EAAK,cAAc8B,EAAS,CAC1B,MAAOjG,EAAM,MACb,QAASA,EAAM,QAEf,QAASA,EAAM,QACf,YAAaA,EAAM,cAAc,EAEjC,KAAMqN,EAEN,SAAUrN,EAAM,aAAa,EAC7B,SAAUA,EAAM,WAAW,EAE3B,eAAgBA,EAAM,mBAAmB,EACzC,eAAgBA,EAAM,iBAAiB,EAEvC,UAAWA,EAAM,cAAc,EAC/B,UAAWA,EAAM,YAAY,CAAA,CAC9B,CAAA,CAEL,EArDEG,EADFiB,EACkB,cAAc,gEAE9BjB,EAHFiB,EAGkB,WAAW,CAAC,qCAAqC,GAEjEjB,EALFiB,EAKkB,QAAQ,CACtB,GAAGhB,EAEH,GAAGkN,GACH,GAAGC,GACH,GAAGC,EAEH,GAAGG,GAEH,GAAGD,GACH,GAAGD,EACL,GAhBFrM,GCAA,MAAqByN,EAArB,MAAqBA,UAAW9O,EAAAA,OAAQ,CA4BtC,MAAa,KAAqB,CAChC,KAAM,CAAE,MAAAC,CAAM,EAAI,MAAM,KAAK,MAAM6O,CAAE,EAE/BvR,EAAS2C,EAAkBD,EAAM,WAAW,CAAC,EAC7CmE,EAAO,IAAIwE,EAAKrL,CAAM,EAC5B6G,EAAK,iBAAiBnE,CAAK,EAErB,MAAAgJ,EAAUhJ,EAAM,YAAY,GAAK,IACjCiG,EAAUjG,EAAM,QAAU1D,EAAK,KAAK0M,EAAShJ,EAAM,OAAO,EAAIyB,EAAM,KAAK,UAAU,EACnFwM,EAAUjO,EAAM,aAAa,EAAI1D,EAAK,KAAK0M,EAAShJ,EAAM,aAAa,CAAC,EAAI,OAE5E8L,EAAc3H,EAAK,oBAAoBnE,EAAOgJ,CAAO,EACrDoE,EAAcpN,EAAM,cAAc,GAAK8L,IAAgB,OAEzD,IAAAtD,EAAaxI,EAAM,WAAW,EAC9BA,EAAM,YAAY,IACpBwI,EAAarE,EAAK,eAAe,CAAE,SAAUnE,EAAM,YAAY,EAAG,GAGpE,IAAIkO,EAAqB,iBACrBlO,EAAM,aAAa,EAAGkO,EAAalO,EAAM,aAAa,EACjDA,EAAM,WAAW,MAAgB,aAAaA,EAAM,WAAW,CAAC,IAEzE,IAAImO,EAAoB,iBACpBnO,EAAM,mBAAmB,EAAGmO,EAAYnO,EAAM,mBAAmB,EAC5DA,EAAM,iBAAiB,MAAe,aAAaA,EAAM,iBAAiB,CAAC,IAEpF,IAAIoO,EAAoB,iBACpBpO,EAAM,cAAc,EAAGoO,EAAYpO,EAAM,cAAc,EAClDA,EAAM,YAAY,MAAe,aAAaA,EAAM,YAAY,CAAC,IAE1E,MAAMqO,EAAoC,CACxC,WAAA7F,EACA,QAASxI,EAAM,QACf,WAAYA,EAAM,OAClB,QAASA,EAAM,YAAY,EAE3B,WAAYA,EAAM,iBAAiB,EACnC,WAAYA,EAAM,iBAAiB,EAEnC,UAAWA,EAAM,iBAAiB,EAClC,iBAAkBA,EAAM,yBAAyB,EAEjD,cAAe,CACb,KAAM,CAAE,OAAQkO,CAAW,EAC3B,WAAY,CAAE,OAAQC,CAAU,EAChC,MAAO,CAAE,OAAQC,CAAU,EAC3B,QAAS,CAAE,MAAOpO,EAAM,QAAY,KAAMA,EAAM,cAAc,CAAE,EAChE,IAAK,CAAE,KAAMiO,CAAQ,EACrB,UAAWhI,EACX,KAAM,CACJ,KAAM,CAAE,QAASmH,EAAa,QAAStB,CAAY,CACrD,EACA,SAAU,CACR,KAAM,CAAE,KAAM,KAAM,SAAU9L,EAAM,cAAc,CAAE,CAAA,CACtD,CAEJ,EAEIqO,EAAa,WACflK,EAAK,aAAakK,CAAY,EAE9BC,GACahR,EAAQ,CAAE,QAAS0C,EAAM,OAAS,CAAA,EAC5C,KAAK,IAAMmE,EAAK,aAAakK,CAAY,CAAC,EAC1C,MAAM,SAAU3G,EAAY,CACpBpK,EAAA,MAAMoK,EAAI,OAAO,CAAA,CACzB,CACL,CAEJ,EAjGEvH,EADmB0O,EACH,cAAc,wFAE9B1O,EAHmB0O,EAGH,WAAW,CAAC,qCAAqC,GAEjE1O,EALmB0O,EAKH,QAAQ,CACtB,GAAGzO,EACH,GAAGoN,EAEH,GAAGF,GACH,GAAGwB,GACH,GAAGP,GACH,GAAGC,GAEH,GAAGC,GAEH,GAAGf,GAEH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GAEH,GAAGY,GACH,GAAGC,GACH,GAAGlB,EACL,GA1BF,IAAqBsB,GAArBF,ECGO,MAAMG,GAAW,CACtB,eAAgBC,GAChB,MAASC,GACT,MAASC,GACT,KAAQC,GACR,eAAgBC,GAChB,cAAeC,GACf,kBAAmBC,GACnB,iBAAkBC,EACpB"}
1
+ {"version":3,"file":"index.js","sources":["../src/cmd-opts.ts","../src/util.ts","../src/block.ts","../src/commands/create-block.ts","../src/package.ts","../src/state.ts","../src/run.ts","../src/templates/compose.ts","../src/templates/types.ts","../src/templates/pl-config.ts","../src/platforma.ts","../src/core.ts","../src/commands/reset.ts","../src/commands/start.ts","../src/commands/stop.ts","../src/commands/start/docker.ts","../src/commands/start/local.ts","../src/commands/start/docker/s3.ts","../src/commands/start/local/s3.ts","../src/index.ts"],"sourcesContent":["import { Flags } from '@oclif/core';\n\nexport const GlobalFlags = {\n 'log-level': Flags.string({\n description: 'logging level',\n default: 'info',\n options: ['error', 'warn', 'info', 'debug'],\n required: false\n })\n};\n\nexport const ImageFlag = {\n image: Flags.string({\n description: 'use custom docker image to run platforma'\n })\n};\n\nexport const VersionFlag = {\n version: Flags.string({\n description: 'use custom platforma release (official docker image or binary package)'\n })\n};\n\nexport const ArchFlag = {\n arch: Flags.string({\n description: 'override architecture. You can start amd64 linux image on arm-based host (say, Apple M family processor)',\n options: [\n \"amd64\",\n \"arm64\",\n ]\n })\n}\n\nexport const LicenseFlags = {\n license: Flags.string({\n description: 'pass a license code. The license can be got from \"https://licensing.milaboratories.com\".'\n }),\n 'license-file': Flags.file({\n exists: true,\n description:\n \"specify a path to the file with a license. The license can be got from 'https://licensing.milaboratories.com'.\"\n })\n};\n\nexport const AddressesFlags = {\n 'grpc-port': Flags.integer({\n description: 'port for Platforma Backend gRPC API. Default is 6345',\n env: 'PLATFORMA_GRPC_PORT'\n }),\n\n 'grpc-listen': Flags.string({\n description: 'full listen addr for Platforma Backend gRPC API. Default is 127.0.0.1:6345',\n env: 'PLATFORMA_GRPC_LISTEN'\n }),\n\n 'monitoring-port': Flags.integer({\n description: 'port for Platforma Backend monitoring API. Default is 9090',\n env: 'PLATFORMA_MONITORING_PORT'\n }),\n\n 'monitoring-listen': Flags.string({\n description: 'full listen addr for Platforma Backend monitoring API. Default is 127.0.0.1:9090',\n env: 'PLATFORMA_MONITORING_LISTEN'\n }),\n\n 'debug-port': Flags.integer({\n description: 'port for Platforma Backend debug API. Default is 9091',\n env: 'PLATFORMA_DEBUG_PORT'\n }),\n\n 'debug-listen': Flags.string({\n description: 'full listen addr for Platforma Backend debug API. Default is 127.0.0.1:9091',\n env: 'PLATFORMA_DEBUG_LISTEN'\n })\n};\n\nexport const S3AddressesFlags = {\n 's3-address-port': Flags.integer({\n description: 'port that S3 will listen, default is 9000',\n default: 9000,\n env: 'PLATFORMA_S3_PORT'\n }),\n\n 's3-console-address-port': Flags.integer({\n description: 'port that a console of S3 will listen, default is 9001',\n default: 9001,\n env: 'PLATFORMA_S3_CONSOLE_PORT'\n })\n};\n\nexport const StorageFlag = {\n storage: Flags.string({\n description: 'specify path on host to be used as storage for all Platforma Backend data'\n })\n};\n\nexport const MountFlag = {\n mount: Flags.string({\n multiple: true,\n description: 'things to be mounted into platforma docker container. Targets will appear inside the container under the same absolute paths'\n })\n};\n\nexport const PlLogFileFlag = {\n ['pl-log-file']: Flags.file({\n description: 'specify path for Platforma Backend log file'\n })\n};\n\nexport const PlWorkdirFlag = {\n ['pl-workdir']: Flags.file({\n description: 'specify working directory for Platforma Backend process'\n })\n};\n\nexport const PlBinaryFlag = {\n ['pl-binary']: Flags.file({\n description: 'start given Platforma Backend binary instead of automatically downloaded version'\n })\n};\n\nexport const PlSourcesFlag = {\n ['pl-sources']: Flags.file({\n description: 'path to pl repository root: build Platforma Backend from sources and start the resulting binary'\n })\n};\n\nexport const ConfigFlag = {\n config: Flags.string({\n description: 'use custom Platforma Backend config'\n })\n};\n\nexport const StoragePrimaryPathFlag = {\n 'storage-primary': Flags.file({\n description: \"specify path on host to be used as 'primary' storage\"\n })\n};\n\nexport const StorageWorkPathFlag = {\n 'storage-work': Flags.file({\n description: \"specify path on host to be used as 'work' storage\"\n })\n};\n\nexport const StorageLibraryPathFlag = {\n 'storage-primary': Flags.file({\n description: \"specify path on host to be used as 'library' storage\"\n })\n};\n\nexport const StoragePrimaryURLFlag = {\n 'storage-primary': Flags.string({\n description:\n \"specify 'primary' storage destination URL.\\n\" +\n '\\tfile:/path/to/dir for directory on local FS\\n' +\n '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n' +\n '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n' +\n '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https'\n })\n};\n\nexport const StorageLibraryURLFlag = {\n 'storage-library': Flags.string({\n description:\n \"specify 'library' storage destination URL.\\n\" +\n '\\tfile:/path/to/dir for directory on local FS\\n' +\n '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n' +\n '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n' +\n '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https'\n })\n};\n\nexport const AuthEnabledFlag = {\n 'auth-enabled': Flags.boolean({\n description: 'enable authorization'\n })\n};\n\nexport const HTPasswdFileFlag = {\n 'auth-htpasswd-file': Flags.file({\n description: 'path to .htpasswd file with Platforma users (static user DB auth source)'\n })\n};\n\nexport const LDAPAddressFlag = {\n 'auth-ldap-server': Flags.string({\n description: 'address of LDAP server to use for auth in Platforma (auth source)'\n })\n};\n\nexport const LDAPDefaultDNFlag = {\n 'auth-ldap-default-dn': Flags.string({\n description: 'DN to use when checking user with LDAP bind operation: e.g. cn=%u,ou=users,dc=example,dc=com'\n })\n};\n\nexport const AuthFlags = {\n ...AuthEnabledFlag,\n ...HTPasswdFileFlag,\n\n ...LDAPAddressFlag,\n ...LDAPDefaultDNFlag\n};\n","import os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\n\nimport winston from 'winston';\nimport { randomBytes } from 'crypto';\nimport readlineSync from 'readline-sync';\n\nexport function askYN(prompt: string): boolean {\n const answer = readlineSync.question(`${prompt} [y/N] `);\n return answer.toLowerCase() === 'y';\n}\n\nexport function assertNever(n: never) {\n throw new Error('this should never happen');\n}\n\nexport function createLogger(level: string = 'debug'): winston.Logger {\n return winston.createLogger({\n level: level,\n\n format: winston.format.printf(({ level, message }) => {\n const indent = ' '.repeat(level.length + 2); // For ': ' after the level\n if (typeof message !== 'string') {\n const messageJson = JSON.stringify(message);\n throw Error(`logger message ${messageJson} is not a string`);\n }\n const indentedMessage = message\n .split('\\n')\n .map((line: string, index: number) => (index === 0 ? line : indent + line))\n .join('\\n');\n\n const colorize = (l: string) => winston.format.colorize().colorize(l, l);\n\n return `${colorize(level)}: ${indentedMessage}`;\n }),\n\n transports: [\n new winston.transports.Console({\n stderrLevels: ['error', 'warn', 'info', 'debug'],\n handleExceptions: true\n })\n ]\n });\n}\n\nexport function randomStr(len: number): string {\n return randomBytes(Math.ceil(len / 2))\n .toString('hex')\n .slice(0, len);\n}\n\nexport function resolveTilde(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nexport function ensureDir(p: string, options?: {\n mode?: fs.Mode\n}) {\n if (fs.existsSync(p)) {\n return\n }\n\n fs.mkdirSync(p, { recursive: true })\n if (options?.mode) {\n fs.chmodSync(p, options.mode)\n }\n}\n\nexport function getProcessName(pid: number): string {\n try {\n if (os.platform() !== 'win32') {\n return execSync(`ps -p ${pid} -o comm=`, { encoding: 'utf8' }).trim();\n }\n\n const command = `wmic process where processid=${pid} get Caption`;\n const lines = execSync(command, { encoding: 'utf8' }).split('\\n');\n\n // lines = [\"Caption:\", \"<process name>\"]\n if (lines.length <= 1) {\n return '';\n }\n\n return lines[1].trim();\n } catch (e) {\n return '';\n }\n}\n","import { createWriteStream } from 'fs';\nimport * as fs from 'fs/promises';\nimport path from 'path';\nimport winston from 'winston';\nimport { Writable, Transform } from 'node:stream';\nimport os from 'os';\nimport readlineSync from 'readline-sync';\nimport { z } from 'zod';\nimport decompress from 'decompress';\nimport yaml from 'yaml';\n\nconst blockPlatformsToChoose = ['Python'];\nconst allPlatforms = ['Tengo', 'Python'] as const;\nconst CreateBlockPlatforms = z.union([z.literal('Tengo'), z.literal('Python')]);\nexport type CreateBlockPlatform = z.infer<typeof CreateBlockPlatforms>;\n\nconst CreateBlockOptions = z.object({\n npmOrgName: z.string().min(1),\n orgName: z.string().min(1),\n blockName: z.string().min(1),\n softwarePlatforms: z.array(CreateBlockPlatforms).refine((p) => new Set(p).size === p.length, {\n message: 'Must be an array of unique software platforms'\n })\n});\nexport type CreateBlockOptions = z.infer<typeof CreateBlockOptions>;\n\n/** Creates a block by cloning block-boilerplate repository. */\nexport async function createBlock(logger: winston.Logger) {\n const { npmOrgName, orgName, blockName, softwarePlatforms } = askForOptions();\n const targetPath = path.join(process.cwd(), blockName);\n\n logger.info(`Downloading boilerplate code...`);\n await downloadAndUnzip(\n // 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/software_platforms.zip',\n // 'platforma-block-boilerplate-software_platforms',\n 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/main.zip',\n 'platforma-block-boilerplate-main',\n targetPath\n );\n\n const platformsToRemove = allPlatforms.filter((p) => softwarePlatforms.indexOf(p) < 0);\n const noPlatforms = blockPlatformsToChoose.length == platformsToRemove.length;\n logger.info(`Keep platforms '${softwarePlatforms}', remove: '${platformsToRemove}'. Will remove all platforms? ${noPlatforms}`);\n for (const p of platformsToRemove) {\n await removePlatform(targetPath, p);\n }\n if (noPlatforms) {\n await removePlatformsCompletely(targetPath);\n }\n\n logger.info(`Replace everything in the template with provided options...`);\n replaceRegexInAllFiles(targetPath, [\n // '@' literal ensures only npm org name will be renamed,\n // as public registry for software also is called platforma-open, but without '@'.\n // Also, don't rename an organization for runenv-python-3 package.\n { from: /@platforma-open(?!.*runenv-python-3)/g, to: `@${npmOrgName}` },\n\n { from: /my-org/g, to: orgName },\n\n { from: /block-boilerplate/g, to: blockName }\n ]);\n}\n\nfunction askForOptions(): CreateBlockOptions {\n let npmOrgName = readlineSync.question(\n 'Write an organization name for npm. Default is \"platforma-open\": '\n );\n if (npmOrgName === '') {\n npmOrgName = 'platforma-open';\n }\n const orgName = readlineSync.question('Write an organization name, e.g. \"my-org\": ');\n const blockName = readlineSync.question('Write a name of the block, e.g. \"hello-world\": ');\n\n const needSoftware = readlineSync.keyInYN(\"Create package for block's software?\");\n let softwarePlatforms = ['Tengo'];\n if (needSoftware) {\n while (softwarePlatforms.length < allPlatforms.length) {\n const index = readlineSync.keyInSelect(blockPlatformsToChoose, 'Choose software platform:');\n if (index < 0) break;\n softwarePlatforms.push(blockPlatformsToChoose[index]);\n }\n }\n softwarePlatforms = Array.from(new Set(softwarePlatforms)).sort();\n\n return CreateBlockOptions.parse({ npmOrgName, orgName, blockName, softwarePlatforms });\n}\n\nasync function downloadAndUnzip(url: string, pathInArchive: string, outputPath: string) {\n const response = await fetch(url);\n const content = await response.blob();\n\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'create-repo'));\n\n const tmpFile = path.join(tmpDir, 'packed-repo.zip');\n const f = Writable.toWeb(createWriteStream(tmpFile));\n await content.stream().pipeTo(f);\n\n const tmpRepo = path.join(tmpDir, 'unpacked-repo');\n await fs.mkdir(tmpRepo);\n await decompress(tmpFile, tmpRepo);\n\n await fs.cp(path.join(tmpRepo, pathInArchive), outputPath, { recursive: true });\n}\n\n/** Removes a bunch of dependencies to the platform. */\nasync function removePlatform(dir: string, platform: CreateBlockPlatform) {\n const p = platform.toLowerCase();\n\n // Remove <PlAlert> line from MainPage.vue\n // https://regex101.com/r/oCTyHk/1\n await deleteRegexInFile(\n path.join(dir, 'ui', 'src', 'pages', 'MainPage.vue'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g')\n );\n\n // Remove an output from the model.\n await deleteRegexInFile(\n path.join(dir, 'model', 'src', 'index.ts'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g')\n );\n\n // This regexp represents a block of code until the empty line.\n // https://regex101.com/r/Os8kX1/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}.*exec.builder.*[\\\\s\\\\S]*?\\\\n\\\\n`, 'g')\n );\n\n // Remove a line from the workflow output.\n // https://regex101.com/r/PkHwQ8/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}Message.*\\\\n`, 'g')\n );\n\n // Remove 2 lines: the one with the language message and the one with expect\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'wf.test.ts'),\n new RegExp(`.*${p}Message.*\\\\n.*expect.*\\\\n\\\\n`, 'g')\n );\n\n await fs.rm(path.join(dir, 'software', `src_${p}`), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'software', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['block-software']['artifacts'][`hello-${p}-artifact`];\n delete json['block-software']['entrypoints'][`hello-world-${p}`];\n return JSON.stringify(json, null, 2);\n }\n )\n}\n\n/** Removes software directory completely and all references to it from the workspace. */\nasync function removePlatformsCompletely(dir: string) {\n await fs.rm(path.join(dir, 'software'), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'workflow', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['dependencies'][\"@platforma-open/my-org.block-boilerplate.software\"];\n return JSON.stringify(json, null, 2);\n }\n );\n\n await deleteRegexInFile(\n path.join(dir, 'pnpm-workspace.yaml'),\n /.*- software$\\n/gm\n );\n}\n\nasync function replaceRegexInAllFiles(\n dir: string,\n patterns: { from: RegExp; to: string }[]\n) {\n const files = await getAllFiles(dir);\n for (const { from, to } of patterns) {\n for (const fPath of files) {\n await replaceRegexInFile(fPath, from, to);\n }\n }\n}\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const allDirents = await fs.readdir(dir, {\n withFileTypes: true,\n recursive: true\n });\n\n return allDirents.filter((f) => f.isFile()).map((f) => path.join(f.parentPath, f.name));\n}\n\nasync function replaceInFile(fPath: string, replacer: (content: string) => any) {\n const content = await fs.readFile(fPath);\n const newContent = replacer(content.toString());\n await fs.writeFile(fPath, newContent);\n}\n\nasync function replaceRegexInFile(fPath: string, from: RegExp, to: string) {\n return await replaceInFile(fPath, (content) => content.replaceAll(from, to));\n}\n\nasync function deleteRegexInFile(fPath: string, what: RegExp) {\n return await replaceRegexInFile(fPath, what, '');\n}\n","import { Command, Flags } from '@oclif/core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\nimport * as block from '../block';\n\nexport default class CreateBlock extends Command {\n static override description = \"Helps to create a new block by downloading a block's template.\";\n\n static override examples = ['<%= name %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(CreateBlock);\n const logger = util.createLogger(flags['log-level']);\n\n await block.createBlock(logger);\n }\n}\n","import { resolve, join } from 'path';\nimport fs from 'fs';\nimport { getDefaultPlVersion } from '@milaboratories/pl-local';\n\nexport function path(...p: string[]): string {\n return resolve(__dirname, '..', ...p);\n}\n\nexport function dist(...p: string[]): string {\n return path('dist', ...p);\n}\n\nexport function assets(...p: string[]): string {\n return path('assets', ...p);\n}\n\nexport function composeFiles(): string[] {\n const dockerDirEntries = fs.readdirSync(assets());\n return dockerDirEntries\n .filter((entry) => {\n return entry.startsWith('compose-') && entry.endsWith('.yaml');\n })\n .map((value) => assets(value));\n}\n\nexport function readFileSync(...p: string[]): Buffer {\n return fs.readFileSync(path(...p));\n}\n\nexport function plImageTag(version?: string): string {\n if (!version) {\n version = getDefaultPlVersion();\n }\n\n return `quay.io/milaboratories/platforma:${version}`;\n}\n","import os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport * as pkg from './package';\nimport * as util from './util';\n\nexport type runMode = 'docker' | 'process';\n\nexport type dockerRunInfo = {\n plImage?: string;\n composePath?: string;\n\n primaryPath?: string;\n workPath?: string;\n libraryPath?: string;\n};\n\nexport type processRunInfo = {\n pid?: number;\n storagePath?: string;\n};\n\nexport type lastRun = {\n docker?: dockerRunInfo;\n process?: processRunInfo;\n\n mode: runMode;\n cmd: string;\n args: readonly string[];\n workdir?: string;\n envs?: NodeJS.Dict<string>;\n};\n\nexport function reset() {\n fs.rmSync(State.getInstance().filePath);\n}\n\ntype state = {\n lastRun: lastRun | undefined;\n isActive: boolean;\n};\n\nclass State {\n private static instance: State;\n\n private state: state = {\n lastRun: undefined,\n isActive: false,\n };\n\n public readonly filePath: string;\n private readonly dirPath: string;\n\n constructor(stateDir?: string) {\n stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');\n\n const stateFile = path.join(stateDir, 'state.json');\n\n this.dirPath = stateDir;\n this.filePath = stateFile;\n\n if (!fs.existsSync(stateDir)) {\n fs.mkdirSync(stateDir, { recursive: true });\n }\n\n if (fs.existsSync(stateFile)) {\n this.state = JSON.parse(pkg.readFileSync(stateFile).toString());\n }\n }\n\n public static getInstance(): State {\n if (!State.instance) {\n State.instance = new State();\n }\n\n return State.instance;\n }\n\n public path(...p: string[]): string {\n return path.join(this.dirPath, ...p);\n }\n\n public data(...p: string[]): string {\n return this.path('data', ...p);\n }\n\n public binaries(...p: string[]): string {\n return this.path('binaries', ...p);\n }\n\n private writeState() {\n fs.writeFileSync(this.filePath, JSON.stringify(this.state));\n }\n\n get isActive(): boolean {\n if (this.state.isActive) {\n return this.state.isActive;\n }\n\n if (!this.state.lastRun?.process?.pid) {\n return false;\n }\n\n return this.isValidPID;\n }\n\n get isValidPID(): boolean {\n if (!this.state.lastRun?.process?.pid) {\n return false;\n }\n\n const processName = util.getProcessName(this.state.lastRun.process.pid);\n return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\\\platforma');\n }\n\n set isActive(value: boolean) {\n this.state.isActive = value;\n this.writeState();\n }\n\n get lastRun(): lastRun | undefined {\n return this.state.lastRun;\n }\n\n set lastRun(info: lastRun) {\n this.state.lastRun = info;\n this.writeState();\n }\n}\n\nexport default State.getInstance();\n","import fs from 'fs';\nimport { spawnSync, SpawnOptions, SpawnSyncReturns, ChildProcess, spawn } from 'child_process';\nimport state, { dockerRunInfo, processRunInfo } from './state';\nimport winston from 'winston';\n\nexport function runDocker(\n logger: winston.Logger,\n args: readonly string[],\n options: SpawnOptions,\n stateToSave?: dockerRunInfo\n) {\n state.lastRun = {\n ...state.lastRun,\n\n mode: 'docker',\n cmd: 'docker',\n args: args,\n workdir: options.cwd as string,\n envs: options.env,\n\n docker: {\n ...state.lastRun?.docker,\n ...stateToSave\n }\n };\n\n return runSync(logger, 'docker', args, options);\n}\n\nexport function runProcess(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions,\n stateToSave?: processRunInfo\n): ChildProcess {\n state.lastRun = {\n ...state.lastRun,\n\n mode: 'process',\n cmd: cmd,\n args: args,\n workdir: options.cwd as string,\n envs: options.env,\n\n process: {\n ...state.lastRun?.process,\n ...stateToSave\n }\n };\n\n const result = run(logger, cmd, args, options);\n state.lastRun.process = {\n ...state.lastRun.process,\n pid: result.pid\n };\n return result;\n}\n\nexport function rerunLast(logger: winston.Logger, options: SpawnOptions): SpawnSyncReturns<Buffer> {\n if (!state.lastRun) {\n throw new Error('no previous run info found: this is the first run after package installation');\n }\n\n options = {\n cwd: state.lastRun.workdir,\n env: {\n ...state.lastRun.envs,\n ...options.env\n },\n ...options\n };\n\n return runSync(logger, state.lastRun.cmd, state.lastRun.args, options);\n}\n\nfunction run(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): ChildProcess {\n logger.debug(\n `Running:\\n env: ${JSON.stringify(options.env)}\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd}`\n );\n\n options.env = { ...process.env, ...options.env };\n logger.debug(' spawning child process');\n const child = spawn(cmd, args, options);\n var exitAfterChild: boolean = false;\n\n //\n // Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.\n //\n const sigintHandler = () => {\n child.kill('SIGINT');\n exitAfterChild = true;\n };\n\n logger.debug(' setting up signal handler');\n process.on('SIGINT', sigintHandler);\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', sigintHandler);\n if (exitAfterChild) {\n process.exit(code);\n }\n });\n\n return child;\n}\n\nfunction runSync(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions\n): SpawnSyncReturns<Buffer> {\n logger.debug(\n `Running:\\n env: ${JSON.stringify(options.env)}\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd}`\n );\n\n options.env = { ...process.env, ...options.env };\n return spawnSync(cmd, args, options);\n}\n","import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n};\n\ntype ComposeYamlSpec = {\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n }>;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n services?: Map<string, ServiceOptions>,\n) {\n if (!services || services.size == 0) {\n fs.copyFileSync(composeSource, composeDest);\n return;\n }\n\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n\n for (const [svcName, options] of services.entries()) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n","export type plSettings = {\n localRoot: string;\n\n license: licenseSettings;\n log: logSettings;\n grpc: grpcSettings;\n core: coreSettings;\n storages: storagesSettings;\n\n monitoring: monitoringSettings;\n debug: debugSettings;\n\n hacks: {\n libraryDownloadable: boolean;\n };\n};\nexport type plOptions = {\n localRoot?: string;\n\n license?: licenseOptions;\n log?: logOptions;\n grpc?: grpcOptions;\n core?: coreOptions;\n storages?: storagesOptions;\n\n monitoring?: monitoringOptions;\n debug?: debugOptions;\n};\n\nexport type licenseSettings = {\n value: string;\n file: string;\n};\nexport type licenseOptions = DeepPartial<licenseSettings>;\n\nexport type logSettings = {\n level: string;\n path: string;\n};\nexport type logOptions = DeepPartial<logSettings>;\n\nexport type coreSettings = {\n auth: authSettings;\n db: dbSettings;\n};\nexport type coreOptions = {\n auth?: authOptions;\n db?: dbOptions;\n};\n\nexport type authSettings = {\n enabled: boolean;\n drivers: authDriver[];\n};\nexport type authOptions = Partial<authSettings>;\n\nexport type dbSettings = {\n path: string;\n};\nexport type dbOptions = Partial<dbSettings>;\n\nexport type authDriver =\n | {\n driver: 'ldap';\n serverUrl: string; // 'ldaps://ldap.example.com:1111'\n defaultDN: string; // 'cn=%u,ou=users,ou=users,dc=example,dc=com'\n }\n | {\n driver: 'jwt';\n key: string;\n }\n | {\n driver: 'htpasswd';\n path: string;\n };\n\nexport type grpcSettings = {\n listen: string;\n tls: tlsSettings;\n};\nexport type grpcOptions = Partial<grpcSettings>;\n\nexport type tlsSettings = {\n enable: boolean;\n clientAuthMode: tlsAuthMode;\n certFile: string;\n keyFile: string;\n};\nexport type tlsOptions = Partial<tlsSettings>;\n\nexport type tlsAuthMode = 'NoAuth' | 'RequestAnyCert' | 'RequireAnyCert' | 'RequestValidCert' | 'RequireValidCert';\n\nexport type storagesSettings = {\n primary: storageSettings;\n work: fsStorageSettings;\n library: storageSettings;\n};\nexport type storagesOptions = {\n primary?: storageOptions;\n work?: storageOptions;\n library?: storageOptions;\n};\n\nexport type storageSettings = s3StorageSettings | fsStorageSettings;\nexport type storageOptions = s3StorageOptions | fsStorageOptions;\n\ntype storageID = { id: string };\ntype commonStorageSettings = {\n indexCachePeriod: string;\n};\n\nexport type s3StorageSettings = storageID & s3StorageType & commonStorageSettings & s3StorageTypeSettings;\nexport type s3StorageOptions = s3StorageType & Partial<commonStorageSettings> & Partial<s3StorageTypeSettings>;\nexport function emptyS3Settings(id: string): s3StorageSettings {\n return {\n id: id,\n type: 'S3',\n indexCachePeriod: '0s',\n endpoint: '',\n region: '',\n presignEndpoint: '',\n bucketName: '',\n createBucket: false,\n forcePathStyle: false,\n key: '',\n secret: '',\n keyPrefix: '',\n accessPrefixes: [],\n uploadKeyPrefix: ''\n };\n}\n\ntype s3StorageType = { type: 'S3' };\ntype s3StorageTypeSettings = {\n endpoint: string;\n presignEndpoint: string;\n region: string;\n bucketName: string;\n createBucket: boolean;\n forcePathStyle: boolean;\n key: string;\n secret: string;\n keyPrefix: string;\n accessPrefixes: string[];\n uploadKeyPrefix: string;\n};\n\nexport type fsStorageSettings = storageID & fsStorageType & commonStorageSettings & fsStorageTypeSettings;\nexport type fsStorageOptions = fsStorageType & Partial<commonStorageSettings> & Partial<fsStorageTypeSettings>;\nexport function emptyFSSettings(id: string): fsStorageSettings {\n return {\n id: id,\n type: 'FS',\n indexCachePeriod: '0s',\n rootPath: ''\n };\n}\n\ntype fsStorageType = { type: 'FS' };\ntype fsStorageTypeSettings = {\n rootPath: string;\n};\n\nexport type monitoringSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type monitoringOptions = Partial<monitoringSettings>;\n\nexport type debugSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type debugOptions = Partial<debugSettings>;\n\n/** Makes all keys and keys in sub-objects optional. */\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n","import fs from 'fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:':\n var bucketName = url.hostname;\n var region = url.searchParams.get('region');\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region\n } as types.storageOptions;\n\n case 's3e:':\n var p = url.pathname.split('/').slice(1); // '/bucket/keyPrefix' -> ['', 'bucket', 'keyPrefix'] -> ['bucket', 'keyPrefix']\n var bucketName = p[0];\n var keyPrefix = p.length > 1 ? p[1] : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : ''\n } as types.storageOptions;\n\n case 's3es:':\n var p = url.pathname.split('/').slice(1); // '/bucket/keyPrefix' -> ['', 'bucket', 'keyPrefix'] -> ['bucket', 'keyPrefix']\n var bucketName = p[0];\n var keyPrefix = p.length > 1 ? p[1] : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : ''\n } as types.storageOptions;\n\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.data('local-custom');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls\n }\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` }\n ]\n },\n db: {\n path: `${localRoot}/db`\n }\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'main-bucket',\n options?.storages?.primary\n );\n\n var work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error(\"work storage MUST have 'FS' type as it is used for working directories management\");\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'library-bucket',\n options?.storages?.library\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090'\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091'\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? ''\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true }\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions\n): types.storageSettings {\n var storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint ?? 'http://localhost:9000';\n storage.presignEndpoint = options?.presignEndpoint ?? 'http://localhost:9000';\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n\n var miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work as types.fsStorageSettings).rootPath}'\n workdirCacheOnFailure: 1h\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows: {}\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n","import os from 'os';\nimport fs from 'fs';\nimport https from 'https';\nimport path from 'path';\n\nimport * as tar from 'tar';\nimport winston from 'winston';\nimport state from './state';\nimport { getDefaultPlVersion } from '@milaboratories/pl-local';\n\nexport const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\nexport function archiveOS(osName?: string): OSType {\n const platform = osName ?? os.platform();\n\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: ` +\n JSON.stringify(OSes)\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\nexport function archiveArch(archName?: string): ArchType {\n const arch = archName ?? os.arch();\n\n switch (arch) {\n case 'arm64':\n return 'arm64';\n case 'x64':\n return 'amd64';\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: ` +\n JSON.stringify(Arches)\n );\n }\n}\n\nexport function downloadArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n showProgress?: boolean;\n downloadURL?: string;\n saveTo?: string;\n }\n): Promise<string> {\n const version = options?.version ?? getDefaultPlVersion();\n const showProgress = options?.showProgress ?? process.stdout.isTTY;\n\n const archiveName = `pl-${version}-${archiveArch()}.tgz`;\n const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;\n\n const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);\n if (fs.existsSync(archiveFilePath)) {\n logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);\n return Promise.resolve(archiveFilePath);\n }\n\n fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });\n\n logger.info(`Downloading Platforma Backend archive:\\n URL: ${downloadURL}\\n Save to: ${archiveFilePath}`);\n\n const request = https.get(downloadURL);\n\n return new Promise((resolve, reject) => {\n request.on('response', (response) => {\n if (!response.statusCode) {\n const err = new Error('failed to download archive: no HTTP status code in response from server');\n request.destroy();\n reject(err);\n return;\n }\n if (response.statusCode !== 200) {\n const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);\n request.destroy();\n reject(err);\n return;\n }\n\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n const archive = fs.createWriteStream(archiveFilePath);\n\n response.pipe(archive);\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progress = (downloadedBytes / totalBytes) * 100;\n if (showProgress) {\n process.stdout.write(` downloading: ${progress.toFixed(2)}%\\r`);\n }\n });\n\n response.on('error', (err: Error) => {\n fs.unlinkSync(archiveFilePath);\n logger.error(`Failed to download Platforma Binary: ${err.message}`);\n request.destroy();\n reject(err);\n });\n\n archive.on('finish', () => {\n archive.close();\n logger.info(` ... download done.`);\n request.destroy();\n resolve(archiveFilePath);\n });\n });\n });\n}\n\nexport function extractArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n archivePath?: string;\n extractTo?: string;\n }\n): string {\n logger.debug('extracting archive...');\n\n const version = options?.version ?? getDefaultPlVersion();\n logger.debug(` version: '${version}'`);\n const archiveName = `${binaryDirName({ version })}.tgz`;\n\n const archivePath = options?.archivePath ?? state.binaries(archiveName);\n logger.debug(` archive path: '${archivePath}'`);\n\n const targetDir = options?.extractTo ?? trimExtension(archivePath);\n logger.debug(` target dir: '${targetDir}'`);\n\n if (fs.existsSync(targetDir)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);\n return targetDir;\n }\n\n if (!fs.existsSync(archivePath)) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n if (!fs.existsSync(targetDir)) {\n logger.debug(` creating target dir '${targetDir}'`);\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n logger.info(`Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${targetDir}`);\n\n tar.x({\n file: archivePath,\n cwd: targetDir,\n gzip: true,\n sync: true\n });\n\n logger.info(` ... unpack done.`);\n\n return targetDir;\n}\n\nexport function getBinary(\n logger: winston.Logger,\n options?: { version?: string; showProgress?: boolean }\n): Promise<string> {\n return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));\n}\n\nfunction binaryDirName(options?: { version?: string }): string {\n const version = options?.version ?? getDefaultPlVersion();\n return `pl-${version}-${archiveArch()}`;\n}\n\nexport function binaryPath(version?: string, ...p: string[]): string {\n return state.binaries(binaryDirName({ version }), ...p);\n}\n\nfunction trimExtension(filename: string): string {\n const lastDotIndex = filename.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return filename;\n }\n return filename.slice(0, lastDotIndex);\n}\n","import type { ChildProcess, SpawnSyncReturns } from 'node:child_process';\nimport { spawn, spawnSync } from 'node:child_process';\nimport yaml from 'yaml';\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 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() {\n const result = run.rerunLast(this.logger, { stdio: 'inherit' });\n checkRunError(result, 'failed to bring back Platforma Backend in the last started configuration');\n }\n\n public startLocal(options?: startLocalOptions): ChildProcess {\n const cmd = options?.binaryPath ?? platforma.binaryPath(options?.version, 'binaries', 'platforma');\n let configPath = options?.configPath;\n const workdir: string = options?.workdir ?? (configPath ? process.cwd() : state.path());\n\n if (options?.primaryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n primary: plCfg.storageSettingsFromURL(options.primaryURL, workdir, options.configOptions?.storages?.primary),\n },\n };\n }\n if (options?.libraryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n library: plCfg.storageSettingsFromURL(options.libraryURL, workdir, options.configOptions?.storages?.library),\n },\n };\n }\n\n const configOptions = plCfg.loadDefaults(this.getLastJwt(), options?.configOptions);\n\n this.logger.debug(` checking license...`);\n this.checkLicense(options?.configOptions?.license?.value, options?.configOptions?.license?.file);\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 runInfo = this.renderRunInfo({\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 this.logger.info(`Starting platforma:\\n${runInfo}`);\n\n return run.runProcess(\n this.logger,\n cmd,\n ['-config', configPath],\n {\n cwd: workdir,\n stdio: 'inherit',\n },\n {\n storagePath: configOptions.localRoot,\n },\n );\n }\n\n public startLocalS3(options?: startLocalS3Options): ChildProcess {\n this.logger.debug('starting platforma in \\'local s3\\' mode...');\n\n const minioPort = options?.minioPort ?? 9000;\n const localRoot = options?.configOptions?.localRoot;\n this.startMinio({\n minioPort: minioPort,\n minioConsolePort: options?.minioConsolePort,\n storage: localRoot ? path.join(localRoot, 'minio') : undefined,\n });\n\n return this.startLocal({\n ...options,\n primaryURL:\n options?.primaryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/main-bucket/?region=no-region`,\n libraryURL:\n options?.libraryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/library-bucket/?region=no-region`,\n });\n }\n\n public startMinio(options?: {\n image?: string;\n version?: string;\n minioPort?: number;\n minioConsolePort?: number;\n storage?: string;\n }) {\n this.logger.debug(' starting minio...');\n const composeMinio = pkg.assets('compose-backend.yaml');\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.data('minio');\n util.ensureDir(storage, { mode: '0775' });\n const stubStorage = state.data('stub');\n util.ensureDir(stubStorage);\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 PL_DATA_DB_ROOT: stubStorage,\n PL_DATA_PRIMARY_ROOT: stubStorage,\n PL_DATA_LIBRARY_ROOT: stubStorage,\n PL_DATA_WORKDIR_ROOT: stubStorage,\n PL_DATA_PACKAGE_ROOT: stubStorage,\n PL_IMAGE: 'scratch',\n };\n\n this.logger.debug(` spawning child 'docker' process...`);\n const result = spawnSync(\n 'docker',\n ['compose', `--file=${composeMinio}`, 'up', '--detach', '--remove-orphans', '--pull=missing', 'minio'],\n {\n env: {\n ...process.env,\n ...envs,\n },\n stdio: 'inherit',\n },\n );\n\n checkRunError(result, 'failed to start MinIO service in docker');\n }\n\n public buildPlatforma(options: { repoRoot: string; binPath?: string }): string {\n const cmdPath: string = path.resolve(options.repoRoot, 'cmd', 'platforma');\n const binPath: string = options.binPath ?? path.join(os.tmpdir(), 'platforma-local-build');\n\n this.logger.info('Building Platforma Backend binary from sources');\n this.logger.info(` sources path: ${options.repoRoot}`);\n this.logger.info(` binary path: ${binPath}`);\n\n const result = spawnSync('go', ['build', '-o', binPath, '.'], {\n cwd: cmdPath,\n stdio: 'inherit',\n });\n\n checkRunError(result, 'failed to build platforma binary from sources using \\'go build\\' command');\n return binPath;\n }\n\n public startDockerS3(\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 monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n\n customMounts?: { hostPath: string; containerPath?: string }[];\n },\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 primary = plCfg.storageSettingsFromURL('s3e://testuser:testpassword@minio:9000/main-bucket');\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://localhost:9000';\n }\n\n const library = plCfg.storageSettingsFromURL('s3e://testuser:testpassword@minio:9000/library-bucket');\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://localhost:9000';\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(composeS3Path, composeDstPath, new Map([\n ['minio', {}],\n ['backend', {\n platform: options?.platformOverride,\n mounts: backendMounts,\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_PATH: 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_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 PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage('primary', primary),\n ...this.configureDockerStorage('library', library),\n };\n\n if (options?.grpcAddr) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = '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'] = 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 const result = run.runDocker(\n this.logger,\n [\n 'compose',\n `--file=${composeDstPath}`,\n 'up',\n '--detach',\n '--remove-orphans',\n '--pull=missing',\n 'minio',\n 'backend',\n ],\n {\n env: envs,\n stdio: 'inherit',\n },\n {\n plImage: image,\n composePath: composeDstPath,\n },\n );\n\n checkRunError(result, 'failed to start Platforma Backend in Docker');\n state.isActive = true;\n\n const runInfo = this.renderRunInfo({\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 this.logger.info(`Started platforma:\\n${runInfo}`);\n }\n\n public startDocker(\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 ) {\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(`Rendering docker compose file '${composeDstPath}' using '${composeFSPath}' as base template`);\n composeCfg.render(composeFSPath, composeDstPath, new Map([\n ['backend', {\n platform: options?.platformOverride,\n mounts: backendMounts,\n }],\n ]));\n\n const primary = plCfg.storageSettingsFromURL(options?.primaryStorageURL ?? `file:${primaryFSPath}`, '.');\n const library = plCfg.storageSettingsFromURL(options?.libraryStorageURL ?? `file:${libraryFSPath}`, '.');\n\n const envs: NodeJS.ProcessEnv = {\n MINIO_IMAGE: 'quay.io/minio/minio',\n MINIO_STORAGE: storageDir('minio'),\n\n PL_IMAGE: image,\n PL_AUTH_HTPASSWD_PATH: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: 'info',\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: 'true',\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) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = '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'] = 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 const result = run.runDocker(\n this.logger,\n ['compose', `--file=${composeDstPath}`, 'up', '--detach', '--remove-orphans', '--pull=missing'],\n {\n env: envs,\n stdio: 'inherit',\n },\n {\n plImage: image,\n composePath: composeDstPath,\n primaryPath: primaryFSPath,\n workPath: workFSPath,\n libraryPath: libraryFSPath,\n },\n );\n\n checkRunError(result, 'failed to start Platforma Backend in Docker');\n state.isActive = true;\n\n const runInfo = this.renderRunInfo({\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 this.logger.info(`Started platforma:\\n${runInfo}`);\n }\n\n public stop() {\n if (!state.isActive) {\n console.log('no running service detected');\n return;\n }\n\n const lastRun = state.lastRun!;\n\n switch (lastRun.mode) {\n case 'docker': {\n const result = spawnSync('docker', ['compose', '--file', lastRun.docker!.composePath!, 'down'], {\n env: {\n ...process.env,\n ...lastRun.envs,\n },\n stdio: 'inherit',\n });\n state.isActive = false;\n if (result.status !== 0) process.exit(result.status);\n return;\n }\n case 'process': {\n if (state.isValidPID) {\n process.kill(lastRun.process!.pid!);\n }\n state.isActive = false;\n return;\n }\n default:\n util.assertNever(lastRun.mode);\n }\n }\n\n public cleanup() {\n const removeWarns = [\n 'last command run cache (\\'pl-service start\\' shorthand will stop working until next full start command call)',\n `'platforma' docker compose service containers and volumes`,\n ];\n const defaultDataRoot = state.data();\n const dirsToRemove: string[] = [defaultDataRoot];\n\n if (state.lastRun?.docker?.primaryPath) {\n const dockerStoragePath = state.lastRun?.docker?.primaryPath;\n if (!dockerStoragePath.startsWith(defaultDataRoot)) {\n dirsToRemove.push(dockerStoragePath);\n }\n }\n\n if (state.lastRun?.docker?.workPath) {\n const workStoragePath = state.lastRun?.docker?.workPath;\n if (!workStoragePath.startsWith(defaultDataRoot)) {\n dirsToRemove.push(workStoragePath);\n }\n }\n\n if (state.lastRun?.process?.storagePath) {\n const localStoragePath = state.lastRun?.process?.storagePath;\n if (!localStoragePath.startsWith(defaultDataRoot)) {\n dirsToRemove.push(localStoragePath);\n }\n }\n\n const storageWarns\n = dirsToRemove.length > 0\n ? ` - storages (you'll loose all projects and calculation results stored in service instances):\\n - ${dirsToRemove.join('\\n - ')}`\n : '';\n\n const warnMessage = `\nYou are going to reset the state of platforma service\nThings to be removed:\n - ${removeWarns.join('\\n - ')}\n${storageWarns}\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 const composeToDestroy = new Set<string>(pkg.composeFiles());\n if (state.lastRun?.docker?.composePath) {\n composeToDestroy.add(state.lastRun.docker.composePath);\n }\n\n for (const composeFile of composeToDestroy) {\n this.logger.info(`Destroying docker compose '${composeFile}'`);\n this.destroyDocker(composeFile, pkg.plImageTag());\n }\n\n for (const dir of dirsToRemove) {\n this.logger.info(`Destroying '${dir}'`);\n fs.rmSync(dir, { recursive: true, force: true });\n }\n\n this.logger.info(`Destroying state dir '${state.path()}'`);\n fs.rmSync(state.path(), { recursive: true, force: true });\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 ?? '') != '') flags['license-file'] = process.env.MI_LICENSE_FILE;\n else if ((process.env.PL_LICENSE_FILE ?? '') != '') 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('LDAP auth settings require both \\'server\\' and \\'default DN\\' options to be set');\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 destroyDocker(composePath: string, image: string) {\n const stubStoragePath = state.data('stub');\n const result = spawnSync('docker', ['compose', '--file', composePath, 'down', '--volumes', '--remove-orphans'], {\n env: {\n ...process.env,\n PL_IMAGE: 'scratch',\n\n PL_DATA_DB_ROOT: stubStoragePath,\n PL_DATA_PRIMARY_ROOT: stubStoragePath,\n PL_DATA_LIBRARY_ROOT: stubStoragePath,\n PL_DATA_WORKDIR_ROOT: stubStoragePath,\n PL_DATA_PACKAGE_ROOT: stubStoragePath,\n\n MINIO_IMAGE: 'scratch',\n MINIO_STORAGE: stubStoragePath,\n },\n stdio: 'inherit',\n });\n\n if (result.status !== 0) process.exit(result.status);\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://licensing.milaboratories.com\".`);\n\n throw new Error(`The license was not provided.`);\n }\n\n private configureDockerStorage(storageID: string, storage: types.storageOptions): NodeJS.ProcessEnv {\n const envs: NodeJS.ProcessEnv = {};\n const sType = storage.type;\n storageID = storageID.toUpperCase();\n\n switch (sType) {\n case 'S3':\n envs[`PL_DATA_${storageID}_TYPE`] = 'S3';\n envs[`PL_DATA_${storageID}_S3_BUCKET`] = storage.bucketName!;\n\n if (storage.endpoint) envs[`PL_DATA_${storageID}_S3_ENDPOINT`] = storage.endpoint;\n if (storage.presignEndpoint) envs[`PL_DATA_${storageID}_S3_PRESIGN_ENDPOINT`] = storage.presignEndpoint;\n if (storage.region) envs[`PL_DATA_${storageID}_S3_REGION`] = storage.region;\n if (storage.key) envs[`PL_DATA_${storageID}_S3_KEY`] = storage.key;\n if (storage.secret) envs[`PL_DATA_${storageID}_S3_SECRET`] = storage.secret;\n\n return envs;\n\n case 'FS':\n envs[`PL_DATA_${storageID}_TYPE`] = 'FS';\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readComposeFile(fPath: string): any {\n const yamlData = fs.readFileSync(fPath);\n return yaml.parse(yamlData.toString());\n }\n\n private writeComposeFile(fPath: string, data: unknown) {\n fs.writeFileSync(fPath, yaml.stringify(data));\n }\n}\n\nexport function checkRunError(result: SpawnSyncReturns<Buffer>, message?: string) {\n if (result.error) {\n throw result.error;\n }\n\n const msg = message ?? 'failed to run command';\n\n if (result.status !== 0) {\n throw new Error(`${msg}, process exited with code '${result.status}'`);\n }\n}\n\nexport type startLocalOptions = {\n version?: string;\n binaryPath?: string;\n configPath?: string;\n configOptions?: plCfg.plOptions;\n workdir?: string;\n\n primaryURL?: string;\n libraryURL?: string;\n};\n\nexport type startLocalFSOptions = startLocalOptions;\n\nexport type startLocalS3Options = startLocalOptions & {\n minioPort?: number;\n minioConsolePort?: number;\n};\n","import { Command, Flags } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Reset extends Command {\n static override description =\n 'Clear service state (forget last run command, destroy docker services, volumes and so on)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Reset);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.cleanup();\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Start extends Command {\n static override description = 'Start last run service configuraiton';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Start);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n core.startLast();\n }\n}\n","import { Command } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Stop extends Command {\n static override description = 'Stop platforma service';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Stop);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n core.stop();\n }\n}\n","import path from 'path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport * as types from '../../templates/types';\nimport state from '../../state';\n\nexport default class Docker extends Command {\n static override description = \"Run platforma backend service with 'FS' primary storage type\";\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Docker);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.')\n }\n : undefined;\n const storage = flags.storage ? path.join('.', flags.storage) : state.data('docker');\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n\n core.startDocker(storage, {\n primaryStorageURL: flags['storage-primary'],\n workStoragePath: flags['storage-work'],\n libraryStorageURL: flags['storage-library'],\n\n image: flags.image,\n version: flags.version,\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port']\n });\n }\n}\n","import { Command } from '@oclif/core';\nimport path from 'path';\nimport Core, { startLocalOptions } from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as platforma from '../../platforma';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.data('local');\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n var binaryPath = flags['pl-binary'];\n if (flags['pl-sources']) {\n binaryPath = core.buildPlatforma({ repoRoot: flags['pl-sources'] });\n }\n\n var listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n var listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n var listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: startLocalOptions = {\n binaryPath: binaryPath,\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] }\n }\n }\n };\n\n if (startOptions.binaryPath) {\n core.startLocal(startOptions);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => core.startLocal(startOptions))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","import path from 'path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport * as types from '../../../templates/types';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = \"Run platforma backend service with 'S3' primary storage type\";\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.')\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.data('docker-s3');\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n\n core.startDockerS3(storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n });\n }\n}\n","import path from 'path';\n\nimport { Command } from '@oclif/core';\nimport Core, { startLocalS3Options } from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as platforma from '../../../platforma';\nimport * as util from '../../../util';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.S3AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.data('local-s3');\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n var binaryPath = flags['pl-binary'];\n if (flags['pl-sources']) {\n binaryPath = core.buildPlatforma({ repoRoot: flags['pl-sources'] });\n }\n\n var listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n var listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n var listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: startLocalS3Options = {\n binaryPath: binaryPath,\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n minioPort: flags['s3-address-port'],\n minioConsolePort: flags['s3-console-address-port'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: {\n auth: { enabled: authEnabled, drivers: authDrivers }\n },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] }\n }\n }\n };\n\n if (startOptions.binaryPath) {\n core.startLocalS3(startOptions);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => core.startLocalS3(startOptions))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","// DO NOT EDIT. This file was generated by oclif-index utility.\n\nimport Cmd0 from './commands/create-block';\nimport Cmd1 from './commands/reset';\nimport Cmd2 from './commands/start';\nimport Cmd3 from './commands/stop';\nimport Cmd4 from './commands/start/docker';\nimport Cmd5 from './commands/start/local';\nimport Cmd6 from './commands/start/docker/s3';\nimport Cmd7 from './commands/start/local/s3';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'create-block': Cmd0,\n 'reset': Cmd1,\n 'start': Cmd2,\n 'stop': Cmd3,\n 'start:docker': Cmd4,\n 'start:local': Cmd5,\n 'start:docker:s3': Cmd6,\n 'start:local:s3': Cmd7,\n};\n"],"names":["GlobalFlags","Flags","ImageFlag","VersionFlag","ArchFlag","LicenseFlags","AddressesFlags","S3AddressesFlags","StorageFlag","MountFlag","PlLogFileFlag","PlWorkdirFlag","PlBinaryFlag","PlSourcesFlag","ConfigFlag","StorageWorkPathFlag","StoragePrimaryURLFlag","StorageLibraryURLFlag","AuthEnabledFlag","HTPasswdFileFlag","LDAPAddressFlag","LDAPDefaultDNFlag","AuthFlags","askYN","prompt","readlineSync","assertNever","n","createLogger","level","winston","message","indent","messageJson","indentedMessage","line","index","l","randomStr","len","randomBytes","resolveTilde","p","path","os","ensureDir","options","fs","getProcessName","pid","execSync","command","lines","blockPlatformsToChoose","allPlatforms","CreateBlockPlatforms","z","CreateBlockOptions","createBlock","logger","npmOrgName","orgName","blockName","softwarePlatforms","askForOptions","targetPath","downloadAndUnzip","platformsToRemove","noPlatforms","removePlatform","removePlatformsCompletely","replaceRegexInAllFiles","needSoftware","url","pathInArchive","outputPath","content","tmpDir","tmpFile","f","Writable","createWriteStream","tmpRepo","decompress","dir","platform","deleteRegexInFile","replaceInFile","json","patterns","files","getAllFiles","from","to","fPath","replaceRegexInFile","replacer","newContent","what","_CreateBlock","Command","flags","util.createLogger","block.createBlock","__publicField","cmdOpts.GlobalFlags","CreateBlock","resolve","assets","composeFiles","entry","value","readFileSync","plImageTag","version","getDefaultPlVersion","_State","stateDir","stateFile","pkg.readFileSync","_b","_a","processName","util.getProcessName","info","State","state","runDocker","args","stateToSave","runSync","runProcess","cmd","result","run","rerunLast","child","spawn","exitAfterChild","sigintHandler","code","spawnSync","render","composeSource","composeDest","services","composeSrcData","compose","YAML","svcName","svcSpec","envSpecI","envName","last","envValue","mount","emptyS3Settings","id","emptyFSSettings","storageSettingsFromURL","storageURL","baseDir","defaults","bucketName","region","keyPrefix","loadDefaults","jwtKey","localRoot","log","grpc","_c","defaultBool","_e","_d","_g","_f","_i","_h","_k","_j","_l","core","_n","_m","_p","_o","primary","defaultStorageSettings","_q","work","_s","_r","types.emptyFSSettings","_u","_t","_w","_v","library","_x","monitoring","_y","_z","debug","_A","_B","license","_C","_D","storageID","defaultLocation","defaultBucket","storage","types.emptyS3Settings","disableMon","disableDbg","libraryDownloadable","miLicenseSecret","v","def","OSes","archiveOS","osName","Arches","archiveArch","archName","arch","downloadArchive","showProgress","archiveName","downloadURL","archiveFilePath","request","https","reject","response","err","totalBytes","downloadedBytes","archive","chunk","progress","extractArchive","binaryDirName","archivePath","targetDir","trimExtension","msg","tar","getBinary","binaryPath","filename","lastDotIndex","Core","run.rerunLast","checkRunError","platforma.binaryPath","configPath","workdir","plCfg.storageSettingsFromURL","configOptions","plCfg.loadDefaults","storageDirs","drv","pkg.assets","plCfg.render","runInfo","run.runProcess","minioPort","composeMinio","image","util.ensureDir","stubStorage","minioConsolePort","envs","cmdPath","binPath","composeS3Path","pkg.plImageTag","storagePath","s","storageDir","logFilePath","dbFSPath","workFSPath","usersFSPath","composeDstPath","backendMounts","mnt","composeCfg.render","run.runDocker","composeFSPath","primaryFSPath","libraryFSPath","lastRun","util.assertNever","removeWarns","defaultDataRoot","dirsToRemove","dockerStoragePath","workStoragePath","localStoragePath","storageWarns","warnMessage","util.askYN","composeToDestroy","pkg.composeFiles","composeFile","authDrivers","jwtFile","encoding","lastJwt","util.randomStr","composePath","stubStoragePath","file","sType","report","column","t","yamlData","yaml","data","_Reset","Reset","_Start","Start","_Stop","Stop","_Docker","authEnabled","authOptions","mounts","platformOverride","cmdOpts.AddressesFlags","cmdOpts.ImageFlag","cmdOpts.VersionFlag","cmdOpts.ArchFlag","cmdOpts.AuthFlags","cmdOpts.LicenseFlags","cmdOpts.MountFlag","cmdOpts.StorageFlag","cmdOpts.StoragePrimaryURLFlag","cmdOpts.StorageWorkPathFlag","cmdOpts.StorageLibraryURLFlag","Docker","_Local","logFile","listenGrpc","listenMon","listenDbg","startOptions","platforma.getBinary","cmdOpts.PlBinaryFlag","cmdOpts.PlSourcesFlag","cmdOpts.ConfigFlag","cmdOpts.PlLogFileFlag","cmdOpts.PlWorkdirFlag","Local","_S3","cmdOpts.S3AddressesFlags","S3","COMMANDS","Cmd0","Cmd1","Cmd2","Cmd3","Cmd4","Cmd5","Cmd6","Cmd7"],"mappings":"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"}