@niledatabase/server 2.3.0 → 2.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs.production.min.js","sources":["../src/utils/Logger.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/users/index.ts","../src/tenants/index.ts","../src/db/NileInstance.ts","../src/db/PoolProxy.ts","../src/db/DBManager.ts","../src/utils/Server/index.ts","../src/Server.ts","../src/index.ts"],"sourcesContent":["import { ServerConfig } from '../types';\n\nimport { Config } from './Config';\n\nexport default function Logger(\n config: void | Config | ServerConfig,\n ...params: unknown[]\n) {\n return {\n info(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.info('[niledb]', ...params, ...args);\n }\n },\n warn(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[niledb]', ...params, ...args);\n }\n },\n error(...args: unknown[]) {\n // eslint-disable-next-line no-console\n console.error('[niledb]', '[ERROR]', ...params, ...args);\n },\n };\n}\n","import 'dotenv/config';\nimport { ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nexport type EnvConfig = {\n logger?: string;\n config?: ServerConfig;\n};\n\nexport const getDatbaseId = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[databaseId]');\n if (config?.databaseId) {\n logger && info(logger, 'config', config.databaseId);\n return String(config?.databaseId);\n }\n logger && info(logger, 'env', process.env.NILEDB_ID);\n return process.env.NILEDB_ID;\n};\nexport const getUsername = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[username]');\n if (config?.user) {\n logger && info(logger, 'config', config.user);\n return String(config?.user);\n }\n logger && info(logger, '.env', process.env.NILEDB_USER);\n return process.env.NILEDB_USER;\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const log = logProtector(logger);\n const { info } = Logger(config, '[password]');\n if (config?.password) {\n log && info(logger, 'config', config.password);\n\n return String(config.password);\n }\n\n log && info(logger, '.env', process.env.NILEDB_PASSWORD);\n return process.env.NILEDB_PASSWORD;\n};\n\nexport const getInfoBearer = (cfg: EnvConfig) => {\n return `${getUsername(cfg)}:${getPassword(cfg)}`;\n};\n\nexport const getToken = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[token]');\n if (config?.api?.token) {\n logger && info(logger, 'config', config.api?.token);\n return String(config.api?.token);\n }\n if (process.env.NILEDB_TOKEN) {\n logger && info(logger, '.env', process.env.NILEDB_TOKEN);\n return process.env.NILEDB_TOKEN;\n }\n return undefined;\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[databaseName]');\n if (config?.databaseName) {\n logger && info(logger, 'config', config.databaseName);\n return String(config.databaseName);\n }\n if (process.env.NILEDB_NAME) {\n logger && info(logger, 'config', process.env.NILEDB_NAME);\n return process.env.NILEDB_NAME;\n }\n return null;\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[tenantId]');\n if (config?.tenantId) {\n logger && info(logger, 'config', config.tenantId);\n return config.tenantId;\n }\n\n if (process.env.NILEDB_TENANT) {\n logger && info(logger, '.env', process.env.NILEDB_TENANT);\n return process.env.NILEDB_TENANT;\n }\n\n return null;\n};\n\nexport const getBasePath = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n if (basePath) {\n logger && info(logger, 'config', config?.api?.basePath);\n return basePath;\n }\n\n if (process.env.NILEDB_API) {\n logger && info(logger, '.env', process.env.NILEDB_API);\n return `https://${process.env.NILEDB_API}`;\n }\n\n logger && info(logger, 'default', process.env.NILEDB_API);\n return 'https://api.thenile.dev';\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (config?.db && config.db.host) {\n logger && info(logger, 'config', config?.db.host);\n return config.db.host;\n }\n\n if (process.env.NILEDB_HOST) {\n logger && info(logger, '.env', process.env.NILEDB_HOST);\n return process.env.NILEDB_HOST;\n }\n\n logger && info(logger, 'default', 'db.thenile.dev');\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.port]');\n if (config?.db?.port && config.db.port != null) {\n logger && info(logger, 'config', config?.db.port);\n return Number(config.db?.port);\n }\n\n if (process.env.NILEDB_PORT) {\n logger && info(logger, 'config', process.env.NILEDB_PORT);\n return Number(process.env.NILEDB_PORT);\n }\n logger && info(logger, 'default', 5432);\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger?: string) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n","import { NilePoolConfig, ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getDatabaseName,\n getDatbaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n} from './envVars';\n\ntype Database = {\n name: string;\n apiHost: string;\n dbHost: string;\n id: string;\n message?: string; // is actually an error\n status: 'READY' | string;\n};\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n }: {\n basePath: string;\n cookieKey: string;\n token: string | undefined;\n }) {\n this.basePath = basePath;\n this.cookieKey = cookieKey;\n this._token = token;\n }\n\n public get token(): string | undefined {\n return this._token;\n }\n\n public set token(value: string | undefined) {\n this._token = value;\n }\n}\n\nexport class Config {\n user: string;\n password: string;\n databaseId: string;\n databaseName: string;\n\n debug: boolean;\n\n db: NilePoolConfig;\n\n api: ApiConfig;\n\n private _tenantId?: string | undefined | null;\n private _userId?: string | undefined | null;\n\n public get tenantId(): string | undefined | null {\n return this._tenantId;\n }\n\n public set tenantId(value: string | undefined | null) {\n this._tenantId = value;\n }\n\n public get userId(): string | undefined | null {\n return this._userId;\n }\n\n public set userId(value: string | undefined | null) {\n this._userId = value;\n }\n\n constructor(config: ServerConfig) {\n const envVarConfig: EnvConfig = { config };\n\n this.databaseId = getDatbaseId(envVarConfig) as string;\n this.user = getUsername(envVarConfig) as string;\n this.password = getPassword(envVarConfig) as string;\n this.databaseName = getDatabaseName(envVarConfig) as string;\n this._tenantId = getTenantId(envVarConfig);\n this.debug = Boolean(config?.debug);\n this._userId = config?.userId;\n\n const basePath = getBasePath(envVarConfig);\n const host = getDbHost(envVarConfig);\n const port = getDbPort(envVarConfig);\n\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host,\n port,\n ...(typeof config?.db === 'object' ? config.db : {}),\n };\n if (this.databaseName) {\n this.db.database = this.databaseName;\n }\n }\n\n configure = async (config: ServerConfig): Promise<Config> => {\n const envVarConfig: EnvConfig = {\n config,\n };\n let host = getDbHost(envVarConfig);\n const { info, error } = Logger(config, '[init]');\n\n if (host && this.databaseName && this.databaseId) {\n info('Alreaady configured, aborting fetch');\n return this;\n }\n\n let basePath = getBasePath(envVarConfig);\n const port = getDbPort(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${basePath}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info(url.href);\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${getInfoBearer({ config })}`,\n },\n });\n let database: Database;\n const possibleError = res.clone();\n try {\n const json: Database = await res.json();\n if (res.status === 404) {\n info('is the configured databaseName correct?');\n }\n if (json.status && json.status !== 'READY') {\n database = { message: 'Database is not ready yet' } as Database;\n } else {\n database = json;\n }\n } catch (e) {\n const message = await possibleError.text();\n error(message);\n database = { message } as Database;\n }\n info('[fetched database]', database);\n if (process.env.NODE_ENV !== 'TEST') {\n if ('message' in database) {\n if ('statusCode' in database) {\n error(database);\n throw new Error('HTTP error has occured');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please set or remove NILEDB_API, NILEDB_NAME, and NILEDB_HOST in your .env file.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n const apiurl = new URL(apiHost);\n host = dburl.host;\n basePath = apiurl.origin;\n }\n }\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host,\n port,\n database: this.databaseName,\n ...(typeof config?.db === 'object' ? config.db : {}),\n };\n info('[config set]', this);\n return this;\n };\n}\n","type BusValues = undefined | null | string;\ntype EventFn = (params: BusValues) => void;\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n}\nclass Eventer {\n events: { [key: string]: EventFn[] };\n constructor() {\n this.events = {};\n }\n publish(eventName: string, value: BusValues) {\n // Get all the callback functions of the current event\n const callbackList = this.events[eventName];\n\n // execute each callback function\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n // initialize this event\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n\n // store the callback function of the subscriber\n this.events[eventName].push(callback);\n }\n}\n\n// tenantId manager\nconst eventer = new Eventer();\n\nexport const updateTenantId = (tenantId: BusValues) => {\n eventer.publish(Events.Tenant, tenantId);\n};\n\nexport const watchTenantId = (cb: EventFn) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: BusValues) => {\n eventer.publish(Events.User, userId);\n};\n\nexport const watchUserId = (cb: EventFn) => eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (val: BusValues) => {\n eventer.publish(Events.Token, val);\n};\n\nexport const watchToken = (cb: EventFn) => eventer.subscribe(Events.Token, cb);\n\nexport const watchEvictPool = (cb: EventFn) =>\n eventer.subscribe(Events.EvictPool, cb);\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","export class ResponseError {\n response: Response;\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this.response = new Response(body, init);\n }\n}\n","import { decodeJwt } from 'jose';\n\nimport { ResponseError } from './ResponseError';\nimport { Config } from './Config';\nimport { NileRequest } from './Requester';\nimport { updateTenantId, updateUserId } from './Event';\nimport { getToken } from './Config/envVars';\nimport Logger from './Logger';\n\nexport const X_NILE_TENANT = 'x-nile-tenantId';\nexport const X_NILE_USER_ID = 'x-nile-userId';\n\nexport function handleTenantId(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n req: NileRequest<any>,\n config: Config\n): ResponseError | void {\n // already set, no need to try and figure it out\n if (config.tenantId) {\n return;\n }\n return new ResponseError('tenant id needs to be set', { status: 400 });\n}\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config: Config) {\n const cookieTenant = getTokenFromCookie(headers, 'tenantId');\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config.tenantId;\n}\n\nexport function getUserFromHttp(headers: Headers, config: Config) {\n const token = getTokenFromCookie(headers, config.api.cookieKey);\n if (token) {\n const jwt = decodeJwt(token);\n return jwt.sub;\n }\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const { info, error } = Logger(config, '[server]');\n\n const url = `${config.api?.basePath}${path}`;\n const cookieKey = config.api?.cookieKey;\n const headers = new Headers(opts?.headers);\n const basicHeaders = new Headers();\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n basicHeaders.set('Authorization', `Bearer ${token}`);\n } else if (getToken({ config })) {\n basicHeaders.set('Authorization', `Bearer ${getToken({ config })}`);\n }\n }\n\n const tenantId = getTenantFromHttp(headers, config);\n updateTenantId(tenantId);\n const userId = getUserFromHttp(headers, config);\n updateUserId(userId);\n if (url.includes('{tenantId}') && !tenantId) {\n return new ResponseError('tenantId is not set for request', {\n status: 400,\n });\n }\n const useableUrl = url\n .replace('{tenantId}', encodeURIComponent(String(tenantId)))\n .replace('{userId}', encodeURIComponent(String(userId)));\n\n info('[fetch]', useableUrl);\n\n const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n error('[fetch]', '[response]', e);\n });\n\n if (response && response.status >= 200 && response.status < 300) {\n if (typeof response.clone === 'function') {\n info('[fetch]', '[response]', await response.clone().json());\n }\n return response;\n }\n\n let res;\n const errorHandler =\n typeof response?.clone === 'function' ? response.clone() : null;\n let msg = '';\n try {\n res = await (response as Response)?.json();\n } catch (e) {\n if (errorHandler) {\n msg = await errorHandler.text();\n if (msg) {\n error('[fetch]', '[response]', `[status: ${errorHandler.status}]`, msg);\n }\n }\n if (!msg) {\n error('[fetch]', '[response]', e);\n }\n }\n if (msg) {\n return new ResponseError(msg, { status: errorHandler?.status });\n }\n\n if (res && 'message' in res) {\n const { message } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n 'UNHANDLED ERROR'\n );\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n}\n","import isEmpty from 'lodash/isEmpty';\nimport isObject from 'lodash/isObject';\n\nimport { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT, _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'POST' | 'GET' | 'PUT';\nexport default class Requester<T> extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n async rawRequest(\n method: Methods,\n url: string,\n init: RequestInit,\n body?: string\n ): Promise<Response> {\n const _init = {\n ...init,\n body,\n method,\n };\n\n const res = await _fetch(this, url, _init);\n\n if (res instanceof ResponseError) {\n return res.response;\n }\n\n return res;\n }\n\n /**\n * three optios here\n * 1) pass in headers for a server side request\n * 2) pass in the payload that matches the api\n * 3) pass in the request object sent by a browser\n * @param method\n * @param url\n * @param req\n * @param init\n * @returns\n */\n protected async request(\n method: Methods,\n url: string,\n req: T | Headers,\n init?: RequestInit\n ): Promise<Response> {\n // set the headers\n const headers = new Headers(init ? init?.headers : {});\n if (req instanceof Headers) {\n const tenantId = req.get(X_NILE_TENANT);\n const cookie = req.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n } else if (req instanceof Request) {\n // pass back the X_NILE_TENANT\n const _headers = new Headers(req?.headers);\n const tenantId = _headers.get(X_NILE_TENANT);\n const cookie = _headers.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n }\n // default the body - may be the actual payload for the API\n let body: string | undefined = JSON.stringify(req);\n\n // comes from next/some server\n if (method === 'GET') {\n body = undefined;\n } else if (req instanceof Request) {\n body = await new Response(req.body).text();\n } else if (\n // is just headers for a GET request\n req instanceof Headers ||\n isEmpty(req) ||\n (isObject(req) && Object.values(req).length === 0)\n ) {\n body = undefined;\n }\n\n const _init = {\n ...init,\n headers,\n };\n\n return await this.rawRequest(method, url, _init, body);\n }\n\n post = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('POST', url, req, init);\n };\n\n get = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('GET', url, req, init);\n };\n\n put = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('PUT', url, req, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\nimport { ResponseError } from '../utils/ResponseError';\nimport {\n X_NILE_TENANT,\n X_NILE_USER_ID,\n getTenantFromHttp,\n} from '../utils/fetch';\nimport { updateToken, updateUserId } from '../utils/Event';\nimport { CreateBasicUserRequest, LoginUserResponse } from '../users';\n\nexport interface TenantSSORegistration {\n configUrl: string;\n clientId: string;\n clientSecret: string;\n redirectURI: string;\n emailDomains: Array<string>;\n enabled?: boolean;\n}\n\nexport interface SSOProvider {\n readonly id?: string;\n tenantId?: string;\n provider?: string;\n configUrl: string;\n clientSecret?: string;\n clientId: string;\n redirectURI: string;\n emailDomains?: Array<string>;\n enabled?: boolean;\n}\nexport default class Auth extends Config {\n constructor(config: Config) {\n super(config);\n }\n get loginUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/login`;\n }\n\n login = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers({ 'content-type': 'application/json' });\n const _requester = new Requester(this);\n\n const params =\n req instanceof Request\n ? new URL(req.url).searchParams\n : new URLSearchParams();\n\n const sso = params.get('sso');\n\n if (sso === 'true') {\n const providerRes = await this.listProviders(\n (req as Request).clone(),\n init\n );\n // if you have a provider, log them in\n if (\n providerRes &&\n providerRes.status >= 200 &&\n providerRes.status < 300\n ) {\n const providers = await new Response(providerRes.body).json();\n if (providers.length > 0) {\n if (providers.length > 1) {\n return new Response(JSON.stringify(providers), { status: 200 });\n // a user has to make a choice\n }\n\n // is there a way to do this? probably not.\n headers.set(X_NILE_TENANT, providers[0].tenantId);\n headers.append(\n 'set-cookie',\n `tenantId=${providers[0].tenantId}; path=/; httponly;`\n );\n // const ssoResp = await this.loginSSO(req);\n return new Response(\n JSON.stringify({\n redirectURI: `${this.api.basePath}${this.loginSSOUrl('okta')}`,\n }),\n { status: 200 }\n );\n // make it a client side redirect, because of the headers\n // if there is no provider, require a password.\n }\n }\n }\n\n const res = await _requester.post(req, this.loginUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { tenants } = token;\n const tenant = tenants?.values();\n const tenantId = tenant?.next().value;\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n updateToken(token.token.jwt);\n\n return new Response(JSON.stringify(token), { status: 200, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n loginSSO = (redirectUrl: string) => {\n const ssoLogin = async (\n req: NileRequest<unknown>\n ): NileResponse<Response> => {\n const headers = new Headers();\n const body = await (req as Request).formData();\n const accessToken = (await body.get('access_token')) as string;\n const tenantId = (await body.get('tenantId')) as string;\n const cookie = `${this.api?.cookieKey}=${accessToken}; path=/; samesite=lax; httponly;`;\n updateToken(accessToken);\n headers.append('set-cookie', cookie);\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n headers.set('Location', redirectUrl);\n return new Response(null, {\n headers,\n status: 303,\n });\n };\n return ssoLogin;\n };\n\n loginSSOUrl = (provider: string) => {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/auth/oidc/providers/${provider}/login`;\n };\n\n get signUpUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users`;\n }\n\n signUp = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers();\n const _requester = new Requester(this);\n const res = await _requester.post(req, this.signUpUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token?.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { id } = token;\n updateToken(token.token?.jwt);\n updateUserId(id);\n headers.set(X_NILE_USER_ID, id);\n headers.append('set-cookie', `userId=${id}; path=/; httponly;`);\n return new Response(JSON.stringify(token), { status: 201, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n updateProviderUrl(providerName: string) {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers/${encodeURIComponent(providerName)}`;\n }\n\n get listTenantProvidersUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers`;\n }\n\n listTenantProviders = async (\n req: NileRequest<void | Headers>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.listTenantProvidersUrl, init);\n };\n\n createProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.post(req, this.updateProviderUrl(providerName), init);\n };\n\n updateProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.put(req, this.updateProviderUrl(providerName), init);\n };\n\n providerUrl(email?: undefined | string) {\n return `/databases/${encodeURIComponent(\n this.databaseId\n )}/tenants/auth/oidc/providers${\n email ? `?email=${encodeURIComponent(email)}` : ''\n }`;\n }\n\n listProviders = async (\n req: NileRequest<void | CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n let body: { email: string } | undefined;\n // this is a get. Get the email from the response body so the request is filtered.\n if (req && 'body' in req) {\n body = await new Response(req.body as BodyInit).json();\n }\n return _requester.get(req, this.providerUrl(body?.email), init);\n };\n\n getSSOCallbackUrl = (param: Headers | string) => {\n let tenantId;\n if (typeof tenantId === 'string') {\n tenantId = param;\n } else if (param instanceof Headers) {\n tenantId = getTenantFromHttp(param, this);\n }\n\n return `/databases/${this.databaseId}/tenants/${tenantId}/auth/oidc/callback`;\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface CreateBasicUserRequest {\n email: string;\n password: string;\n preferredName?: string;\n newTenant?: string;\n}\nexport const LoginUserResponseTokenTypeEnum = {\n AccessToken: 'ACCESS_TOKEN',\n RefreshToken: 'REFRESH_TOKEN',\n IdToken: 'ID_TOKEN',\n} as const;\nexport type LoginUserResponseTokenTypeEnum =\n (typeof LoginUserResponseTokenTypeEnum)[keyof typeof LoginUserResponseTokenTypeEnum];\n\nexport interface LoginUserResponseToken {\n jwt: string;\n maxAge: number;\n type: LoginUserResponseTokenTypeEnum;\n}\nexport interface LoginUserResponse {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n id: string;\n token: LoginUserResponseToken;\n}\nexport interface User {\n id?: string;\n tenants?: Set<string>;\n email?: string;\n preferredName?: string;\n}\n\nexport default class Users extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n get baseUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}`;\n }\n\n get usersUrl() {\n return `${this.baseUrl}/users`;\n }\n\n get tenantUsersUrl() {\n return `${this.baseUrl}/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n\n createTenantUser = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const _requester = new Requester(this);\n return await _requester.post(req, this.tenantUsersUrl, init);\n };\n\n listUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.usersUrl, init);\n };\n\n updateUser = async (\n userId: string,\n req: NileRequest<User>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.put(req, `${this.usersUrl}/${userId}`, init);\n };\n\n listTenantUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.tenantUsersUrl, init);\n };\n\n get meUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/me`;\n }\n\n me = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.meUrl, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface Tenant {\n id: string;\n name?: string;\n}\n\nexport default class Tenants extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantsUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants`;\n }\n get tenantUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.post(req, this.tenantsUrl, init);\n };\n\n getTenant = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.tenantUrl, init);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate } from '../types';\nimport Logger from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: Config;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n const { warn, info } = Logger(config, '[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config.db,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n config.db = poolConfig;\n this.config = config;\n info(this.config);\n\n this.pool = createProxyForPool(new Pool(remaining), this.config);\n\n if (typeof afterCreate === 'function') {\n warn(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n }\n\n // start the timer for cleanup\n this.startTimeout();\n this.pool.on('connect', async (client) => {\n info('pool connected');\n const afterCreate: AfterCreate = makeAfterCreate(config);\n afterCreate(client, (err, _client) => {\n if (err) {\n _client.release();\n }\n });\n this.startTimeout();\n });\n this.pool.on('error', async (e) => {\n info('pool failed', e);\n });\n }\n\n startTimeout() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(async () => {\n await this.pool.end();\n evictPool(this.id);\n }, this.config.db.idleTimeoutMillis);\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config): AfterCreate {\n const { warn, info } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(error: Error) {\n warn('Connection was terminated by server', error);\n done(error, conn);\n });\n\n if (config.tenantId) {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\n if (config.tenantId) {\n info('[tenant id]', config.tenantId);\n }\n if (config.userId) {\n info('[user id]', config.userId);\n }\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(pool: Pool, config: Config): Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.db.connectionString) {\n if (!config.user || !config.password) {\n error(\n 'Cannot connect to the database. User and/or password are missing. Generate them at https://console.thenile.dev'\n );\n } else if (!config.db.database) {\n error(\n 'Database name is missing from the config. Call `nile.init()` or set NILEDB_ID in your .env'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n info(...args);\n // @ts-expect-error - not mine\n const called = caller.apply(this, args);\n return called;\n };\n }\n return target[property];\n },\n }) as Pool;\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { ServerConfig } from '../types';\n\nimport NileDatabase from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: ServerConfig) {\n const { info } = Logger(config, '[DBManager]');\n this.connections = new Map();\n // add the base one, so you can at least query\n const id = this.makeId();\n info('constructor', id);\n this.connections.set(id, new NileDatabase(new Config(config), id));\n watchEvictPool((id) => {\n if (id && this.connections.has(id)) {\n this.connections.delete(id);\n }\n });\n }\n\n getConnection(config: ServerConfig): Pool {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n const existing = this.connections.get(id);\n info('# of instances:', this.connections.size);\n if (existing) {\n info('returning existing', id);\n return existing.pool;\n }\n const newOne = new NileDatabase(new Config(config), id);\n this.connections.set(id, newOne);\n info('created new', id);\n info('# of instances:', this.connections.size);\n return newOne.pool;\n }\n}\n","import { ServerConfig } from '../../types';\nimport { Config } from '../Config';\n\nexport const getServerId = (config: ServerConfig) => {\n const cfg = new Config(config);\n return makeServerId(cfg);\n};\nexport const makeServerId = (config: Config) => {\n return Buffer.from(JSON.stringify(config), 'base64').toString();\n};\n","import { Pool } from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport Auth from './auth';\nimport Users from './users';\nimport Tenants from './tenants';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport { getServerId, makeServerId } from './utils/Server';\n\ntype Api = {\n auth: Auth;\n users: Users;\n tenants: Tenants;\n};\n\nconst init = (config: Config): Api => {\n const auth = new Auth(config);\n const users = new Users(config);\n const tenants = new Tenants(config);\n return {\n auth,\n users,\n tenants,\n };\n};\n\nexport class Server {\n config: Config;\n api: Api;\n private manager: DbManager;\n private servers: Map<string, Server>;\n\n constructor(config?: ServerConfig) {\n this.config = new Config(config as ServerConfig);\n this.servers = new Map();\n this.api = init(this.config);\n this.manager = new DbManager(this.config);\n\n watchTenantId((tenantId) => {\n this.tenantId = tenantId;\n });\n\n watchUserId((userId) => {\n this.userId = userId;\n });\n\n watchToken((token) => {\n this.token = token;\n });\n }\n\n setConfig(cfg: Config) {\n this.config = new Config(cfg);\n }\n\n async init(cfg?: Config) {\n const updatedConfig = await this.config.configure({\n ...this.config,\n ...cfg,\n });\n this.setConfig(updatedConfig);\n this.manager = new DbManager(this.config);\n this.api = init(updatedConfig);\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.databaseId = val;\n this.api.auth.databaseId = val;\n this.api.users.databaseId = val;\n this.api.tenants.databaseId = val;\n }\n }\n\n get userId(): string | undefined | null {\n return this.config.userId;\n }\n\n set userId(userId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n\n this.config.userId = userId;\n\n if (this.api) {\n this.api.auth.userId = this.config.userId;\n this.api.users.userId = this.config.userId;\n this.api.tenants.userId = this.config.userId;\n }\n }\n\n get tenantId(): string | undefined | null {\n return this.config.tenantId;\n }\n\n set tenantId(tenantId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n this.config.tenantId = tenantId;\n\n if (this.api) {\n this.api.auth.tenantId = tenantId;\n this.api.users.tenantId = tenantId;\n this.api.tenants.tenantId = tenantId;\n }\n }\n\n get token(): string | undefined | null {\n return this.config?.api?.token;\n }\n\n set token(token: string | undefined | null) {\n if (token) {\n this.config.api.token = token;\n if (this.api) {\n this.api.auth.api.token = token;\n this.api.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): Pool {\n // only need to interact with the knex object\n return this.manager.getConnection(this.config);\n }\n\n /**\n * A utility function if you want to manage different NileDB instances yourself\n * returns the global Server object, an existing server that's already been configured,\n * or a new one if the config isn't in the cache\n */\n\n getInstance(config: ServerConfig): Server {\n const _config = { ...this.config, ...config };\n const serverId = getServerId(_config);\n const currentServerId = makeServerId(this.config);\n if (serverId === currentServerId) {\n return this;\n }\n const existing = this.servers.get(serverId);\n\n if (existing) {\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n existing.setConfig(updatedConfig);\n // propagage special config items\n existing.tenantId = updatedConfig.tenantId;\n existing.userId = updatedConfig.userId;\n existing.token = updatedConfig.api.token;\n existing.databaseId = updatedConfig.databaseId;\n return existing;\n }\n\n this.servers.set(serverId, new Server(_config));\n return this.servers.get(serverId) as unknown as Server;\n }\n}\n\nexport async function create(config?: ServerConfig): Promise<Server> {\n const server = new Server(config);\n return await server.init();\n}\n\nexport default create;\n","export * from './types';\nimport create from './Server';\n\nexport { Server } from './Server';\n\nexport default create;\n\nmodule.exports = create;\n"],"names":["Logger","config","_len","arguments","length","params","Array","_key","info","debug","_console","_len2","args","_key2","console","apply","concat","warn","_console2","_len3","_key3","error","_console3","_len4","_key4","getUsername","cfg","logger","user","String","process","env","NILEDB_USER","getPassword","password","NILEDB_PASSWORD","getToken","_config$api","_config$api2","_config$api3","api","token","NILEDB_TOKEN","getDatabaseName","databaseName","NILEDB_NAME","getBasePath","_config$api4","_config$api5","basePath","NILEDB_API","getDbHost","db","host","NILEDB_HOST","getDbPort","_config$db","_config$db2","port","Number","NILEDB_PORT","Events","ApiConfig","_createClass","_ref","cookieKey","this","_token","key","get","set","value","Config","_config$api$cookieKey2","_this","databaseId","_tenantId","_userId","configure","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_config$api$cookieKey","envVarConfig","_Logger","url","res","database","possibleError","json","message","_database","apiHost","dbHost","name","dburl","apiurl","wrap","_context","prev","next","abrupt","URL","searchParams","href","fetch","headers","Authorization","sent","clone","status","t0","text","Error","id","origin","_extends","stop","_x","NILEDB_ID","tenantId","NILEDB_TENANT","getTenantId","Boolean","userId","ResponseError","body","init","response","Response","eventer","Eventer","events","_proto","prototype","publish","eventName","callbackList","_step","_iterator","_createForOfIteratorHelperLoose","done","callback","subscribe","push","updateTenantId","Tenant","updateUserId","User","updateToken","val","Token","X_NILE_TENANT","X_NILE_USER_ID","getTokenFromCookie","_headers$get","cookie","split","_cookies","cookieParts","_cookie","slice","join","_step2","_iterator2","getTenantFromHttp","cookieTenant","getUserFromHttp","_headers$get2","decodeJwt","sub","_fetch","_x2","_x3","_fetch2","path","opts","_response$status","basicHeaders","useableUrl","errorHandler","msg","_message","Headers","includes","replace","encodeURIComponent","e","t1","t2","errors","Requester","_Config","call","post","req","request","_callee2","_context2","_x4","_x5","_x6","put","_ref3","_callee3","_context3","_x7","_x8","_x9","_inheritsLoose","rawRequest","_rawRequest","_callee4","method","_init","_context4","_x10","_x11","_x12","_x13","_request","_callee5","_headers","_context5","Request","JSON","stringify","undefined","isEmpty","isObject","Object","values","_x14","_x15","_x16","_x17","Auth","login","_requester","providerRes","providers","_this$api","tenants","tenant","URLSearchParams","listProviders","append","redirectURI","loginSSOUrl","loginUrl","jwt","loginSSO","redirectUrl","ssoLogin","_this$api2","accessToken","formData","provider","_this$tenantId","signUp","_this$api3","_token$token","_token$token2","signUpUrl","listTenantProviders","_ref4","listTenantProvidersUrl","createProvider","_ref5","updateProviderUrl","updateProvider","_ref6","_callee6","_context6","_ref7","_callee7","_body","_context7","providerUrl","email","getSSOCallbackUrl","param","providerName","Users","createTenantUser","tenantUsersUrl","listUsers","usersUrl","updateUser","listTenantUsers","me","meUrl","baseUrl","Tenants","createTenant","tenantsUrl","getTenant","tenantUrl","NileDatabase","pool","timer","poolConfig","min","max","idleTimeoutMillis","afterCreate","remaining","_objectWithoutPropertiesLoose","_excluded","Proxy","target","property","connectionString","caller","createProxyForPool","Pool","startTimeout","on","client","makeAfterCreate","err","_client","release","_this2","clearTimeout","setTimeout","end","EvictPool","_Logger2","conn","query","DBManager","connections","Map","cb","makeId","has","getConnection","existing","size","newOne","makeServerId","Buffer","from","toString","auth","users","Server","manager","servers","DbManager","setConfig","_init2","updatedConfig","getInstance","_config","serverId","getServerId","_this$config","create","_create","server","module","exports"],"mappings":"6nRAIwB,SAAAA,EACtBC,GACoB,IAAAC,IAAAA,EAAAC,UAAAC,OAAjBC,MAAiBC,MAAAJ,EAAAA,EAAAA,OAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAjBF,EAAiBE,EAAAJ,GAAAA,UAAAI,GAEpB,MAAO,CACLC,KAAI,WACF,GAAU,MAANP,GAAAA,EAAQQ,MAAO,CAAA,IAAA,IAAAC,EAAAC,EAAAR,UAAAC,OADbQ,EAAeN,IAAAA,MAAAK,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAfD,EAAeC,GAAAV,UAAAU,IAGnBH,EAAAI,SAAQN,KAAIO,MAAAL,EAAA,CAAC,YAAUM,OAAKX,EAAWO,GACzC,CACD,EACDK,KAAI,WACF,GAAU,MAANhB,GAAAA,EAAQQ,MAAO,CAAA,IAAA,IAAAS,EAAAC,EAAAhB,UAAAC,OADbQ,EAAeN,IAAAA,MAAAa,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAfR,EAAeQ,GAAAjB,UAAAiB,IAGnBF,EAAAJ,SAAQG,KAAIF,MAAAG,EAAA,CAAC,YAAUF,OAAKX,EAAWO,GACzC,CACD,EACDS,MAAK,WAAmB,IAAA,IAAAC,EAAAC,EAAApB,UAAAC,OAAfQ,EAAeN,IAAAA,MAAAiB,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAfZ,EAAeY,GAAArB,UAAAqB,IAEtBF,EAAAR,SAAQO,MAAKN,MAAAO,GAAC,WAAY,WAASN,OAAKX,EAAWO,GACrD,EAEJ,CCjBO,IAWMa,EAAc,SAACC,GAC1B,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OAERnB,EAASR,EAAOC,EAAQ,cAAxBO,KACR,OAAU,MAANP,GAAAA,EAAQ2B,MACVD,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAO2B,MACjCC,aAAO5B,SAAAA,EAAQ2B,QAExBD,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAIC,aACpCF,QAAQC,IAAIC,YACrB,EAEaC,EAAc,SAACP,GAC1B,IAAQzB,EAAmByB,EAAnBzB,OAGR,OADiBD,EAAOC,EAAQ,cACtB,MAANA,GAAAA,EAAQiC,SAGHL,OAAO5B,EAAOiC,UAIhBJ,QAAQC,IAAII,eACrB,EAMaC,EAAW,SAACV,GAAkB,IAAAW,EAGjBC,EAAAC,EAFhBtC,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,WAAxBO,KACR,OAAU6B,MAANpC,GAAAoC,OAAMA,EAANpC,EAAQuC,MAARH,EAAaI,OACfd,GAAUnB,EAAKmB,EAAQ,SAAoB,OAAZW,EAAErC,EAAOuC,UAAG,EAAVF,EAAYG,OACtCZ,OAAOU,OAADA,EAACtC,EAAOuC,UAAPD,EAAAA,EAAYE,QAExBX,QAAQC,IAAIW,cACdf,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAIW,cACpCZ,QAAQC,IAAIW,mBAFrB,CAKF,EAEaC,EAAkB,SAACjB,GAC9B,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,kBAAxBO,KACR,OAAU,MAANP,GAAAA,EAAQ2C,cACVjB,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAO2C,cACjCf,OAAO5B,EAAO2C,eAEnBd,QAAQC,IAAIc,aACdlB,GAAUnB,EAAKmB,EAAQ,SAAUG,QAAQC,IAAIc,aACtCf,QAAQC,IAAIc,aAEd,IACT,EAkBaC,EAAc,SAACpB,GAAkB,IAAAqB,EAI9BC,EAHN/C,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,cAAxBO,KACFyC,EAAiB,MAANhD,GAAW,OAAL8C,EAAN9C,EAAQuC,UAAG,EAAXO,EAAaE,SAC9B,OAAIA,GACFtB,GAAUnB,EAAKmB,EAAQ,SAAgB,MAAN1B,UAAM+C,EAAN/C,EAAQuC,YAARQ,EAAaC,UACvCA,GAGLnB,QAAQC,IAAImB,YACdvB,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAImB,YAC3C,WAAkBpB,QAAQC,IAAImB,aAGhCvB,GAAUnB,EAAKmB,EAAQ,UAAWG,QAAQC,IAAImB,YACvC,0BACT,EAEM,SAAUC,EAAUzB,GACxB,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,aAAxBO,KAER,OAAIP,MAAAA,GAAAA,EAAQmD,IAAMnD,EAAOmD,GAAGC,MAC1B1B,GAAUnB,EAAKmB,EAAQ,SAAgB,MAAN1B,OAAM,EAANA,EAAQmD,GAAGC,MACrCpD,EAAOmD,GAAGC,MAGfvB,QAAQC,IAAIuB,aACd3B,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAIuB,aACpCxB,QAAQC,IAAIuB,cAGrB3B,GAAUnB,EAAKmB,EAAQ,UAAW,kBAC3B,iBACT,CAEM,SAAU4B,EAAU7B,GAAc,IAAA8B,EAGUC,EAFxCxD,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,aAAxBO,KACR,OAAUgD,MAANvD,GAAAuD,OAAMA,EAANvD,EAAQmD,KAARI,EAAYE,MAA0B,MAAlBzD,EAAOmD,GAAGM,MAChC/B,GAAUnB,EAAKmB,EAAQ,SAAgB,MAAN1B,OAAM,EAANA,EAAQmD,GAAGM,MACrCC,OAAOF,OAADA,EAACxD,EAAOmD,SAAPK,EAAAA,EAAWC,OAGvB5B,QAAQC,IAAI6B,aACdjC,GAAUnB,EAAKmB,EAAQ,SAAUG,QAAQC,IAAI6B,aACtCD,OAAO7B,QAAQC,IAAI6B,eAE5BjC,GAAUnB,EAAKmB,EAAQ,UAAW,MAC3B,KACT,CCjImB,ICbdkC,EDuBCC,EAAS,WAgBZ,OAAAC,GAZD,SAAAC,GAQC,IAPCf,EAAQe,EAARf,SACAgB,EAASD,EAATC,UACAxB,EAAKuB,EAALvB,MAAKyB,KANAD,eAAS,EAAAC,KACTjB,cAAQ,EAAAiB,KACPC,YAAM,EAUZD,KAAKjB,SAAWA,EAChBiB,KAAKD,UAAYA,EACjBC,KAAKC,OAAS1B,CAChB,GAAC,CAAA,CAAA2B,IAAA,QAAAC,IAED,WACE,OAAOH,KAAKC,MACb,EAAAG,IAED,SAAiBC,GACfL,KAAKC,OAASI,CAChB,IAAC,CAxBY,GA2BFC,EAAM,WA6DhB,OAAAT,GA9BD,SAAY9D,GAAoB,IAAAwE,EAAAnC,EAAAoC,EAAAR,KAAAA,KA9BhCtC,UAAI,EAAAsC,KACJhC,cAAQ,EAAAgC,KACRS,gBAAU,EAAAT,KACVtB,kBAAY,EAAAsB,KAEZzD,WAAK,EAAAyD,KAELd,QAAE,EAAAc,KAEF1B,SAAG,EAAA0B,KAEKU,eAAS,EAAAV,KACTW,aAAO,EAAAX,KAkDfY,UAAS,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EAAOlF,GAAoB,IAAAmF,EAAA/C,EAAAgD,EAAAhC,EAAAiC,EAAA9E,EAAAa,EAAA4B,EAAAS,EAAAd,EAAA2C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAjB,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAKlB,GADfjD,EAAOF,EAHLkC,EAA0B,CAC9BpF,OAAAA,IAEgCqF,EACVtF,EAAOC,EAAQ,UAA/BO,EAAI8E,EAAJ9E,KAAMa,EAAKiE,EAALjE,QAEVgC,GAAQqB,EAAK9B,cAAgB8B,EAAKC,YAAU,CAAAyB,EAAAE,KAAA,EAAA,KAAA,CACF,OAA5C9F,EAAK,uCAAuC4F,EAAAG,OAAA,SACrC7B,GAAI,KAAA,EAWE,OARXzB,EAAWH,EAAYuC,GACrB3B,EAAOH,EAAU8B,GAEjBzC,EAAeD,EAAgB,CAAE1C,OAAAA,EAAQ0B,OAAQ,YACjD4D,EAAM,IAAIiB,IAAOvD,0BACnBL,GACF2C,EAAIkB,aAAanC,IAAI,eAAgB1B,GAEvCpC,EAAK+E,EAAImB,MAAMN,EAAAE,KAAA,GACGK,MAAMpB,EAAK,CAC3BqB,QAAS,CACPC,cAAa,WD5FSnF,EC4FiB,CAAEzB,OAAAA,GD3FrCwB,EAAYC,OAAQO,EAAYP,OC6FtC,KAAA,GAE+B,OAA3BgE,GANAF,EAAGY,EAAAU,MAMiBC,QAAOX,EAAAC,KAAA,GAAAD,EAAAE,KAAA,GAEFd,EAAIG,OAAM,KAAA,GAAjCA,EAAIS,EAAAU,KACS,MAAftB,EAAIwB,QACNxG,EAAK,2CAGLiF,EADEE,EAAKqB,QAA0B,UAAhBrB,EAAKqB,OACX,CAAEpB,QAAS,6BAEXD,EACZS,EAAAE,KAAA,GAAA,MAAA,KAAA,GAAA,OAAAF,EAAAC,KAAA,GAAAD,EAAAa,GAAAb,EAAA,MAAA,IAAAA,EAAAE,KAAA,GAEqBZ,EAAcwB,OAAM,KAAA,GAC1C7F,EADMuE,EAAOQ,EAAAU,MAEbrB,EAAW,CAAEG,QAAAA,GAAsB,KAAA,GAGF,GADnCpF,EAAK,qBAAsBiF,KAErB,YAAaA,GAAQ,CAAAW,EAAAE,KAAA,GAAA,KAAA,CAAA,KACnB,eAAgBb,GAAQ,CAAAW,EAAAE,KAAA,GAAA,KAAA,CACV,MAAhBjF,EAAMoE,GACA,IAAI0B,MAAM,0BAAyB,KAAA,GAAA,MAEnC,IAAIA,MACR,8GACD,KAAA,GAGmB,iBAAb1B,IACDK,GADwBD,EACMJ,GAA9BK,QAASC,EAAMF,EAANE,OAAQC,EAAIH,EAAJG,KACzBtB,EAAKC,WAD4BkB,EAAFuB,GAE/B1C,EAAK9B,aAAeoD,EACdC,EAAQ,IAAIO,IAAIT,GAChBG,EAAS,IAAIM,IAAIV,GACvBzC,EAAO4C,EAAM5C,KACbJ,EAAWiD,EAAOmB,QACnB,KAAA,GAewB,OAb3B3C,EAAKlC,IAAM,IAAIsB,EAAU,CACvBb,SAAAA,EACAgB,UAAiCmB,OAAxBA,EAAQ,MAANnF,UAAMoC,EAANpC,EAAQuC,YAARH,EAAa4B,WAASmB,EAAI,QACrC3C,MAAOL,EAAS,CAAEnC,OAAAA,MAEpByE,EAAKtB,GAAEkE,EAAA,CACL1F,KAAM8C,EAAK9C,KACXM,SAAUwC,EAAKxC,SACfmB,KAAAA,EACAK,KAAAA,EACA+B,SAAUf,EAAK9B,cACW,iBAAf3C,MAAAA,OAAAA,EAAAA,EAAQmD,IAAkBnD,EAAOmD,GAAK,CAAE,GAErD5C,EAAK,eAAgBkE,GAAM0B,EAAAG,OAAA,SACpB7B,GAAI,KAAA,GAAA,IAAA,MAAA,OAAA0B,EAAAmB,ODpJc,IAAC7F,CCoJf,GAAAyD,EAAA,KAAA,CAAA,CAAA,GAAA,KACZ,KAAA,OAAA,SAAAqC,GAAA,OAAAzC,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CAhFQ,GA/BP,ID3EyBuB,EACnBzB,EAAQ0B,EAERnB,ECwEA6E,EAA0B,CAAEpF,OAAAA,GAElCiE,KAAKS,YD5EShD,GADWD,EC6EM2D,GD5EjB1D,OAERnB,EAASR,EAFTC,EAAmByB,EAAnBzB,OAEwB,gBAAxBO,KACE,MAANP,GAAAA,EAAQ0E,YACVhD,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAO0E,YACjC9C,aAAO5B,SAAAA,EAAQ0E,cAExBhD,GAAUnB,EAAKmB,EAAQ,MAAOG,QAAQC,IAAI0F,WACnC3F,QAAQC,IAAI0F,YCqEjBvD,KAAKtC,KAAOH,EAAY4D,GACxBnB,KAAKhC,SAAWD,EAAYoD,GAC5BnB,KAAKtB,aAAeD,EAAgB0C,GACpCnB,KAAKU,UDZkB,SAAClD,GAC1B,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,cAAxBO,KACR,OAAU,MAANP,GAAAA,EAAQyH,UACV/F,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAOyH,UACjCzH,EAAOyH,UAGZ5F,QAAQC,IAAI4F,eACdhG,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAI4F,eACpC7F,QAAQC,IAAI4F,eAGd,IACT,CCFqBC,CAAYvC,GAC7BnB,KAAKzD,MAAQoH,QAAQ5H,MAAAA,OAAAA,EAAAA,EAAQQ,OAC7ByD,KAAKW,QAAU5E,MAAAA,OAAAA,EAAAA,EAAQ6H,OAEvB,IAAM7E,EAAWH,EAAYuC,GACvBhC,EAAOF,EAAUkC,GACjB3B,EAAOH,EAAU8B,GAEvBnB,KAAK1B,IAAM,IAAIsB,EAAU,CACvBb,SAAAA,EACAgB,UAAiCQ,OAAxBA,EAAQ,MAANxE,UAAMqC,EAANrC,EAAQuC,YAARF,EAAa2B,WAASQ,EAAI,QACrChC,MAAOL,EAAS,CAAEnC,OAAAA,MAEpBiE,KAAKd,GAAEkE,EAAA,CACL1F,KAAMsC,KAAKtC,KACXM,SAAUgC,KAAKhC,SACfmB,KAAAA,EACAK,KAAAA,GAC0B,iBAAfzD,MAAAA,OAAAA,EAAAA,EAAQmD,IAAkBnD,EAAOmD,GAAK,CAAE,GAEjDc,KAAKtB,eACPsB,KAAKd,GAAGqC,SAAWvB,KAAKtB,aAE5B,GAAC,CAAA,CAAAwB,IAAA,WAAAC,IA9CD,WACE,OAAOH,KAAKU,SACb,EAAAN,IAED,SAAoBC,GAClBL,KAAKU,UAAYL,CACnB,GAAC,CAAAH,IAAA,SAAAC,IAED,WACE,OAAOH,KAAKW,OACb,EAAAP,IAED,SAAkBC,GAChBL,KAAKW,QAAUN,CACjB,IAAC,CA7BgB,GEpDNwD,EAEX,SAAYC,EAAwBC,GAAmB/D,KADvDgE,cAAQ,EAENhE,KAAKgE,SAAW,IAAIC,SAASH,EAAMC,EACrC,GDFF,SAAKpE,GACHA,EAAA,KAAA,SACAA,EAAA,OAAA,WACAA,EAAA,MAAA,QACAA,EAAA,UAAA,WACD,CALD,CAAKA,IAAAA,EAKJ,CAAA,IAAA,IA8BKuE,EAAU,IA7BH,WAEX,SAAAC,IAAAnE,KADAoE,YAAM,EAEJpE,KAAKoE,OAAS,EAChB,CAAC,IAAAC,EAAAF,EAAAG,UAqBA,OArBAD,EACDE,QAAA,SAAQC,EAAmBnE,GAEzB,IAAMoE,EAAezE,KAAKoE,OAAOI,GAGjC,GAAIC,EACF,IAAA,IAAmCC,EAAnCC,EAAAC,EAAuBH,KAAYC,EAAAC,KAAAE,OACjCC,EADiBJ,EAAArE,OACRA,EAGf,EACAgE,EACAU,UAAA,SAAUP,EAAmBM,GAEtB9E,KAAKoE,OAAOI,KACfxE,KAAKoE,OAAOI,GAAa,IAI3BxE,KAAKoE,OAAOI,GAAWQ,KAAKF,IAC7BX,CAAA,CAzBU,IA+BAc,EAAiB,SAACzB,GAC7BU,EAAQK,QAAQ5E,EAAOuF,OAAQ1B,EACjC,EAKa2B,EAAe,SAACvB,GAC3BM,EAAQK,QAAQ5E,EAAOyF,KAAMxB,EAC/B,EAIayB,EAAc,SAACC,GAC1BpB,EAAQK,QAAQ5E,EAAO4F,MAAOD,EAChC,EE7CaE,EAAgB,kBAChBC,EAAiB,gBAc9B,SAASC,EAAmBhD,EAAkB3C,GAAwB,IAAA4F,EAC9DC,SAAMD,EAAGjD,EAAQvC,IAAI,kBAAZwF,EAAuBE,MAAM,MACtCC,EAAmC,CAAA,EACzC,GAAIF,EACF,IAAA,IAA0BlB,EAA1BC,EAAAC,EAAoBgB,KAAMlB,EAAAC,KAAAE,MAAE,CAAA,IACpBkB,EADQrB,EAAArE,MACYwF,MAAM,KAC1BG,EAAUD,EAAYE,MAAM,GAAGC,KAAK,KAE1CJ,EADaC,EAAY,IACRC,CACnB,CAGF,GAAIJ,EACF,IAAA,IAA0BO,EAA1BC,EAAAxB,EAAoBgB,KAAMO,EAAAC,KAAAvB,MAAE,CAAA,IACpBkB,EADQI,EAAA9F,MACYwF,MAAM,KAC1BG,EAAUD,EAAYE,MAAM,GAAGC,KAAK,KAE1CJ,EADaC,EAAY,IACRC,CACnB,CAEF,OAAIjG,EACK+F,EAAS/F,GAEX,IACT,CACgB,SAAAsG,EAAkB3D,EAAkB3G,GAAc,IAAA+D,EAC1DwG,EAAeZ,EAAmBhD,EAAS,YACjD,OAAkD,OAAlD5C,QAAOwG,EAAAA,EAAgB5D,MAAAA,OAAAA,EAAAA,EAASvC,IAAIqF,IAAc1F,EAAI/D,EAAOyH,QAC/D,CAEgB,SAAA+C,EAAgB7D,EAAkB3G,GAAc,IAAAyK,EACxDjI,EAAQmH,EAAmBhD,EAAS3G,EAAOuC,IAAIyB,WACrD,OAAIxB,EACUkI,YAAUlI,GACXmI,IAEsBF,OAAnCA,EAAc,MAAP9D,OAAO,EAAPA,EAASvC,IAAIsF,IAAee,EAAIzK,EAAO6H,MAChD,CAEA,SAAsB+C,EAAMrD,EAAAsD,EAAAC,GAAA,OAAAC,EAAAjK,MAAAmD,KAAA/D,UAAA,CAwG3B,SAAA6K,IAAA,OAAAA,EAAAhG,EAAAC,IAAAC,MAxGM,SAAAC,EACLlF,EACAgL,EACAC,GAAkB,IAAA7I,EAAAC,EAAA6I,EAAA7F,EAAA9E,EAAAa,EAAAkE,EAAAtB,EAAA2C,EAAAwE,EAAA3I,EAAAiF,EAAAI,EAAAuD,EAAAnD,EAAA1C,EAAA8F,EAAAC,EAAA3F,EAAA4F,EAAA,OAAAvG,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAsBG,GAtBHhB,EAEMtF,EAAOC,EAAQ,YAA/BO,EAAI8E,EAAJ9E,KAAMa,EAAKiE,EAALjE,MAERkE,EAAG,IAAgB,OAAhBlD,EAAMpC,EAAOuC,UAAG,EAAVH,EAAYY,UAAWgI,EAChChH,EAAsB,OAAb3B,EAAGrC,EAAOuC,UAAG,EAAVF,EAAY2B,UACxB2C,EAAU,IAAI6E,QAAQP,MAAAA,OAAAA,EAAAA,EAAMtE,UAC5BwE,EAAe,IAAIK,SACZnH,IAAI,eAAgB,mCACdsC,EAAQvC,IAAI,oBAEvB5B,EAAQmH,EAAmBhD,EAAS3C,IAExCmH,EAAa9G,IAAI,gBAAe,UAAY7B,GACnCL,EAAS,CAAEnC,OAAAA,KACpBmL,EAAa9G,IAAI,gBAAe,UAAYlC,EAAS,CAAEnC,OAAAA,MAIrDyH,EAAW6C,EAAkB3D,EAAS3G,GAC5CkJ,EAAezB,GACTI,EAAS2C,EAAgB7D,EAAS3G,GACxCoJ,EAAavB,IACTvC,EAAImG,SAAS,eAAkBhE,EAAQ,CAAAtB,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OAAA,SAClC,IAAIwB,EAAc,kCAAmC,CAC1Df,OAAQ,OACR,KAAA,GAMwB,OAJtBqE,EAAa9F,EAChBoG,QAAQ,aAAcC,mBAAmB/J,OAAO6F,KAChDiE,QAAQ,WAAYC,mBAAmB/J,OAAOiG,KAEjDtH,EAAK,UAAW6K,GAAYjF,EAAAE,KAAA,GAELK,MAAM0E,EAAU/D,KAClC4D,EAAI,CACPtE,QAASwE,KACT,OAAO,SAACS,GACRxK,EAAM,UAAW,aAAcwK,EACjC,IAAE,KAAA,GALY,MAAR3D,EAAQ9B,EAAAU,OAOEoB,EAASlB,QAAU,KAAOkB,EAASlB,OAAS,KAAG,CAAAZ,EAAAE,KAAA,GAAA,KAAA,CAAA,GAC/B,mBAAnB4B,EAASnB,MAAoB,CAAAX,EAAAE,KAAA,GAAA,KAAA,CAClC,OADkCF,EAAAa,GACtCzG,EAAI4F,EAAAE,KAAA,GAAgC4B,EAASnB,QAAQpB,OAAM,KAAA,GAAAS,EAAA0F,GAAA1F,EAAAU,MAAA,EAAAV,EAAAa,IAAtD,UAAW,aAAYb,EAAA0F,IAAA,KAAA,GAAA,OAAA1F,EAAAG,OAAA,SAEvB2B,GAAQ,KAAA,GAML,OAFNoD,EACuB,mBAApBpD,MAAAA,OAAAA,EAAAA,EAAUnB,OAAuBmB,EAASnB,QAAU,KACzDwE,EAAM,GAAEnF,EAAAC,KAAA,GAAAD,EAAAE,KAAA,GAEG4B,MAAAA,OAAAA,EAAAA,EAAuBvC,OAAM,KAAA,GAA1CH,EAAGY,EAAAU,KAAAV,EAAAE,KAAA,GAAA,MAAA,KAAA,GAAA,GAAAF,EAAAC,KAAA,GAAAD,EAAA2F,GAAA3F,EAAA,MAAA,KAECkF,EAAY,CAAAlF,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GACFgF,EAAapE,OAAM,KAAA,IAA/BqE,EAAGnF,EAAAU,OAEDzF,EAAM,UAAW,aAAY,YAAciK,EAAatE,OAAWuE,IAAAA,GACpE,KAAA,GAEEA,GACHlK,EAAM,UAAW,aAAY+E,EAAA2F,IAC9B,KAAA,GAAA,IAECR,EAAG,CAAAnF,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OAAA,SACE,IAAIwB,EAAcwD,EAAK,CAAEvE,OAAQsE,MAAAA,OAAAA,EAAAA,EAActE,UAAS,KAAA,GAAA,IAG7DxB,KAAO,YAAaA,GAAG,CAAAY,EAAAE,KAAA,GAAA,KAAA,CAOvB,OALFjF,EACE,UACA,aACYiK,aAAAA,MAAAA,OAAAA,EAAAA,EAActE,QAC1BpB,IALMA,EAAYJ,EAAZI,SAMNQ,EAAAG,OAAA,SACK,IAAIwB,EAAcnC,EAAS,CAAEoB,OAAQ,OAAM,KAAA,GAAA,IAEhDxB,KAAO,WAAYA,GAAG,CAAAY,EAAAE,KAAA,GAAA,KAAA,CAStB,OALFjF,EACE,UACA,aACYiK,aAAAA,MAAAA,OAAAA,EAAAA,EAActE,QAC1BpB,IANSA,EACPJ,EADFwG,OAAgB,IAOhB5F,EAAAG,OAAA,SACK,IAAIwB,EAAcnC,EAAS,CAAEoB,OAAQ,OAAM,KAAA,GAQlD,OALF3F,EACE,UACA,aACYiK,aAAAA,MAAAA,OAAAA,EAAAA,EAActE,QAC1B,IAAA,mBACAZ,EAAAG,OAAA,SACK,IAAIwB,EAAc,KAAM,CAC7Bf,OAAsCmE,OAAhCA,EAAwB,MAArBjD,OAAqB,EAArBA,EAAuBlB,QAAMmE,EAAI,OAC1C,KAAA,GAAA,IAAA,MAAA,OAAA/E,EAAAmB,OAAA,GAAApC,EAAA,KAAA,CAAA,CAAA,GAAA,KACH,MAAApE,MAAAmD,KAAA/D,UAAA,CClKgD,IAK5B8L,WAAaC,GAChC,SAAAD,EAAYhM,GAAc,IAAAyE,EAgHzB,OA/GCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAyFfkI,KAAI,WAAA,IAAApI,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACLkH,EACA9G,EACA0C,GAAkB,OAAAhD,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EAEL5B,EAAK4H,QAAQ,OAAQ/G,EAAK8G,EAAKpE,GAAK,KAAA,EAAA,OAAA7B,EAAAG,OAAAH,SAAAA,EAAAU,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAV,EAAAmB,OAAA,GAAApC,EAClD,KAAA,OAAA,SAAAqC,EAAAsD,EAAAC,GAAA,OAAA/G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANG,GAMHuE,EAEDL,IAAG,WAAA,IAAAU,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACJF,EACA9G,EACA0C,GAAkB,OAAAhD,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAAA,OAAAkG,EAAAlG,KAAA,EAEL5B,EAAK4H,QAAQ,MAAO/G,EAAK8G,EAAKpE,GAAK,KAAA,EAAA,OAAAuE,EAAAjG,OAAAiG,SAAAA,EAAA1F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA0F,EAAAjF,OAAA,GAAAgF,EACjD,KAAA,OAAA,SAAAE,EAAAC,EAAAC,GAAA,OAAA5H,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANE,GAMFuE,EAEDkI,IAAG,WAAA,IAAAC,EAAA7H,EAAAC,IAAAC,MAAG,SAAA4H,EACJT,EACA9G,EACA0C,GAAkB,OAAAhD,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAAA,OAAAyG,EAAAzG,KAAA,EAEL5B,EAAK4H,QAAQ,MAAO/G,EAAK8G,EAAKpE,GAAK,KAAA,EAAA,OAAA8E,EAAAxG,OAAAwG,SAAAA,EAAAjG,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAiG,EAAAxF,OAAA,GAAAuF,EACjD,KAAA,OAAA,SAAAE,EAAAC,EAAAC,GAAA,OAAAL,EAAA9L,MAAAmD,KAAA/D,UAAA,CAAA,CANE,GAMFuE,CA9GD,CAACyI,EAAAlB,EAAAC,GAAA,IAAA3D,EAAA0D,EAAAzD,UAsFA,OAtFAD,EAEK6E,WAAU,WAAA,IAAAC,EAAArI,EAAAC,IAAAC,MAAhB,SAAAoI,EACEC,EACAhI,EACA0C,EACAD,GAAa,IAAAwF,EAAAhI,EAAA,OAAAP,IAAAkB,MAAA,SAAAsH,GAAA,cAAAA,EAAApH,KAAAoH,EAAAnH,MAAA,KAAA,EAKL,OAHFkH,EAAKlG,EAAA,CAAA,EACNW,EAAI,CACPD,KAAAA,EACAuF,OAAAA,IAAME,EAAAnH,KAAA,EAGUuE,EAAO3G,KAAMqB,EAAKiI,GAAM,KAAA,EAAjC,MAAHhI,EAAGiI,EAAA3G,gBAEUiB,GAAa,CAAA0F,EAAAnH,KAAA,EAAA,KAAA,CAAA,OAAAmH,EAAAlH,OACvBf,SAAAA,EAAI0C,UAAQ,KAAA,EAAA,OAAAuF,EAAAlH,OAAA,SAGdf,GAAG,KAAA,EAAA,IAAA,MAAA,OAAAiI,EAAAlG,OAAA,GAAA+F,EAAApJ,KACX,KAAA,OAAA,SAAAwJ,EAAAC,EAAAC,EAAAC,GAAA,OAAAR,EAAAtM,MAAAmD,KAAA/D,UAAA,CAAA,CAnBe,GAqBhBoI,EAWgB+D,QAAO,WAAA,IAAAwB,EAAA9I,EAAAC,IAAAC,MAAb,SAAA6I,EACRR,EACAhI,EACA8G,EACApE,GAAkB,IAAArB,EAAAc,EAAAoC,EAAAkE,EAAApJ,EAAAsF,EAAAlC,EAAAwF,EAAA,OAAAvI,IAAAkB,MAAA,SAAA8H,GAAA,cAAAA,EAAA5H,KAAA4H,EAAA3H,MAAA,KAAA,EA4BlB,GAzBMM,EAAU,IAAI6E,QAAQxD,EAAOA,MAAAA,OAAAA,EAAAA,EAAMrB,QAAU,CAAA,GAC/CyF,aAAeZ,SACX/D,EAAW2E,EAAIhI,IAAIqF,GACnBI,EAASuC,EAAIhI,IAAI,UACnBqD,GACFd,EAAQtC,IAAIoF,EAAehC,GAEzBoC,GACFlD,EAAQtC,IAAI,SAAUwF,IAEfuC,aAAe6B,UAElBF,EAAW,IAAIvC,QAAQY,MAAAA,OAAAA,EAAAA,EAAKzF,SAC5Bc,EAAWsG,EAAS3J,IAAIqF,GACxBI,EAASkE,EAAS3J,IAAI,UACxBqD,GACFd,EAAQtC,IAAIoF,EAAehC,GAEzBoC,GACFlD,EAAQtC,IAAI,SAAUwF,IAItB9B,EAA2BmG,KAAKC,UAAU/B,GAG/B,QAAXkB,EAAgB,CAAAU,EAAA3H,KAAA,EAAA,KAAA,CAClB0B,OAAOqG,EAAUJ,EAAA3H,KAAA,GAAA,MAAA,KAAA,EAAA,KACR+F,aAAe6B,SAAO,CAAAD,EAAA3H,KAAA,GAAA,KAAA,CAAA,OAAA2H,EAAA3H,KAAA,GAClB,IAAI6B,SAASkE,EAAIrE,MAAMd,OAAM,KAAA,GAA1Cc,EAAIiG,EAAAnH,KAAAmH,EAAA3H,KAAA,GAAA,MAAA,KAAA,IAGJ+F,aAAeZ,SACf6C,EAAQjC,IACPkC,EAASlC,IAAsC,IAA9BmC,OAAOC,OAAOpC,GAAKjM,UAErC4H,OAAOqG,GACR,KAAA,GAIQ,OAFHb,EAAKlG,EAAA,CAAA,EACNW,EAAI,CACPrB,QAAAA,IAAOqH,EAAA3H,KAAA,GAGIpC,KAAKkJ,WAAWG,EAAQhI,EAAKiI,EAAOxF,GAAK,KAAA,GAAA,OAAAiG,EAAA1H,OAAA0H,SAAAA,EAAAnH,MAAA,KAAA,GAAA,IAAA,MAAA,OAAAmH,EAAA1G,OAAA,GAAAwG,EAAA7J,KACvD,KAAA,OAAA,SAAAwK,EAAAC,EAAAC,EAAAC,GAAA,OAAAf,EAAA/M,MAAAmD,KAAA/D,UAAA,CAAA,CApDsB,GAoDtB8L,CAAA,EAzFuCzH,GCqBrBsK,WAAK5C,GACxB,SAAA4C,EAAY7O,GAAc,IAAAyE,EAoNzB,OAnNCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAMf6K,MAAK,WAAA,IAAA/K,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACNkH,EACApE,GAAkB,IAAArB,EAAAoI,EAAAC,EAAAC,EAAA1J,EAAA2J,EAAA1M,EAAAqH,EAAAsF,EAAAC,EAAA3H,EAAA,OAAAzC,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAUW,GARvBM,EAAU,IAAI6E,QAAQ,CAAE,eAAgB,qBACxCuD,EAAa,IAAI/C,EAASvH,GASpB,UANV2H,aAAe6B,QACX,IAAI1H,IAAI6F,EAAI9G,KAAKkB,aACjB,IAAI6I,iBAESjL,IAAI,OAEL,CAAA+B,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,EACU5B,EAAK6K,cAC5BlD,EAAgBtF,QACjBkB,GACD,KAAA,EAHgB,MAAXgH,EAAW7I,EAAAU,OAOfmI,EAAYjI,QAAU,KACtBiI,EAAYjI,OAAS,KAAG,CAAAZ,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GAEA,IAAI6B,SAAS8G,EAAYjH,MAAMrC,OAAM,KAAA,GAA9C,MAATuJ,EAAS9I,EAAAU,MACD1G,OAAS,GAAC,CAAAgG,EAAAE,KAAA,GAAA,KAAA,CAAA,KAClB4I,EAAU9O,OAAS,GAAC,CAAAgG,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OAAA,SACf,IAAI4B,SAASgG,KAAKC,UAAUc,GAAY,CAAElI,OAAQ,OAAM,KAAA,GAUjE,OALAJ,EAAQtC,IAAIoF,EAAewF,EAAU,GAAGxH,UACxCd,EAAQ4I,OACN,aACYN,YAAAA,EAAU,GAAGxH,SAAQ,uBAEnCtB,EAAAG,OACO,SAAA,IAAI4B,SACTgG,KAAKC,UAAU,CACbqB,YAAW,GAAK/K,EAAKlC,IAAIS,SAAWyB,EAAKgL,YAAY,UAEvD,CAAE1I,OAAQ,OACX,KAAA,GAAA,OAAAZ,EAAAE,KAAA,GAOW0I,EAAW5C,KAAKC,EAAK3H,EAAKiL,SAAU1H,GAAK,OAAO,SAAC4D,GAGjE,OADA/K,QAAQO,MAAMwK,GACPA,CACT,IAAE,KAAA,GAJO,MAAHrG,EAAGY,EAAAU,gBAKUiB,GAAa,CAAA3B,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OACvBf,SAAAA,EAAI0C,UAAQ,KAAA,GAAA,KAEjB1C,GAAOA,EAAIwB,QAAU,KAAOxB,EAAIwB,OAAS,KAAG,CAAAZ,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GACPd,EAAIG,OAAM,KAAA,GAQpB,OAPvBmE,GAAoB,OAAdqF,EAAMzK,EAAKlC,UAAG,EAAR2M,EAAUlL,WAAaxB,KADnCA,EAAK2D,EAAAU,MACoCrE,MAAMmN,IAAG,oCACxDhJ,EAAQ4I,OAAO,aAAc1F,GAEvBuF,EAAgB,OADdD,EAAY3M,EAAZ2M,cACc,EAAPA,EAASX,SAClB/G,EAAW2H,MAAAA,OAAAA,EAAAA,EAAQ/I,OAAO/B,MAChCqC,EAAQtC,IAAIoF,EAAehC,GAC3Bd,EAAQ4I,OAAO,aAA0B9H,YAAAA,yBACzC6B,EAAY9G,EAAMA,MAAMmN,KAAKxJ,EAAAG,OAAA,SAEtB,IAAI4B,SAASgG,KAAKC,UAAU3L,GAAQ,CAAEuE,OAAQ,IAAKJ,QAAAA,KAAU,KAAA,GAAA,OAAAR,EAAAE,KAAA,GAEnDd,EAAI0B,OAAM,KAAA,GAAnB,OAAAd,EAAAG,OAAA,SACH,IAAI4B,SADD/B,EAAAU,KACgB,CAAEE,OAAQxB,EAAIwB,UAAS,KAAA,GAAA,IAAA,MAAA,OAAAZ,EAAAmB,OAAA,GAAApC,EAClD,KAAA,OAAAqC,SAAAA,EAAAsD,GAAA,OAAA9G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CA1EI,GA0EJuE,EAEDmL,SAAW,SAACC,GACV,IAAMC,EAAQ,WAAA,IAAAhL,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACfF,GAAyB,IAAA2D,EAAApJ,EAAAoB,EAAAiI,EAAAvI,EAAAoC,EAAA,OAAA7E,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAEI,OAAvBM,EAAU,IAAI6E,QAASe,EAAAlG,KAAA,EACT+F,EAAgB6D,WAAU,KAAA,EAApC,OAAJlI,EAAIwE,EAAA1F,KAAA0F,EAAAlG,KAAA,EACiB0B,EAAK3D,IAAI,gBAAe,KAAA,EAAlC,OAAX4L,EAAWzD,EAAA1F,KAAA0F,EAAAlG,KAAA,EACO0B,EAAK3D,IAAI,YAAW,KAAA,EAMP,OAN/BqD,EAAQ8E,EAAA1F,KACRgD,GAAoB,OAAdkG,EAAMtL,EAAKlC,UAAG,EAARwN,EAAU/L,WAAS,IAAIgM,EAAW,oCACpD1G,EAAY0G,GACZrJ,EAAQ4I,OAAO,aAAc1F,GAC7BlD,EAAQtC,IAAIoF,EAAehC,GAC3Bd,EAAQ4I,OAAO,aAA0B9H,YAAAA,yBACzCd,EAAQtC,IAAI,WAAYwL,GAAatD,EAAAjG,OAAA,SAC9B,IAAI4B,SAAS,KAAM,CACxBvB,QAAAA,EACAI,OAAQ,OACR,KAAA,GAAA,IAAA,MAAA,OAAAwF,EAAAjF,OAAA,GAAAgF,EACH,KAAA,OAjBKwD,SAAQhF,GAAA,OAAAhG,EAAAhE,MAAAmD,KAAA/D,UAAA,EAAA,GAkBd,OAAO4P,GACRrL,EAEDgL,YAAc,SAACS,GAAoB,IAAAC,EACjC,MAAA,cAAqBxE,mBAAmBlH,EAAKC,YAAWyL,aACzC,OADyCA,EACtD1L,EAAKgD,UAAQ0I,EAAI,sCACKD,EAAQ,UACjCzL,EAMD2L,OAAM,WAAA,IAAAxD,EAAA7H,EAAAC,IAAAC,MAAG,SAAA4H,EACPT,EACApE,GAAkB,IAAArB,EAAAoI,EAAAxJ,EAAA8K,EAAAC,EAAAC,EAAA/N,EAAAqH,EAAA1C,EAAA,OAAAnC,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAGoB,OADhCM,EAAU,IAAI6E,QACduD,EAAa,IAAI/C,EAASvH,GAAMqI,EAAAzG,KAAA,EACpB0I,EAAW5C,KAAKC,EAAK3H,EAAK+L,UAAWxI,GAAK,OAAO,SAAC4D,GAGlE,OADA/K,QAAQO,MAAMwK,GACPA,CACT,IAAE,KAAA,EAJO,MAAHrG,EAAGuH,EAAAjG,gBAKUiB,GAAa,CAAAgF,EAAAzG,KAAA,EAAA,KAAA,CAAA,OAAAyG,EAAAxG,OACvBf,SAAAA,EAAI0C,UAAQ,KAAA,EAAA,KAEjB1C,GAAOA,EAAIwB,QAAU,KAAOxB,EAAIwB,OAAS,KAAG,CAAA+F,EAAAzG,KAAA,GAAA,KAAA,CAAA,OAAAyG,EAAAzG,KAAA,GACPd,EAAIG,OAAM,KAAA,GAOe,OAN1DmE,UAAMwG,EAAM5L,EAAKlC,YAAL8N,EAAUrM,WAASsM,KAAIA,OAAJA,GAD/B9N,EAAKsK,EAAAjG,MACoCrE,YAAN8N,EAAAA,EAAaX,KAAG,oCACzDhJ,EAAQ4I,OAAO,aAAc1F,GACrB1C,EAAO3E,EAAP2E,GACRmC,EAAYiH,OAADA,EAAC/N,EAAMA,YAAN+N,EAAAA,EAAaZ,KACzBvG,EAAajC,GACbR,EAAQtC,IAAIqF,EAAgBvC,GAC5BR,EAAQ4I,OAAO,aAAwBpI,UAAAA,yBAAyB2F,EAAAxG,OAAA,SACzD,IAAI4B,SAASgG,KAAKC,UAAU3L,GAAQ,CAAEuE,OAAQ,IAAKJ,QAAAA,KAAU,KAAA,GAAA,OAAAmG,EAAAzG,KAAA,GAEnDd,EAAI0B,OAAM,KAAA,GAAnB,OAAA6F,EAAAxG,OAAA,SACH,IAAI4B,SADD4E,EAAAjG,KACgB,CAAEE,OAAQxB,EAAIwB,UAAS,KAAA,GAAA,IAAA,MAAA,OAAA+F,EAAAxF,OAAA,GAAAuF,EAClD,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAAG,EAAA9L,MAAAmD,KAAA/D,UAAA,CAAA,CA3BK,GA2BLuE,EAcDgM,oBAAmB,WAAA,IAAAC,EAAA3L,EAAAC,IAAAC,MAAG,SAAAoI,EACpBjB,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAAsH,GAAA,cAAAA,EAAApH,KAAAoH,EAAAnH,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAM+I,EAAAlH,OAAA,SAC/ByI,EAAW3K,IAAIgI,EAAK3H,EAAKkM,uBAAwB3I,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAwF,EAAAlG,OAAA,GAAA+F,EAC9D,KAAA,OAAAX,SAAAA,EAAAK,GAAA,OAAA2D,EAAA5P,MAAAmD,KAAA/D,UAAA,CAAA,CANkB,GAMlBuE,EAEDmM,eAAc,WAAA,IAAAC,EAAA9L,EAAAC,IAAAC,MAAG,SAAA6I,EACf1B,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAA8H,GAAA,cAAAA,EAAA5H,KAAA4H,EAAA3H,MAAA,KAAA,EAGS,OADrB0I,EAAa,IAAI/C,EAASvH,GACLuJ,EAAA1H,gBACpByI,EAAW5C,KAAKC,EAAK3H,EAAKqM,kBADZ,QAC6C9I,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAgG,EAAA1G,OAAA,GAAAwG,EACxE,KAAA,OAAAd,SAAAA,EAAAC,GAAA,OAAA4D,EAAA/P,MAAAmD,KAAA/D,UAAA,CAAA,CAPa,GAObuE,EAEDsM,eAAc,WAAA,IAAAC,EAAAjM,EAAAC,IAAAC,MAAG,SAAAgM,EACf7E,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAAgL,GAAA,cAAAA,EAAA9K,KAAA8K,EAAA7K,MAAA,KAAA,EAGS,OADrB0I,EAAa,IAAI/C,EAASvH,GACLyM,EAAA5K,gBACpByI,EAAWpC,IAAIP,EAAK3H,EAAKqM,kBADX,QAC4C9I,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAkJ,EAAA5J,OAAA,GAAA2J,EACvE,KAAA,OAAAxD,SAAAA,EAAAC,GAAA,OAAAsD,EAAAlQ,MAAAmD,KAAA/D,UAAA,CAAA,CAPa,GAObuE,EAUD6K,cAAa,WAAA,IAAA6B,EAAApM,EAAAC,IAAAC,MAAG,SAAAmM,EACdhF,EACApE,GAAkB,IAAAqJ,EAAAtC,EAAAhH,EAAA,OAAA/C,IAAAkB,MAAA,SAAAoL,GAAA,cAAAA,EAAAlL,KAAAkL,EAAAjL,MAAA,KAAA,EAEoB,GAAhC0I,EAAa,IAAI/C,EAASvH,IAG5B2H,KAAO,SAAUA,GAAG,CAAAkF,EAAAjL,KAAA,EAAA,KAAA,CAAA,OAAAiL,EAAAjL,KAAA,EACT,IAAI6B,SAASkE,EAAIrE,MAAkBrC,OAAM,KAAA,EAAtDqC,EAAIuJ,EAAAzK,KAAA,KAAA,EAAA,OAAAyK,EAAAhL,OAECyI,SAAAA,EAAW3K,IAAIgI,EAAK3H,EAAK8M,YAAYF,OAADA,EAACtJ,QAAAsJ,EAAAA,EAAMG,OAAQxJ,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAsJ,EAAAhK,OAAA,GAAA8J,EAChE,KAAA,OAAAzD,SAAAA,EAAAC,GAAA,OAAAuD,EAAArQ,MAAAmD,KAAA/D,UAAA,CAAA,CAXY,GAWZuE,EAEDgN,kBAAoB,SAACC,GACnB,IAAIjK,EAOJ,MANwB,iBAAbA,EACTA,EAAWiK,EACFA,aAAiBlG,UAC1B/D,EAAW6C,EAAkBoH,EAAKjN,IAGpC,cAAqBA,EAAKC,WAAU,YAAY+C,EAAQ,uBACzDhD,CAlND,CAACyI,EAAA2B,EAAA5C,GAAA,IAAA3D,EAAAuG,EAAAtG,UA0LA,OA1LAD,EA8IDwI,kBAAA,SAAkBa,GAChB,MAAqBhG,cAAAA,mBAAmB1H,KAAKS,YAAW,aACtDT,KAAKwD,SAAWkE,mBAAmB1H,KAAKwD,UAAY,cAC9BkE,wBAAAA,mBAAmBgG,IAC5CrJ,EAkCDiJ,YAAA,SAAYC,GACV,MAAA,cAAqB7F,mBACnB1H,KAAKS,YACN,gCACC8M,EAAK,UAAa7F,mBAAmB6F,GAAW,KAEnD1N,EAAA+K,EAAA,CAAA,CAAA1K,IAAA,WAAAC,IAzLD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,cAC1D,GAAC,CAAAP,IAAA,YAAAC,IA0GD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,QAC1D,GAAC,CAAAP,IAAA,yBAAAC,IAqCD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,yBAC3CT,KAAKwD,SAAWkE,mBAAmB1H,KAAKwD,UAAY,cACtD,sBACF,IAAC,EA3J+BlD,GCIbqN,WAAM3F,GACzB,SAAA2F,EAAY5R,GAAc,IAAAyE,EA2DzB,OA1DCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAef4N,iBAAgB,WAAA,IAAA9N,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACjBkH,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAM0B,EAAAE,KAAA,EACzB0I,EAAW5C,KAAKC,EAAK3H,EAAKqN,eAAgB9J,GAAK,KAAA,EAAA,OAAA7B,EAAAG,OAAAH,SAAAA,EAAAU,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAV,EAAAmB,OAAA,GAAApC,EAC7D,KAAA,OAAAqC,SAAAA,EAAAsD,GAAA,OAAA9G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANe,GAMfuE,EAEDsN,UAAS,WAAA,IAAAjN,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACVF,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAM8H,EAAAlG,KAAA,EACzB0I,EAAW3K,IAAIgI,EAAK3H,EAAKuN,SAAUhK,GAAK,KAAA,EAAA,OAAAuE,EAAAjG,OAAAiG,SAAAA,EAAA1F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA0F,EAAAjF,OAAA,GAAAgF,EACtD,KAAA,OAAAxB,SAAAA,EAAA0B,GAAA,OAAA1H,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANQ,GAMRuE,EAEDwN,WAAU,WAAA,IAAArF,EAAA7H,EAAAC,IAAAC,MAAG,SAAA4H,EACXhF,EACAuE,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAMqI,EAAAzG,KAAA,EACzB0I,EAAWpC,IAAIP,EAAQ3H,EAAKuN,SAAQ,IAAInK,EAAUG,GAAK,KAAA,EAAA,OAAA8E,EAAAxG,OAAAwG,SAAAA,EAAAjG,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAiG,EAAAxF,OAAA,GAAAuF,EACrE,KAAA,OAAA,SAAAJ,EAAAC,EAAAK,GAAA,OAAAH,EAAA9L,MAAAmD,KAAA/D,UAAA,CAAA,CAPS,GAOTuE,EAEDyN,gBAAe,WAAA,IAAAxB,EAAA3L,EAAAC,IAAAC,MAAG,SAAAoI,EAChBjB,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAAsH,GAAA,cAAAA,EAAApH,KAAAoH,EAAAnH,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAM+I,EAAAnH,KAAA,EACzB0I,EAAW3K,IAAIgI,EAAK3H,EAAKqN,eAAgB9J,GAAK,KAAA,EAAA,OAAAwF,EAAAlH,OAAAkH,SAAAA,EAAA3G,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA2G,EAAAlG,OAAA,GAAA+F,EAC5D,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAAyD,EAAA5P,MAAAmD,KAAA/D,UAAA,CAAA,CANc,GAMduE,EAMD0N,GAAE,WAAA,IAAAtB,EAAA9L,EAAAC,IAAAC,MAAG,SAAA6I,EACH1B,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAA8H,GAAA,cAAAA,EAAA5H,KAAA4H,EAAA3H,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAMuJ,EAAA3H,KAAA,EACzB0I,EAAW3K,IAAIgI,EAAK3H,EAAK2N,MAAOpK,GAAK,KAAA,EAAA,OAAAgG,EAAA1H,OAAA0H,SAAAA,EAAAnH,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAmH,EAAA1G,OAAA,GAAAwG,EACnD,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAAmD,EAAA/P,MAAAmD,KAAA/D,UAAA,CAAA,CANC,GAMDuE,CAzDD,CAAC,OAAAyI,EAAA0E,EAAA3F,GAAAnI,EAAA8N,EAAA,CAAA,CAAAzN,IAAA,UAAAC,IAED,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,WAC/C,GAAC,CAAAP,IAAA,WAAAC,IAED,WACE,OAAUH,KAAKoO,QAAO,QACxB,GAAC,CAAAlO,IAAA,iBAAAC,IAED,WAAkB,IAAA+L,EAChB,OAAUlM,KAAKoO,QAAO,aAAyB,OAAzBlC,EAAYlM,KAAKwD,UAAQ0I,EAAI,cAAY,QACjE,GAAC,CAAAhM,IAAA,QAAAC,IAmCD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,WAC1D,IAAC,EApDgCH,GC3Bd+N,WAAQrG,GAC3B,SAAAqG,EAAYtS,GAAc,IAAAyE,EA0BzB,OAzBCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAWfsO,aAAY,WAAA,IAAAxO,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACbkH,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAM0B,EAAAG,OAAA,SAC/ByI,EAAW5C,KAAKC,EAAK3H,EAAK+N,WAAYxK,IAAK,KAAA,EAAA,IAAA,MAAA,OAAA7B,EAAAmB,OAAA,GAAApC,EACnD,KAAA,OAAAqC,SAAAA,EAAAsD,GAAA,OAAA9G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANW,GAMXuE,EAEDgO,UAAS,WAAA,IAAA3N,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACVF,EACApE,GAAkB,IAAA+G,EAAA,OAAA/J,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAEoB,OAAhC0I,EAAa,IAAI/C,EAASvH,GAAM8H,EAAAjG,OAAA,SAC/ByI,EAAW3K,IAAIgI,EAAK3H,EAAKiO,UAAW1K,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAuE,EAAAjF,OAAA,GAAAgF,EACjD,KAAA,OAAAxB,SAAAA,EAAA0B,GAAA,OAAA1H,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANQ,GAMRuE,CAxBD,CAAC,OAAAyI,EAAAoF,EAAArG,GAAAnI,EAAAwO,EAAA,CAAA,CAAAnO,IAAA,aAAAC,IACD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,UAC1D,GAAC,CAAAP,IAAA,YAAAC,IACD,WAAa,IAAA+L,EACX,MAAA,cAAqBxE,mBAAmB1H,KAAKS,YAAW,aACzCyL,OADyCA,EACtDlM,KAAKwD,UAAQ0I,EAAI,aAErB,IAAC,EAXkC5L,qBCE/BoO,EAAY,WAQhB,SAAAA,EAAY3S,EAAgBmH,GAAU,IAAA1C,EAAAR,KAAAA,KAPtC2O,UAAI,EAAA3O,KACJwD,cAAQ,EAAAxD,KACR4D,YAAM,EAAA5D,KACNkD,QAAE,EAAAlD,KACFjE,YAAM,EAAAiE,KACN4O,WAAK,EAGH,IAAAxN,EAAuBtF,EAAOC,EAAQ,kBAA9BgB,EAAIqE,EAAJrE,KAAMT,EAAI8E,EAAJ9E,KACd0D,KAAKkD,GAAKA,EACV,IAAM2L,EAAUzL,EAAA,CACd0L,IAAK,EACLC,IAAK,GACLC,kBAAmB,KAChBjT,EAAOmD,IAEJ+P,EAA8BJ,EAA9BI,YAAgBC,oIAASC,CAAKN,EAAUO,GAEhDrT,EAAOmD,GAAK2P,EACZ7O,KAAKjE,OAASA,EACdO,EAAK0D,KAAKjE,QAEViE,KAAK2O,KCzBO,SAAmBA,EAAY5S,GAC7C,IAAAqF,EAAwBtF,EAAOC,EAAQ,UAA/BO,EAAI8E,EAAJ9E,KAAMa,EAAKiE,EAALjE,MACd,OAAO,IAAIkS,MAAYV,EAAM,CAC3BxO,IAAGA,SAACmP,EAAkBC,GACpB,GAAiB,UAAbA,EAAsB,CAEnBxT,EAAOmD,GAAGsQ,mBACRzT,EAAO2B,MAAS3B,EAAOiC,SAIhBjC,EAAOmD,GAAGqC,UACpBpE,EACE,8FALFA,EACE,mHAQN,IAAMsS,EAASH,EAAOC,GACtB,OAAO,WAAgC,IAAA,IAAAvT,EAAAC,UAAAC,OAAdQ,EAAcN,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAdK,EAAcL,GAAAJ,UAAAI,GAIrC,OAHAC,EAAIO,WAAIH,EAAAA,GAEO+S,EAAO5S,MAAMmD,KAAMtD,GAGtC,CACA,OAAO4S,EAAOC,EAChB,GAEJ,CDHgBG,CAAmB,IAAIC,EAAAA,KAAKT,GAAYlP,KAAKjE,QAE9B,mBAAhBkT,GACTlS,EACE,+EAKJiD,KAAK4P,eACL5P,KAAK2O,KAAKkB,GAAG,UAAS,WAAA,IAAA/P,EAAAgB,EAAAC,IAAAC,MAAE,SAAAC,EAAO6O,GAAM,OAAA/O,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EACnC9F,EAAK,kBAC4ByT,EAAgBhU,EACjDkT,CAAYa,GAAQ,SAACE,EAAKC,GACpBD,GACFC,EAAQC,SAEZ,IACA1P,EAAKoP,eAAe,KAAA,EAAA,IAAA,MAAA,OAAA1N,EAAAmB,OAAA,GAAApC,EACrB,KAAA,OAAA,SAAAqC,GAAA,OAAAxD,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAC,CAToB,IAUtB+D,KAAK2O,KAAKkB,GAAG,QAAO,WAAA,IAAAhP,EAAAC,EAAAC,IAAAC,MAAE,SAAAqH,EAAOV,GAAC,OAAA5G,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAC5B9F,EAAK,cAAeqL,GAAG,KAAA,EAAA,IAAA,MAAA,OAAAW,EAAAjF,OAAA,GAAAgF,EACxB,KAAA,OAAA,SAAAzB,GAAA,OAAA/F,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAC,CAFkB,GAGtB,CAUC,OAVAyS,EAAApK,UAEDsL,aAAA,WAAY,IAAAO,EAAAnQ,KACNA,KAAK4O,OACPwB,aAAapQ,KAAK4O,OAEpB5O,KAAK4O,MAAQyB,WAAUvP,EAAAC,IAAAC,MAAC,SAAA4H,IAAA,OAAA7H,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAAA,OAAAyG,EAAAzG,KAAA,EAChB+N,EAAKxB,KAAK2B,MAAK,KAAA,EPFzBpM,EAAQK,QAAQ5E,EAAO4Q,UOGTJ,EAAKjN,IAAI,KAAA,EAAA,IAAA,MAAA,OAAA2F,EAAAxF,OAAA,GAAAuF,EACpB,KAAE5I,KAAKjE,OAAOmD,GAAG8P,oBACnBN,CAAA,CAxDe,GA6DlB,SAASqB,EAAgBhU,GACvB,IAAAyU,EAAuB1U,EAAOC,EAAQ,iBAA9BgB,EAAIyT,EAAJzT,KAAMT,EAAIkU,EAAJlU,KACd,OAAO,SAACmU,EAAM5L,GAMZ,GALA4L,EAAKZ,GAAG,SAAS,SAAsB1S,GACrCJ,EAAK,sCAAuCI,GAC5C0H,EAAK1H,EAAOsT,EACd,IAEI1U,EAAOyH,SAAU,CACnB,IAAMkN,EAAQ,CAAA,yBAA0B3U,EAAOyH,SAAY,KACvDzH,EAAO6H,SACJ7H,EAAOyH,UACVzG,EAAK,0DAEP2T,EAAM1L,KAAI,uBAAwBjJ,EAAO6H,aAI3C6M,EAAKC,MAAMA,EAAMxK,KAAK,MAAM,SAAU8J,GAChCjU,EAAOyH,UACTlH,EAAK,cAAeP,EAAOyH,UAEzBzH,EAAO6H,QACTtH,EAAK,YAAaP,EAAO6H,QAE3BiB,EAAKmL,EAAKS,EACZ,GACF,CACA5L,EAAK,KAAM4L,GAEf,CE9F0C,IAErBE,EAAS,WAe5B,SAAAA,EAAY5U,GAAoB,IAAAyE,EAAAR,KAAAA,KAdhC4Q,iBAAW,EAeT,IAAQtU,EAASR,EAAOC,EAAQ,eAAxBO,KACR0D,KAAK4Q,YAAc,IAAIC,IAEvB,IT8B2BC,ES9BrB5N,EAAKlD,KAAK+Q,SAChBzU,EAAK,cAAe4G,GACpBlD,KAAK4Q,YAAYxQ,IAAI8C,EAAI,IAAIwL,EAAa,IAAIpO,EAAOvE,GAASmH,IT4BnC4N,ES3BZ,SAAC5N,GACVA,GAAM1C,EAAKoQ,YAAYI,IAAI9N,IAC7B1C,EAAKoQ,YAAkB,OAAC1N,EAE5B,ETwBFgB,EAAQa,UAAUpF,EAAO4Q,UAAWO,ESvBpC,CAAC,IAAAzM,EAAAsM,EAAArM,UAgBA,OAhBAD,EAxBO0M,OAAA,SACNvN,EACAI,GAEA,OAAIJ,GAAYI,EACJJ,MAAYI,EAEpBJ,EACF,GAAUA,EAEL,QACRa,EAeD4M,cAAA,SAAclV,GACZ,IAAQO,EAASR,EAAOC,EAAQ,eAAxBO,KACF4G,EAAKlD,KAAK+Q,OAAOhV,EAAOyH,SAAUzH,EAAO6H,QACzCsN,EAAWlR,KAAK4Q,YAAYzQ,IAAI+C,GAEtC,GADA5G,EAAK,kBAAmB0D,KAAK4Q,YAAYO,MACrCD,EAEF,OADA5U,EAAK,qBAAsB4G,GACpBgO,EAASvC,KAElB,IAAMyC,EAAS,IAAI1C,EAAa,IAAIpO,EAAOvE,GAASmH,GAIpD,OAHAlD,KAAK4Q,YAAYxQ,IAAI8C,EAAIkO,GACzB9U,EAAK,cAAe4G,GACpB5G,EAAK,kBAAmB0D,KAAK4Q,YAAYO,MAClCC,EAAOzC,MACfgC,CAAA,CA3C2B,GCFjBU,EAAe,SAACtV,GAC3B,OAAOuV,OAAOC,KAAKtH,KAAKC,UAAUnO,GAAS,UAAUyV,UACvD,ECQMzN,EAAO,SAAChI,GAIZ,MAAO,CACL0V,KAJW,IAAI7G,EAAK7O,GAKpB2V,MAJY,IAAI/D,EAAM5R,GAKtBmP,QAJc,IAAImD,EAAQtS,GAM9B,EAEa4V,EAAM,WAMjB,SAAAA,EAAY5V,GAAqB,IAAAyE,EAAAR,KAAAA,KALjCjE,YAAM,EAAAiE,KACN1B,SAAG,EAAA0B,KACK4R,aAAO,EAAA5R,KACP6R,aAAO,EAGb7R,KAAKjE,OAAS,IAAIuE,EAAOvE,GACzBiE,KAAK6R,QAAU,IAAIhB,IACnB7Q,KAAK1B,IAAMyF,EAAK/D,KAAKjE,QACrBiE,KAAK4R,QAAU,IAAIE,EAAU9R,KAAKjE,QXMpCmI,EAAQa,UAAUpF,EAAOuF,QWJT,SAAC1B,GACbhD,EAAKgD,SAAWA,CAClB,IXQwCU,EAAQa,UAAUpF,EAAOyF,MWNrD,SAACxB,GACXpD,EAAKoD,OAASA,CAChB,IXUuCM,EAAQa,UAAUpF,EAAO4F,OWRrD,SAAChH,GACViC,EAAKjC,MAAQA,CACf,GACF,CAAC,IAAA8F,EAAAsN,EAAArN,UAyGA,OAzGAD,EAED0N,UAAA,SAAUvU,GACRwC,KAAKjE,OAAS,IAAIuE,EAAO9C,IAC1B6G,EAEKN,KAAI,WAAA,IAAAiO,EAAAlR,EAAAC,IAAAC,MAAV,SAAAC,EAAWzD,GAAY,IAAAyU,EAAA,OAAAlR,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EACOpC,KAAKjE,OAAO6E,UAASwC,EAC5C,CAAA,EAAApD,KAAKjE,OACLyB,IACH,KAAA,EAG6B,OAF/BwC,KAAK+R,UAJCE,EAAa/P,EAAAU,MAKnB5C,KAAK4R,QAAU,IAAIE,EAAU9R,KAAKjE,QAClCiE,KAAK1B,IAAMyF,EAAKkO,GAAe/P,EAAAG,OAAA,SACxBrC,MAAI,KAAA,EAAA,IAAA,MAAA,OAAAkC,EAAAmB,OAAA,GAAApC,EAAAjB,KACZ,KAAA,OAAA,SAAAsD,GAAA,OAAA0O,EAAAnV,MAAAmD,KAAA/D,UAAA,CAAA,CATS,GAsEVoI,EAMA6N,YAAA,SAAYnW,GACV,IAAMoW,EAAO/O,EAAA,CAAA,EAAQpD,KAAKjE,OAAWA,GAC/BqW,EDpIiB,SAACrW,GAC1B,IAAMyB,EAAM,IAAI8C,EAAOvE,GACvB,OAAOsV,EAAa7T,EACtB,CCiIqB6U,CAAYF,GAE7B,GAAIC,IADoBf,EAAarR,KAAKjE,QAExC,OAAOiE,KAET,IAAMkR,EAAWlR,KAAK6R,QAAQ1R,IAAIiS,GAElC,GAAIlB,EAAU,CAEZ,IAAMe,EAAgB,IAAI3R,EAAO6R,GAOjC,OANAjB,EAASa,UAAUE,GAEnBf,EAAS1N,SAAWyO,EAAczO,SAClC0N,EAAStN,OAASqO,EAAcrO,OAChCsN,EAAS3S,MAAQ0T,EAAc3T,IAAIC,MACnC2S,EAASzQ,WAAawR,EAAcxR,WAC7ByQ,CACT,CAGA,OADAlR,KAAK6R,QAAQzR,IAAIgS,EAAU,IAAIT,EAAOQ,IAC/BnS,KAAK6R,QAAQ1R,IAAIiS,IACzBvS,EAAA8R,EAAA,CAAA,CAAAzR,IAAA,aAAAE,IAxFD,SAAekF,GACTA,IACFtF,KAAKjE,OAAO0E,WAAa6E,EACzBtF,KAAK1B,IAAImT,KAAKhR,WAAa6E,EAC3BtF,KAAK1B,IAAIoT,MAAMjR,WAAa6E,EAC5BtF,KAAK1B,IAAI4M,QAAQzK,WAAa6E,EAElC,GAAC,CAAApF,IAAA,SAAAC,IAED,WACE,OAAOH,KAAKjE,OAAO6H,MACpB,EAAAxD,IAED,SAAWwD,GACT5D,KAAKS,WAAaT,KAAKjE,OAAO0E,WAE9BT,KAAKjE,OAAO6H,OAASA,EAEjB5D,KAAK1B,MACP0B,KAAK1B,IAAImT,KAAK7N,OAAS5D,KAAKjE,OAAO6H,OACnC5D,KAAK1B,IAAIoT,MAAM9N,OAAS5D,KAAKjE,OAAO6H,OACpC5D,KAAK1B,IAAI4M,QAAQtH,OAAS5D,KAAKjE,OAAO6H,OAE1C,GAAC,CAAA1D,IAAA,WAAAC,IAED,WACE,OAAOH,KAAKjE,OAAOyH,QACpB,EAAApD,IAED,SAAaoD,GACXxD,KAAKS,WAAaT,KAAKjE,OAAO0E,WAC9BT,KAAKjE,OAAOyH,SAAWA,EAEnBxD,KAAK1B,MACP0B,KAAK1B,IAAImT,KAAKjO,SAAWA,EACzBxD,KAAK1B,IAAIoT,MAAMlO,SAAWA,EAC1BxD,KAAK1B,IAAI4M,QAAQ1H,SAAWA,EAEhC,GAAC,CAAAtD,IAAA,QAAAC,IAED,WAAS,IAAAmS,EACP,OAAkBA,OAAlBA,EAAOtS,KAAKjE,SAALuW,OAAWA,EAAXA,EAAahU,UAAbgU,EAAAA,EAAkB/T,KAC1B,EAAA6B,IAED,SAAU7B,GACJA,IACFyB,KAAKjE,OAAOuC,IAAIC,MAAQA,EACpByB,KAAK1B,MACP0B,KAAK1B,IAAImT,KAAKnT,IAAIC,MAAQA,EAC1ByB,KAAK1B,IAAIoT,MAAMpT,IAAIC,MAAQA,EAC3ByB,KAAK1B,IAAI4M,QAAQ5M,IAAIC,MAAQA,GAGnC,GAAC,CAAA2B,IAAA,KAAAC,IACD,WAEE,OAAOH,KAAK4R,QAAQX,cAAcjR,KAAKjE,OACzC,IAAC,CAjGgB,GAmIGwW,SAAAA,EAAM3L,GAAA,OAAA4L,EAAA3V,MAAAmD,KAAA/D,UAAA,CAG3B,SAAAuW,IAAA,OAAAA,EAAA1R,EAAAC,IAAAC,MAHM,SAAAqH,EAAsBtM,GAAqB,IAAA0W,EAAA,OAAA1R,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EACf,OAA3BqQ,EAAS,IAAId,EAAO5V,GAAOuM,EAAAlG,KAAA,EACpBqQ,EAAO1O,OAAM,KAAA,EAAA,OAAAuE,EAAAjG,OAAAiG,SAAAA,EAAA1F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA0F,EAAAjF,OAAA,GAAAgF,EAC3B,MAAAxL,MAAAmD,KAAA/D,UAAA,CC3JDyW,OAAOC,QAAUJ"}
1
+ {"version":3,"file":"server.cjs.production.min.js","sources":["../src/utils/Logger.ts","../src/utils/Config/envVars.ts","../src/utils/Event/index.ts","../src/utils/Config/index.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/users/index.ts","../src/tenants/index.ts","../src/db/NileInstance.ts","../src/db/PoolProxy.ts","../src/db/DBManager.ts","../src/utils/Server/index.ts","../src/Server.ts","../src/index.ts"],"sourcesContent":["import { ServerConfig } from '../types';\n\nimport { Config } from './Config';\n\nexport default function Logger(\n config: void | Config | ServerConfig,\n ...params: unknown[]\n) {\n return {\n info(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.info('[niledb]', ...params, ...args);\n }\n },\n warn(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[niledb]', ...params, ...args);\n }\n },\n error(...args: unknown[]) {\n // eslint-disable-next-line no-console\n console.error('[niledb]', '[ERROR]', ...params, ...args);\n },\n };\n}\n","import 'dotenv/config';\nimport { ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nexport type EnvConfig = {\n logger?: string;\n config?: ServerConfig;\n};\n\nexport const getDatbaseId = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[databaseId]');\n if (config?.databaseId) {\n logger && info(logger, 'config', config.databaseId);\n return String(config?.databaseId);\n }\n logger && info(logger, 'env', process.env.NILEDB_ID);\n return process.env.NILEDB_ID;\n};\nexport const getUsername = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[username]');\n if (config?.user) {\n logger && info(logger, 'config', config.user);\n return String(config?.user);\n }\n logger && info(logger, '.env', process.env.NILEDB_USER);\n return process.env.NILEDB_USER;\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const log = logProtector(logger);\n const { info } = Logger(config, '[password]');\n if (config?.password) {\n log && info(logger, 'config', config.password);\n\n return String(config.password);\n }\n\n log && info(logger, '.env', process.env.NILEDB_PASSWORD);\n return process.env.NILEDB_PASSWORD;\n};\n\nexport const getInfoBearer = (cfg: EnvConfig) => {\n return `${getUsername(cfg)}:${getPassword(cfg)}`;\n};\n\nexport const getToken = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[token]');\n if (config?.api?.token) {\n logger && info(logger, 'config', config.api?.token);\n return String(config.api?.token);\n }\n if (process.env.NILEDB_TOKEN) {\n logger && info(logger, '.env', process.env.NILEDB_TOKEN);\n return process.env.NILEDB_TOKEN;\n }\n return undefined;\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[databaseName]');\n if (config?.databaseName) {\n logger && info(logger, 'config', config.databaseName);\n return String(config.databaseName);\n }\n if (process.env.NILEDB_NAME) {\n logger && info(logger, 'config', process.env.NILEDB_NAME);\n return process.env.NILEDB_NAME;\n }\n return null;\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[tenantId]');\n if (config?.tenantId) {\n logger && info(logger, 'config', config.tenantId);\n return config.tenantId;\n }\n\n if (process.env.NILEDB_TENANT) {\n logger && info(logger, '.env', process.env.NILEDB_TENANT);\n return process.env.NILEDB_TENANT;\n }\n\n return null;\n};\n\nexport const getBasePath = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n if (basePath) {\n logger && info(logger, 'config', config?.api?.basePath);\n return basePath;\n }\n\n if (process.env.NILEDB_API) {\n logger && info(logger, '.env', process.env.NILEDB_API);\n return `https://${process.env.NILEDB_API}`;\n }\n\n logger && info(logger, 'default', process.env.NILEDB_API);\n return 'https://api.thenile.dev';\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (config?.db && config.db.host) {\n logger && info(logger, 'config', config?.db.host);\n return config.db.host;\n }\n\n if (process.env.NILEDB_HOST) {\n logger && info(logger, '.env', process.env.NILEDB_HOST);\n return process.env.NILEDB_HOST;\n }\n\n logger && info(logger, 'default', 'db.thenile.dev');\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.port]');\n if (config?.db?.port && config.db.port != null) {\n logger && info(logger, 'config', config?.db.port);\n return Number(config.db?.port);\n }\n\n if (process.env.NILEDB_PORT) {\n logger && info(logger, 'config', process.env.NILEDB_PORT);\n return Number(process.env.NILEDB_PORT);\n }\n logger && info(logger, 'default', 5432);\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger?: string) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n","type BusValues = undefined | null | string;\ntype EventFn = (params: BusValues) => void;\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n}\nclass Eventer {\n events: { [key: string]: EventFn[] };\n constructor() {\n this.events = {};\n }\n publish(eventName: string, value: BusValues) {\n // Get all the callback functions of the current event\n const callbackList = this.events[eventName];\n\n // execute each callback function\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n // initialize this event\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n\n // store the callback function of the subscriber\n this.events[eventName].push(callback);\n }\n}\n\n// tenantId manager\nconst eventer = new Eventer();\n\nexport const updateTenantId = (tenantId: BusValues) => {\n eventer.publish(Events.Tenant, tenantId);\n};\n\nexport const watchTenantId = (cb: EventFn) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: BusValues) => {\n eventer.publish(Events.User, userId);\n};\n\nexport const watchUserId = (cb: EventFn) => eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (val: BusValues) => {\n eventer.publish(Events.Token, val);\n};\n\nexport const watchToken = (cb: EventFn) => eventer.subscribe(Events.Token, cb);\n\nexport const watchEvictPool = (cb: EventFn) =>\n eventer.subscribe(Events.EvictPool, cb);\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import { NilePoolConfig, ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getDatabaseName,\n getDatbaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n} from './envVars';\n\ntype Database = {\n name: string;\n apiHost: string;\n dbHost: string;\n id: string;\n message?: string; // is actually an error\n status: 'READY' | string;\n};\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n }: {\n basePath: string;\n cookieKey: string;\n token: string | undefined;\n }) {\n this.basePath = basePath;\n this.cookieKey = cookieKey;\n this._token = token;\n }\n\n public get token(): string | undefined {\n return this._token;\n }\n\n public set token(value: string | undefined) {\n this._token = value;\n }\n}\n\nexport class Config {\n user: string;\n password: string;\n databaseId: string;\n databaseName: string;\n\n debug: boolean;\n\n db: NilePoolConfig;\n\n api: ApiConfig;\n\n private _tenantId?: string | undefined | null;\n private _userId?: string | undefined | null;\n\n public get tenantId(): string | undefined | null {\n return this._tenantId;\n }\n\n public set tenantId(value: string | undefined | null) {\n this._tenantId = value;\n }\n\n public get userId(): string | undefined | null {\n return this._userId;\n }\n\n public set userId(value: string | undefined | null) {\n this._userId = value;\n }\n\n constructor(config?: ServerConfig) {\n const envVarConfig: EnvConfig = { config };\n\n this.databaseId = getDatbaseId(envVarConfig) as string;\n this.user = getUsername(envVarConfig) as string;\n this.password = getPassword(envVarConfig) as string;\n this.databaseName = getDatabaseName(envVarConfig) as string;\n this._tenantId = getTenantId(envVarConfig);\n this.debug = Boolean(config?.debug);\n this._userId = config?.userId;\n\n const basePath = getBasePath(envVarConfig);\n const { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host: configuredHost,\n port: configuredPort,\n ...dbConfig,\n };\n if (this.databaseName) {\n this.db.database = this.databaseName;\n }\n }\n\n configure = async (config: ServerConfig): Promise<Config> => {\n const { info, error } = Logger(config, '[init]');\n\n const envVarConfig: EnvConfig = {\n config,\n };\n\n const { host, port, ...dbConfig } = config.db ?? {};\n let configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n if (configuredHost && this.databaseName && this.databaseId) {\n info('Alreaady configured, aborting fetch');\n return this;\n }\n\n let basePath = getBasePath(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${basePath}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info(url.href);\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${getInfoBearer({ config })}`,\n },\n });\n let database: Database;\n const possibleError = res.clone();\n try {\n const json: Database = await res.json();\n if (res.status === 404) {\n info('is the configured databaseName correct?');\n }\n if (json.status && json.status !== 'READY') {\n database = { message: 'Database is not ready yet' } as Database;\n } else {\n database = json;\n }\n } catch (e) {\n const message = await possibleError.text();\n error(message);\n database = { message } as Database;\n }\n info('[fetched database]', database);\n if (process.env.NODE_ENV !== 'TEST') {\n if ('message' in database) {\n if ('statusCode' in database) {\n error(database);\n throw new Error('HTTP error has occured');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please set or remove NILEDB_API, NILEDB_NAME, and NILEDB_HOST in your .env file.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n const apiurl = new URL(apiHost);\n configuredHost = dburl.host;\n basePath = apiurl.origin;\n }\n }\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host: configuredHost,\n port: configuredPort,\n database: this.databaseName,\n ...dbConfig,\n };\n info('[config set]', this);\n return this;\n };\n}\n","export class ResponseError {\n response: Response;\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this.response = new Response(body, init);\n }\n}\n","import { decodeJwt } from 'jose';\n\nimport { ResponseError } from './ResponseError';\nimport { Config } from './Config';\nimport { NileRequest } from './Requester';\nimport { updateTenantId, updateUserId } from './Event';\nimport { getToken } from './Config/envVars';\nimport Logger from './Logger';\n\nexport const X_NILE_TENANT = 'x-nile-tenantId';\nexport const X_NILE_USER_ID = 'x-nile-userId';\n\nexport function handleTenantId(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n req: NileRequest<any>,\n config: Config\n): ResponseError | void {\n // already set, no need to try and figure it out\n if (config.tenantId) {\n return;\n }\n return new ResponseError('tenant id needs to be set', { status: 400 });\n}\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config: Config) {\n const cookieTenant = getTokenFromCookie(headers, 'tenantId');\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config.tenantId;\n}\n\nexport function getUserFromHttp(headers: Headers, config: Config) {\n const token = getTokenFromCookie(headers, config.api.cookieKey);\n if (token) {\n const jwt = decodeJwt(token);\n return jwt.sub;\n }\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const { info, error } = Logger(config, '[server]');\n\n const url = `${config.api?.basePath}${path}`;\n const cookieKey = config.api?.cookieKey;\n const headers = new Headers(opts?.headers);\n const basicHeaders = new Headers();\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n basicHeaders.set('Authorization', `Bearer ${token}`);\n } else if (getToken({ config })) {\n basicHeaders.set('Authorization', `Bearer ${getToken({ config })}`);\n }\n }\n\n const tenantId = getTenantFromHttp(headers, config);\n updateTenantId(tenantId);\n const userId = getUserFromHttp(headers, config);\n updateUserId(userId);\n if (url.includes('{tenantId}') && !tenantId) {\n return new ResponseError('tenantId is not set for request', {\n status: 400,\n });\n }\n const useableUrl = url\n .replace('{tenantId}', encodeURIComponent(String(tenantId)))\n .replace('{userId}', encodeURIComponent(String(userId)));\n\n info('[fetch]', useableUrl);\n\n const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n error('[fetch]', '[response]', e);\n });\n\n if (response && response.status >= 200 && response.status < 300) {\n if (typeof response.clone === 'function') {\n info('[fetch]', '[response]', await response.clone().json());\n }\n return response;\n }\n\n let res;\n const errorHandler =\n typeof response?.clone === 'function' ? response.clone() : null;\n let msg = '';\n try {\n res = await (response as Response)?.json();\n } catch (e) {\n if (errorHandler) {\n msg = await errorHandler.text();\n if (msg) {\n error('[fetch]', '[response]', `[status: ${errorHandler.status}]`, msg);\n }\n }\n if (!msg) {\n error('[fetch]', '[response]', e);\n }\n }\n if (msg) {\n return new ResponseError(msg, { status: errorHandler?.status });\n }\n\n if (res && 'message' in res) {\n const { message } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n 'UNHANDLED ERROR'\n );\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n}\n","import { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT, _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'POST' | 'GET' | 'PUT';\nexport default class Requester<T> extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n async rawRequest(\n method: Methods,\n url: string,\n init: RequestInit,\n body?: string\n ): Promise<Response> {\n const _init = {\n ...init,\n body,\n method,\n };\n\n const res = await _fetch(this, url, _init);\n\n if (res instanceof ResponseError) {\n return res.response;\n }\n\n return res;\n }\n\n /**\n * three optios here\n * 1) pass in headers for a server side request\n * 2) pass in the payload that matches the api\n * 3) pass in the request object sent by a browser\n * @param method\n * @param url\n * @param req\n * @param init\n * @returns\n */\n protected async request(\n method: Methods,\n url: string,\n req: T | Headers,\n init?: RequestInit\n ): Promise<Response> {\n // set the headers\n const headers = new Headers(init ? init?.headers : {});\n if (req instanceof Headers) {\n const tenantId = req.get(X_NILE_TENANT);\n const cookie = req.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n } else if (req instanceof Request) {\n // pass back the X_NILE_TENANT\n const _headers = new Headers(req?.headers);\n const tenantId = _headers.get(X_NILE_TENANT);\n const cookie = _headers.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n }\n // default the body - may be the actual payload for the API\n let body: string | undefined = JSON.stringify(req);\n\n // comes from next/some server\n if (method === 'GET') {\n body = undefined;\n } else if (req instanceof Request) {\n body = await new Response(req.body).text();\n } else if (\n // is just headers for a GET request\n req instanceof Headers ||\n JSON.stringify(req) === '{}' ||\n (req && typeof req === 'object' && Object.values(req).length === 0)\n ) {\n body = undefined;\n }\n\n const _init = {\n ...init,\n headers,\n };\n\n return await this.rawRequest(method, url, _init, body);\n }\n\n post = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('POST', url, req, init);\n };\n\n get = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('GET', url, req, init);\n };\n\n put = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('PUT', url, req, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\nimport { ResponseError } from '../utils/ResponseError';\nimport {\n X_NILE_TENANT,\n X_NILE_USER_ID,\n getTenantFromHttp,\n} from '../utils/fetch';\nimport { updateToken, updateUserId } from '../utils/Event';\nimport { CreateBasicUserRequest, LoginUserResponse } from '../users';\n\nexport interface TenantSSORegistration {\n configUrl: string;\n clientId: string;\n clientSecret: string;\n redirectURI: string;\n emailDomains: Array<string>;\n enabled?: boolean;\n}\n\nexport interface SSOProvider {\n readonly id?: string;\n tenantId?: string;\n provider?: string;\n configUrl: string;\n clientSecret?: string;\n clientId: string;\n redirectURI: string;\n emailDomains?: Array<string>;\n enabled?: boolean;\n}\nexport default class Auth extends Config {\n constructor(config: Config) {\n super(config);\n }\n get loginUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/login`;\n }\n\n login = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers({ 'content-type': 'application/json' });\n const _requester = new Requester(this);\n\n const params =\n req instanceof Request\n ? new URL(req.url).searchParams\n : new URLSearchParams();\n\n const sso = params.get('sso');\n\n if (sso === 'true') {\n const providerRes = await this.listProviders(\n (req as Request).clone(),\n init\n );\n // if you have a provider, log them in\n if (\n providerRes &&\n providerRes.status >= 200 &&\n providerRes.status < 300\n ) {\n const providers = await new Response(providerRes.body).json();\n if (providers.length > 0) {\n if (providers.length > 1) {\n return new Response(JSON.stringify(providers), { status: 200 });\n // a user has to make a choice\n }\n\n // is there a way to do this? probably not.\n headers.set(X_NILE_TENANT, providers[0].tenantId);\n headers.append(\n 'set-cookie',\n `tenantId=${providers[0].tenantId}; path=/; httponly;`\n );\n // const ssoResp = await this.loginSSO(req);\n return new Response(\n JSON.stringify({\n redirectURI: `${this.api.basePath}${this.loginSSOUrl('okta')}`,\n }),\n { status: 200 }\n );\n // make it a client side redirect, because of the headers\n // if there is no provider, require a password.\n }\n }\n }\n\n const res = await _requester.post(req, this.loginUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { tenants } = token;\n const tenant = tenants?.values();\n const tenantId = tenant?.next().value;\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n updateToken(token.token.jwt);\n\n return new Response(JSON.stringify(token), { status: 200, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n loginSSO = (redirectUrl: string) => {\n const ssoLogin = async (\n req: NileRequest<unknown>\n ): NileResponse<Response> => {\n const headers = new Headers();\n const body = await (req as Request).formData();\n const accessToken = (await body.get('access_token')) as string;\n const tenantId = (await body.get('tenantId')) as string;\n const cookie = `${this.api?.cookieKey}=${accessToken}; path=/; samesite=lax; httponly;`;\n updateToken(accessToken);\n headers.append('set-cookie', cookie);\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n headers.set('Location', redirectUrl);\n return new Response(null, {\n headers,\n status: 303,\n });\n };\n return ssoLogin;\n };\n\n loginSSOUrl = (provider: string) => {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/auth/oidc/providers/${provider}/login`;\n };\n\n get signUpUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users`;\n }\n\n signUp = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers();\n const _requester = new Requester(this);\n const res = await _requester.post(req, this.signUpUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token?.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { id } = token;\n updateToken(token.token?.jwt);\n updateUserId(id);\n headers.set(X_NILE_USER_ID, id);\n headers.append('set-cookie', `userId=${id}; path=/; httponly;`);\n return new Response(JSON.stringify(token), { status: 201, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n updateProviderUrl(providerName: string) {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers/${encodeURIComponent(providerName)}`;\n }\n\n get listTenantProvidersUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers`;\n }\n\n listTenantProviders = async (\n req: NileRequest<void | Headers>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.listTenantProvidersUrl, init);\n };\n\n createProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.post(req, this.updateProviderUrl(providerName), init);\n };\n\n updateProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.put(req, this.updateProviderUrl(providerName), init);\n };\n\n providerUrl(email?: undefined | string) {\n return `/databases/${encodeURIComponent(\n this.databaseId\n )}/tenants/auth/oidc/providers${\n email ? `?email=${encodeURIComponent(email)}` : ''\n }`;\n }\n\n listProviders = async (\n req: NileRequest<void | CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n let body: { email: string } | undefined;\n // this is a get. Get the email from the response body so the request is filtered.\n if (req && 'body' in req) {\n body = await new Response(req.body as BodyInit).json();\n }\n return _requester.get(req, this.providerUrl(body?.email), init);\n };\n\n getSSOCallbackUrl = (param: Headers | string) => {\n let tenantId;\n if (typeof tenantId === 'string') {\n tenantId = param;\n } else if (param instanceof Headers) {\n tenantId = getTenantFromHttp(param, this);\n }\n\n return `/databases/${this.databaseId}/tenants/${tenantId}/auth/oidc/callback`;\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface CreateBasicUserRequest {\n email: string;\n password: string;\n preferredName?: string;\n newTenant?: string;\n}\nexport const LoginUserResponseTokenTypeEnum = {\n AccessToken: 'ACCESS_TOKEN',\n RefreshToken: 'REFRESH_TOKEN',\n IdToken: 'ID_TOKEN',\n} as const;\nexport type LoginUserResponseTokenTypeEnum =\n (typeof LoginUserResponseTokenTypeEnum)[keyof typeof LoginUserResponseTokenTypeEnum];\n\nexport interface LoginUserResponseToken {\n jwt: string;\n maxAge: number;\n type: LoginUserResponseTokenTypeEnum;\n}\nexport interface LoginUserResponse {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n id: string;\n token: LoginUserResponseToken;\n}\nexport interface User {\n id?: string;\n tenants?: Set<string>;\n email?: string;\n preferredName?: string;\n}\n\nexport default class Users extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n get baseUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}`;\n }\n\n get usersUrl() {\n return `${this.baseUrl}/users`;\n }\n\n get tenantUsersUrl() {\n return `${this.baseUrl}/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n\n createTenantUser = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const _requester = new Requester(this);\n return await _requester.post(req, this.tenantUsersUrl, init);\n };\n\n listUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.usersUrl, init);\n };\n\n updateUser = async (\n userId: string,\n req: NileRequest<User>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.put(req, `${this.usersUrl}/${userId}`, init);\n };\n\n listTenantUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.tenantUsersUrl, init);\n };\n\n get meUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/me`;\n }\n\n me = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.meUrl, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface Tenant {\n id: string;\n name?: string;\n}\n\nexport default class Tenants extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantsUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants`;\n }\n get tenantUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.post(req, this.tenantsUrl, init);\n };\n\n getTenant = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.tenantUrl, init);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate } from '../types';\nimport Logger from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: Config;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n const { warn, info } = Logger(config, '[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config.db,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n config.db = poolConfig;\n this.config = config;\n info(this.config);\n\n this.pool = createProxyForPool(new Pool(remaining), this.config);\n\n if (typeof afterCreate === 'function') {\n warn(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n }\n\n // start the timer for cleanup\n this.startTimeout();\n this.pool.on('connect', async (client) => {\n info('pool connected');\n const afterCreate: AfterCreate = makeAfterCreate(config);\n afterCreate(client, (err, _client) => {\n if (err) {\n _client.release();\n }\n });\n this.startTimeout();\n });\n this.pool.on('error', async (e) => {\n info('pool failed', e);\n });\n }\n\n startTimeout() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(async () => {\n await this.pool.end();\n evictPool(this.id);\n }, this.config.db.idleTimeoutMillis);\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config): AfterCreate {\n const { warn, info } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(error: Error) {\n warn('Connection was terminated by server', error);\n done(error, conn);\n });\n\n if (config.tenantId) {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\n if (config.tenantId) {\n info('[tenant id]', config.tenantId);\n }\n if (config.userId) {\n info('[user id]', config.userId);\n }\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(pool: Pool, config: Config): Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.db.connectionString) {\n if (!config.user || !config.password) {\n error(\n 'Cannot connect to the database. User and/or password are missing. Generate them at https://console.thenile.dev'\n );\n } else if (!config.db.database) {\n error(\n 'Database name is missing from the config. Call `nile.init()` or set NILEDB_ID in your .env'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n info(...args);\n // @ts-expect-error - not mine\n const called = caller.apply(this, args);\n return called;\n };\n }\n return target[property];\n },\n }) as Pool;\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { ServerConfig } from '../types';\n\nimport NileDatabase from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: ServerConfig) {\n const { info } = Logger(config, '[DBManager]');\n this.connections = new Map();\n // add the base one, so you can at least query\n const id = this.makeId();\n info('constructor', id);\n this.connections.set(id, new NileDatabase(new Config(config), id));\n watchEvictPool((id) => {\n if (id && this.connections.has(id)) {\n this.connections.delete(id);\n }\n });\n }\n\n getConnection(config: ServerConfig): Pool {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n const existing = this.connections.get(id);\n info('# of instances:', this.connections.size);\n if (existing) {\n info('returning existing', id);\n return existing.pool;\n }\n const newOne = new NileDatabase(new Config(config), id);\n this.connections.set(id, newOne);\n info('created new', id);\n info('# of instances:', this.connections.size);\n return newOne.pool;\n }\n}\n","import { ServerConfig } from '../../types';\nimport { Config } from '../Config';\n\nexport const getServerId = (config: ServerConfig) => {\n const cfg = new Config(config);\n return makeServerId(cfg);\n};\nexport const makeServerId = (config: Config) => {\n return Buffer.from(JSON.stringify(config), 'base64').toString();\n};\n","import { Pool } from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport Auth from './auth';\nimport Users from './users';\nimport Tenants from './tenants';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport { getServerId, makeServerId } from './utils/Server';\n\ntype Api = {\n auth: Auth;\n users: Users;\n tenants: Tenants;\n};\n\nconst init = (config: Config): Api => {\n const auth = new Auth(config);\n const users = new Users(config);\n const tenants = new Tenants(config);\n return {\n auth,\n users,\n tenants,\n };\n};\n\nexport class Server {\n config: Config;\n api: Api;\n private manager: DbManager;\n private servers: Map<string, Server>;\n\n constructor(config?: ServerConfig) {\n this.config = new Config(config as ServerConfig);\n this.servers = new Map();\n this.api = init(this.config);\n this.manager = new DbManager(this.config);\n\n watchTenantId((tenantId) => {\n this.tenantId = tenantId;\n });\n\n watchUserId((userId) => {\n this.userId = userId;\n });\n\n watchToken((token) => {\n this.token = token;\n });\n }\n\n setConfig(cfg: Config) {\n this.config = new Config(cfg);\n }\n\n async init(cfg?: Config) {\n const updatedConfig = await this.config.configure({\n ...this.config,\n ...cfg,\n });\n this.setConfig(updatedConfig);\n this.manager = new DbManager(this.config);\n this.api = init(updatedConfig);\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.databaseId = val;\n this.api.auth.databaseId = val;\n this.api.users.databaseId = val;\n this.api.tenants.databaseId = val;\n }\n }\n\n get userId(): string | undefined | null {\n return this.config.userId;\n }\n\n set userId(userId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n\n this.config.userId = userId;\n\n if (this.api) {\n this.api.auth.userId = this.config.userId;\n this.api.users.userId = this.config.userId;\n this.api.tenants.userId = this.config.userId;\n }\n }\n\n get tenantId(): string | undefined | null {\n return this.config.tenantId;\n }\n\n set tenantId(tenantId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n this.config.tenantId = tenantId;\n\n if (this.api) {\n this.api.auth.tenantId = tenantId;\n this.api.users.tenantId = tenantId;\n this.api.tenants.tenantId = tenantId;\n }\n }\n\n get token(): string | undefined | null {\n return this.config?.api?.token;\n }\n\n set token(token: string | undefined | null) {\n if (token) {\n this.config.api.token = token;\n if (this.api) {\n this.api.auth.api.token = token;\n this.api.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): Pool {\n // only need to interact with the knex object\n return this.manager.getConnection(this.config);\n }\n\n /**\n * A utility function if you want to manage different NileDB instances yourself\n * returns the global Server object, an existing server that's already been configured,\n * or a new one if the config isn't in the cache\n */\n\n getInstance(config: ServerConfig): Server {\n const _config = { ...this.config, ...config };\n const serverId = getServerId(_config);\n const currentServerId = makeServerId(this.config);\n if (serverId === currentServerId) {\n return this;\n }\n const existing = this.servers.get(serverId);\n\n if (existing) {\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n existing.setConfig(updatedConfig);\n // propagage special config items\n existing.tenantId = updatedConfig.tenantId;\n existing.userId = updatedConfig.userId;\n existing.token = updatedConfig.api.token;\n existing.databaseId = updatedConfig.databaseId;\n return existing;\n }\n\n this.servers.set(serverId, new Server(_config));\n return this.servers.get(serverId) as unknown as Server;\n }\n}\n\nexport async function create(config?: ServerConfig): Promise<Server> {\n const server = new Server(config);\n return await server.init();\n}\n\nexport default create;\n","export * from './types';\nimport create from './Server';\n\nexport { Server } from './Server';\n\nexport default create;\n\nmodule.exports = create;\n"],"names":["Logger","config","_len","arguments","length","params","Array","_key","info","debug","_console","_len2","args","_key2","console","apply","concat","warn","_console2","_len3","_key3","error","_console3","_len4","_key4","getUsername","cfg","logger","user","String","process","env","NILEDB_USER","getPassword","password","NILEDB_PASSWORD","getToken","_config$api","_config$api2","_config$api3","api","token","NILEDB_TOKEN","getDatabaseName","databaseName","NILEDB_NAME","getBasePath","_config$api4","_config$api5","basePath","NILEDB_API","getDbHost","db","host","NILEDB_HOST","getDbPort","_config$db","_config$db2","port","Number","NILEDB_PORT","Events","ApiConfig","_createClass","_ref","cookieKey","this","_token","key","get","set","value","Config","_config$api$cookieKey2","_this","databaseId","_tenantId","_userId","configure","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_config$api$cookieKey","_Logger","envVarConfig","_ref3","dbConfig","configuredHost","configuredPort","url","res","database","possibleError","json","message","_database","apiHost","dbHost","name","dburl","apiurl","wrap","_context","prev","next","_objectWithoutPropertiesLoose","_excluded","abrupt","URL","searchParams","href","fetch","headers","Authorization","sent","clone","status","t0","text","Error","id","origin","_extends","stop","_x","NILEDB_ID","tenantId","NILEDB_TENANT","getTenantId","Boolean","userId","_ref4","_excluded2","ResponseError","body","init","response","Response","eventer","Eventer","events","_proto","prototype","publish","eventName","callbackList","_step","_iterator","_createForOfIteratorHelperLoose","done","callback","subscribe","push","updateTenantId","Tenant","updateUserId","User","updateToken","val","Token","X_NILE_TENANT","X_NILE_USER_ID","getTokenFromCookie","_headers$get","cookie","split","_cookies","cookieParts","_cookie","slice","join","_step2","_iterator2","getTenantFromHttp","cookieTenant","getUserFromHttp","_headers$get2","decodeJwt","sub","_fetch","_x2","_x3","_fetch2","path","opts","_response$status","basicHeaders","useableUrl","errorHandler","msg","_message","Headers","includes","replace","encodeURIComponent","e","t1","t2","errors","Requester","_Config","call","post","req","request","_callee2","_context2","_x4","_x5","_x6","put","_callee3","_context3","_x7","_x8","_x9","_inheritsLoose","rawRequest","_rawRequest","_callee4","method","_init","_context4","_x10","_x11","_x12","_x13","_request","_callee5","_headers","_context5","Request","JSON","stringify","undefined","Object","values","_x14","_x15","_x16","_x17","Auth","login","_requester","providerRes","providers","_this$api","tenants","tenant","URLSearchParams","listProviders","append","redirectURI","loginSSOUrl","loginUrl","jwt","loginSSO","redirectUrl","ssoLogin","_this$api2","accessToken","formData","provider","_this$tenantId","signUp","_this$api3","_token$token","_token$token2","signUpUrl","listTenantProviders","listTenantProvidersUrl","createProvider","_ref5","updateProviderUrl","updateProvider","_ref6","_callee6","_context6","_ref7","_callee7","_body","_context7","providerUrl","email","getSSOCallbackUrl","param","providerName","Users","createTenantUser","tenantUsersUrl","listUsers","usersUrl","updateUser","listTenantUsers","me","meUrl","baseUrl","Tenants","createTenant","tenantsUrl","getTenant","tenantUrl","NileDatabase","pool","timer","poolConfig","min","max","idleTimeoutMillis","afterCreate","remaining","Proxy","target","property","connectionString","caller","createProxyForPool","Pool","startTimeout","on","client","makeAfterCreate","err","_client","release","_this2","clearTimeout","setTimeout","end","EvictPool","_Logger2","conn","query","DBManager","connections","Map","cb","makeId","has","getConnection","existing","size","newOne","makeServerId","Buffer","from","toString","auth","users","Server","manager","servers","DbManager","setConfig","_init2","updatedConfig","getInstance","_config","serverId","getServerId","_this$config","create","_create","server","module","exports"],"mappings":"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"}