@niledatabase/server 4.0.2 → 4.0.4

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,"sources":["../src/users/types.ts","../src/api/utils/routes/urlMatches.ts","../src/utils/Logger.ts","../src/utils/constants.ts","../src/api/utils/request.ts","../src/api/utils/auth.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/db/PoolProxy.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/api/utils/routes/makeRestUrl.ts","../src/api/utils/routes/apiRoutes.ts","../src/api/routes/me/index.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/%5BuserId%5D/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/users/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/users/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/users/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/users/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.ts","../src/api/utils/routes/proxyRoutes.ts","../src/api/routes/auth/signin.ts","../src/api/routes/auth/session.ts","../src/api/routes/auth/providers.ts","../src/api/routes/auth/csrf.ts","../src/api/routes/auth/callback.ts","../src/api/routes/auth/signout.ts","../src/api/routes/auth/error.ts","../src/api/routes/auth/verify-request.ts","../src/api/routes/auth/password-reset.ts","../src/api/handlers/GET.ts","../src/api/routes/signup/POST.ts","../src/api/routes/signup/index.tsx","../src/api/handlers/POST.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts","../src/api/handlers/index.ts","../src/api/utils/routes/defaultRoutes.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/tenants/index.ts","../src/users/index.ts","../src/Api.ts","../src/Server.ts"],"names":["route","request","pg","afterCreate","GET","key","matches","POST","PUT","DELETE","getCallbackUrl"],"mappings":"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","file":"index.mjs","sourcesContent":["export interface CreateBasicUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n // create a tenant for the new user to an existing tenant\n newTenantName?: string;\n // add the new user to an existing tenant\n tenantId?: string;\n}\nexport interface CreateTenantUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: 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 email: string;\n name?: string | null;\n familyName?: string | null;\n givenName?: string | null;\n picture?: string | null;\n created: string;\n updated?: string;\n emailVerified?: string | null;\n tenants: { id: string }[];\n}\n","export default function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\n","/* eslint-disable no-console */\nimport { Routes } from '../api/types';\nimport urlMatches from '../api/utils/routes/urlMatches';\nimport { ServerConfig } from '../types';\n\nimport { Config } from './Config';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[33m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | ServerConfig, ...params: unknown[]) => ({\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `[niledb][DEBUG]${params.join('')} ${message}`,\n meta ? `\\n${JSON.stringify(meta, null, 2)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.debug(\n `[niledb][DEBUG]${params.join('')} ${message}`,\n meta ? `\\n${JSON.stringify(meta, null, 2)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${yellow}[niledb][WARN]${reset}${params.join('')} ${message}`,\n JSON.stringify(meta, null, 2)\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${red}[niledb][ERROR]${reset}${params.join('')} ${message}`,\n meta\n );\n },\n});\n\nexport default function Logger(\n config?: Config | ServerConfig,\n ...params: unknown[]\n) {\n const base = baseLogger(config, params);\n const info = config?.logger?.info ?? base.info;\n const debug = config?.logger?.debug ?? base.debug;\n const warn = config?.logger?.warn ?? base.warn;\n const error = config?.logger?.error ?? base.error;\n return { info, warn, error, debug };\n}\n\nexport function matchesLog(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.LOG);\n}\n","// these two are a pass though\nexport const X_NILE_TENANT = 'nile.tenant_id';\nexport const X_NILE_USER_ID = 'nile.user_id';\nexport const X_NILE_ORIGIN = 'nile.origin';\n// this one is not\nexport const X_NILE_SECURECOOKIES = 'nile.secure_cookies';\n","import {\n X_NILE_ORIGIN,\n X_NILE_SECURECOOKIES,\n X_NILE_TENANT,\n} from '../../utils/constants';\nimport { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { debug, info, error } = Logger(config, '[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers({});\n if (request.headers.get('cookie')) {\n updatedHeaders.set('cookie', String(request.headers.get('cookie')));\n }\n if (request.headers.get(X_NILE_TENANT)) {\n updatedHeaders.set(\n X_NILE_TENANT,\n String(request.headers.get(X_NILE_TENANT))\n );\n }\n if (config.api.secureCookies != null) {\n updatedHeaders.set(X_NILE_SECURECOOKIES, String(config.api.secureCookies));\n }\n\n updatedHeaders.set('host', requestUrl.host);\n if (config.api.callbackUrl) {\n const cbUrl = new URL(config.api.callbackUrl);\n debug(\n `Obtained origin from config.api.callbackUrl ${config.api.callbackUrl}`\n );\n updatedHeaders.set(X_NILE_ORIGIN, cbUrl.origin);\n } else if (config.api.origin) {\n debug(`Obtained origin from config.api.origin ${config.api.origin}`);\n updatedHeaders.set(X_NILE_ORIGIN, config.api.origin);\n } else {\n updatedHeaders.set(X_NILE_ORIGIN, requestUrl.origin);\n debug(`Obtained origin from request ${requestUrl.origin}`);\n }\n\n const params = { ...init, headers: updatedHeaders };\n if (params.method === 'POST' || params.method === 'PUT') {\n try {\n updatedHeaders.set('content-type', 'application/json');\n const initBody = await new Response(_init.request.clone().body).json();\n const requestBody = await new Response(request.clone().body).json();\n params.body = JSON.stringify(initBody ?? requestBody);\n } catch (e) {\n updatedHeaders.set('content-type', 'application/x-www-form-urlencoded');\n const initBody = await new Response(_init.request.clone().body).text();\n const requestBody = await new Response(request.clone().body).text();\n params.body = initBody ?? requestBody;\n }\n }\n\n const fullUrl = `${url}${requestUrl.search}`;\n try {\n const res = await fetch(fullUrl, { ...params }).catch((e) => {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n });\n const loggingRes = typeof res?.clone === 'function' ? res?.clone() : null;\n info(`[${params.method ?? 'GET'}] ${fullUrl}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n return res;\n } catch (e) {\n if (e instanceof Error) {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n }\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport request from './request';\n\ntype ProviderName =\n | 'discord'\n | 'github'\n | 'google'\n | 'hubspot'\n | 'linkedin'\n | 'slack'\n | 'twitter'\n | 'email'\n | 'credentials'\n | 'azure';\n\nexport type Providers = {\n [providerName in ProviderName]: Provider;\n};\nexport type Provider = {\n id: string;\n name: string;\n type: string;\n signinUrl: string;\n callbackUr: string;\n};\n\nexport type JWT = {\n email: string;\n sub: string;\n id: string;\n iat: number;\n exp: number;\n jti: string;\n};\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: string;\n user?: {\n id: string;\n name: string;\n image: string;\n email: string;\n emailVerified: void | Date;\n };\n};\nexport default async function auth(\n req: Request,\n config: Config\n): Promise<null | undefined | ActiveSession> {\n const { info, error } = Logger(config, '[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.api.basePath}/auth/session`;\n info(`using session${sessionUrl}`);\n // handle the pass through with posts\n req.headers.delete('content-length');\n\n const res = await request(sessionUrl, { request: req }, config);\n if (!res) {\n info('no session found');\n return undefined;\n }\n info('session active');\n try {\n const session = await new Response(res.body).json();\n if (Object.keys(session).length === 0) {\n return undefined;\n }\n return session;\n } catch (e) {\n error(e);\n return undefined;\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 getCallbackUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(process.env.NILEDB_CALLBACK_URL)) {\n return process.env.NILEDB_CALLBACK_URL;\n }\n return config?.api?.callbackUrl;\n};\n\nexport const getSecureCookies = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(process.env.NILEDB_SECURECOOKIES)) {\n return Boolean(process.env.NILEDB_SECURECOOKIES);\n }\n return config?.api?.secureCookies;\n};\n\nexport const getDatabaseId = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[databaseId]');\n if (stringCheck(config?.databaseId)) {\n logger && info(`${logger}[config] ${config?.databaseId}`);\n return String(config?.databaseId);\n }\n const dbFromEnv = stringCheck(process.env.NILEDB_ID);\n\n if (dbFromEnv) {\n logger && info(`${logger}[NILEDB_ID] ${dbFromEnv}`);\n return dbFromEnv;\n }\n\n const dbId = stringCheck(process.env.NILEDB_API_URL);\n if (dbId) {\n try {\n const pgUrl = new URL(dbId);\n return pgUrl.pathname.split('/')[3];\n } catch (e) {\n // ok to fail\n }\n }\n return null;\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 const user = stringCheck(process.env.NILEDB_USER);\n if (user) {\n logger && info(`${logger}[NILEDB_USER] ${user}`);\n return user;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.username) {\n return url.username;\n }\n } catch (e) {\n //ok to fail\n }\n }\n return undefined;\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 (stringCheck(config?.password)) {\n log && info(`${logger}[config] ${config?.password}`);\n return String(config?.password);\n }\n\n const pass = stringCheck(process.env.NILEDB_PASSWORD);\n if (pass) {\n logger && info(`${logger}[NILEDB_PASSWORD] ${pass}`);\n\n return pass;\n }\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.password) {\n return url.password;\n }\n } catch (e) {\n // ok to fail\n }\n }\n return undefined;\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 (stringCheck(config?.api?.token)) {\n logger && info(`${logger}[config] ${config?.api?.token}`);\n return String(config?.api?.token);\n }\n const token = stringCheck(process.env.NILEDB_TOKEN);\n if (token) {\n logger && info(`${logger}[NILEDB_TOKEN] ${token}`);\n return 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 (stringCheck(config?.databaseName)) {\n logger && info(`${logger}[config] ${config?.databaseName}`);\n return String(config?.databaseName);\n }\n const name = stringCheck(process.env.NILEDB_NAME);\n if (name) {\n logger && info(`${logger}[NILEDB_NAME] ${name}`);\n return name;\n }\n\n if (process.env.NILEDB_POSTGRES_URL) {\n try {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n } catch (e) {\n // ok to fail\n }\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 (stringCheck(config?.tenantId)) {\n logger && info(`${logger}[config] ${config?.tenantId}`);\n return String(config?.tenantId);\n }\n\n if (stringCheck(process.env.NILEDB_TENANT)) {\n logger && info(`${logger}[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return String(process.env.NILEDB_TENANT);\n }\n\n return null;\n};\n\nexport const getCookieKey = (cfg: EnvConfig): string => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[cookieKey]');\n if (stringCheck(config?.api?.cookieKey)) {\n logger && info(`${logger}[config] ${config?.api?.cookieKey}`);\n return String(config?.api?.cookieKey);\n }\n\n if (stringCheck(process.env.NILEDB_COOKIE_KEY)) {\n logger &&\n info(`${logger}[NILEDB_COOKIE_KEY] ${process.env.NILEDB_COOKIE_KEY}`);\n return String(process.env.NILEDB_COOKIE_KEY);\n }\n\n return 'token';\n};\n\n/**\n * @param cfg various overrides\n * @returns the url for REST to use\n */\nexport const getBasePath = (cfg: EnvConfig): undefined | string => {\n const { config, logger } = cfg;\n const { warn, info, error } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n if (stringCheck(basePath)) {\n logger && info(`${logger}[config] ${basePath}`);\n return basePath;\n }\n\n const envUrl = stringCheck(process.env.NILEDB_API_URL);\n if (envUrl) {\n logger && info(`${logger}[NILEDB_API_URL] ${process.env.NILEDB_API_URL}`);\n try {\n const apiUrl = new URL(envUrl);\n return apiUrl.href;\n } catch (e) {\n if (e instanceof Error) {\n error(e.stack);\n }\n }\n }\n\n warn('not set. Must run auto-configuration');\n return undefined;\n};\n\nexport const getControlPlane = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n\n if (stringCheck(config?.configureUrl)) {\n logger && info(`${logger}[config] ${config?.configureUrl}`);\n return String(config?.configureUrl);\n }\n\n const autoConfigUrl = stringCheck(process.env.NILEDB_CONFIGURE);\n if (autoConfigUrl) {\n logger &&\n info(`${logger}[NILEDB_CONFIGURE] ${process.env.NILEDB_CONFIGURE}`);\n // backwards compatible, but not really\n if (!autoConfigUrl.startsWith('http')) {\n return `https://${process.env.NILEDB_CONFIGURE}`;\n }\n return process.env.NILEDB_CONFIGURE;\n }\n\n logger && info(`${logger}[default] https://global.thenile.dev`);\n return 'https://global.thenile.dev';\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (stringCheck(config?.db && config.db.host)) {\n logger && info(`${logger}[config] ${config?.db?.host}`);\n return String(config?.db?.host);\n }\n\n if (stringCheck(process.env.NILEDB_HOST)) {\n logger && info(`${logger}[NILEDB_HOST] ${process.env.NILEDB_HOST}`);\n return process.env.NILEDB_HOST;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n logger && info(`${logger}[NILEDB_POSTGRES_URL] ${pgUrl.hostname}`);\n return pgUrl.hostname;\n } catch (e) {\n // ok to fail\n }\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 (stringCheck(process.env.NILEDB_PORT)) {\n logger && info(`${logger}[NILEDB_PORT] ${process.env.NILEDB_PORT}`);\n return Number(process.env.NILEDB_PORT);\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n if (pgUrl.port) {\n return Number(pgUrl.port);\n }\n } catch (e) {\n // ok to fail\n }\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\nconst stringCheck = (str: string | null | undefined) => {\n if (str && str !== '') {\n return str;\n }\n return;\n};\n","import { Routes } from '../../api/types';\nimport {\n Database,\n LoggerType,\n NilePoolConfig,\n ServerConfig,\n} from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getControlPlane,\n getDatabaseName,\n getDatabaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n getSecureCookies,\n getCallbackUrl,\n getCookieKey,\n} from './envVars';\n\nexport type ApiParams = {\n basePath?: string | undefined;\n cookieKey?: string;\n token?: string | undefined;\n callbackUrl?: string | undefined;\n routes?: Partial<Routes>;\n routePrefix?: string | undefined;\n secureCookies?: boolean;\n // the origin for the requests. Allows the setting of the callback origin to a random FE (eg FE localhost:3001 -> BE: localhost:5432 would set to localhost:3000)\n origin?: null | undefined | string;\n};\nexport class ApiConfig {\n public cookieKey?: string;\n public basePath?: string | undefined;\n public routes?: Partial<Routes>;\n public routePrefix?: string;\n public secureCookies?: boolean;\n public origin?: string | null;\n\n /**\n * The client side callback url. Defaults to nothing (so nile.origin will be it), but in the cases of x-origin, you want to set this explicitly to be sure nile-auth does the right thing\n * If this is set, any `callbackUrl` from the client will be ignored.\n */\n public callbackUrl?: string;\n\n private _token?: string;\n constructor(config?: ServerConfig, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n\n this.cookieKey = getCookieKey(envVarConfig);\n this._token = getToken(envVarConfig);\n this.callbackUrl = getCallbackUrl(envVarConfig);\n this.secureCookies = getSecureCookies(envVarConfig);\n this.basePath = getBasePath(envVarConfig);\n\n this.routes = config?.api?.routes;\n this.routePrefix = config?.api?.routePrefix;\n this.origin = config?.api?.origin;\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 logger?: LoggerType;\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, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n this.user = getUsername(envVarConfig) as string;\n this.logger = config?.logger;\n this.password = getPassword(envVarConfig) as string;\n if (process.env.NODE_ENV !== 'TEST') {\n if (!this.user) {\n throw new Error(\n 'User is required. Set NILEDB_USER as an environment variable or set `user` in the config options.'\n );\n }\n if (!this.password) {\n throw new Error(\n 'Password is required. Set NILEDB_PASSWORD as an environment variable or set `password` in the config options.'\n );\n }\n }\n\n this.databaseId = getDatabaseId(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 { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.api = new ApiConfig(config, logger);\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, debug } = 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 let basePath = getBasePath(envVarConfig);\n if (configuredHost && this.databaseName && this.databaseId && basePath) {\n info('Already configured, aborting fetch');\n this.api = new ApiConfig(config);\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]', { db: this.db, api: this.api });\n return this;\n } else {\n const msg = [];\n if (!configuredHost) {\n msg.push('Database host');\n }\n if (!this.databaseName) {\n msg.push('Database name');\n }\n if (!this.databaseId) {\n msg.push('Database id');\n }\n if (!basePath) {\n msg.push('API URL');\n }\n info(\n `[autoconfigure] ${msg.join(', ')} ${\n msg.length > 1 ? 'are' : 'is'\n } missing from the config. Autoconfiguration will run.`\n );\n }\n\n const cp = getControlPlane(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${cp}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info(`configuring from ${url.href}`);\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${getInfoBearer({ config })}`,\n },\n }).catch(() => {\n error(`Unable to auto-configure. is ${url} available?`);\n });\n if (!res) {\n return this;\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 debug('Unable to auto-configure');\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 occurred');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please remove NILEDB_NAME, NILEDB_API_URL, NILEDB_POSTGRES_URL, and/or NILEDB_HOST from your environment variables.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n basePath = basePath || apiHost;\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n configuredHost = dburl.hostname;\n }\n }\n this.api = new ApiConfig(config);\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]', { db: this.db, api: this.api });\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 private events: { [key: string]: EventFn[] } = {};\n\n // Publish event and notify all subscribers\n publish(eventName: string, value: BusValues) {\n const callbackList = this.events[eventName];\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n }\n\n // Unsubscribe from an event\n unsubscribe(eventName: string, callback: EventFn) {\n const callbackList = this.events[eventName];\n\n if (!callbackList) {\n return; // Early exit if no event exists\n }\n\n const index = callbackList.indexOf(callback);\n if (index !== -1) {\n callbackList.splice(index, 1); // Remove the callback\n }\n\n // If there are no more listeners, clean up the event\n if (callbackList.length === 0) {\n delete this.events[eventName];\n }\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);\n\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import pg 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: pg.Pool, config: Config): pg.Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<pg.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('query', ...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 pg.Pool;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pg 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: pg.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, debug } = 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 debug(`Connection pool config ${JSON.stringify(this.config.db)}`);\n\n this.pool = createProxyForPool(new pg.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 debug(`pool connected ${this.id}`);\n this.startTimeout();\n const afterCreate: AfterCreate = makeAfterCreate(\n config,\n `${this.id}-${this.timer}`\n );\n afterCreate(client, (err) => {\n const { error } = Logger(config, '[after create callback]');\n if (err) {\n clearTimeout(this.timer);\n error('after create failed', {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n }\n });\n });\n this.pool.on('error', (err) => {\n clearTimeout(this.timer);\n info(`pool ${this.id} failed`, {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n });\n this.pool.on('release', (destroy) => {\n if (destroy) {\n clearTimeout(this.timer);\n evictPool(this.id);\n debug(`destroying pool ${this.id}`);\n }\n });\n }\n\n startTimeout() {\n const { debug } = Logger(this.config, '[NileInstance]');\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n debug(\n `Pool reached idleTimeoutMillis. ${this.id} evicted after ${\n Number(this.config.db.idleTimeoutMillis) ?? 30000\n }ms`\n );\n this.pool.end(() => {\n clearTimeout(this.timer);\n evictPool(this.id);\n });\n }, Number(this.config.db.idleTimeoutMillis) ?? 30000);\n }\n shutdown() {\n const { debug } = Logger(this.config, '[NileInstance]');\n debug(`attempting to shut down ${this.id}`);\n clearTimeout(this.timer);\n this.pool.end(() => {\n debug(`${this.id} has been shut down`);\n });\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config, id: string): AfterCreate {\n const { error, warn, debug } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(e: Error) {\n error(`Connection ${id} was terminated by server`, {\n message: e.message,\n stack: e.stack,\n });\n done(e, 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 (err) {\n error('query connection failed', {\n cause: err.cause,\n stack: err.stack,\n message: err.message,\n name: err.name,\n id,\n });\n } else {\n if (query.length === 1) {\n debug(`connection context set: tenantId=${config.tenantId}`);\n }\n if (query.length === 2) {\n debug(\n `connection context set: tenantId=${config.tenantId} userId=${config.userId}`\n );\n }\n }\n\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import pg 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 cleared: boolean;\n private poolWatcherFn: (id: undefined | null | string) => void;\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 this.cleared = false;\n this.connections = new Map();\n this.poolWatcherFn = this.poolWatcher(config);\n watchEvictPool(this.poolWatcherFn);\n }\n poolWatcher = (config: ServerConfig) => (id: undefined | null | string) => {\n const { info, warn } = Logger(config, '[DBManager]');\n if (id && this.connections.has(id)) {\n info(`Removing ${id} from db connection pool.`);\n const connection = this.connections.get(id);\n connection?.shutdown();\n this.connections.delete(id);\n } else {\n warn(`missed eviction of ${id}`);\n }\n };\n\n getConnection = (config: ServerConfig): pg.Pool => {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n\n const existing = this.connections.get(id);\n info(`# of instances: ${this.connections.size}`);\n if (existing) {\n info(`returning existing ${id}`);\n existing.startTimeout();\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 if (this.cleared) {\n this.cleared = false;\n }\n return newOne.pool;\n };\n\n clear = (config: ServerConfig) => {\n const { info } = Logger(config, '[DBManager]');\n info(`Clearing all connections ${this.connections.size}`);\n this.cleared = true;\n this.connections.forEach((connection) => {\n connection.shutdown();\n });\n this.connections.clear();\n };\n}\n","import { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\n\nfunction filterNullUndefined(\n obj?: Record<string, string | null>\n): { [k: string]: string | null } | undefined {\n if (!obj) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value !== null && value !== undefined\n )\n );\n}\n\nexport function makeRestUrl(\n config: Config,\n path: string,\n qp?: Record<string, string | null>\n) {\n const url = config.api.basePath || NILEDB_API_URL;\n if (!url) {\n throw new Error(\n 'An API url is required. Set it via NILEDB_API_URL. Was auto configuration run?'\n );\n }\n const params = new URLSearchParams(\n filterNullUndefined(qp) as Record<string, string>\n );\n const strParams = params.toString();\n return `${[url, path.substring(1, path.length)].join('/')}${\n strParams ? `?${strParams}` : ''\n }`;\n}\n","import { Config } from '../../../utils/Config';\n\nimport { makeRestUrl } from './makeRestUrl';\n\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\nexport const apiRoutes = (config: Config) => ({\n ME: makeRestUrl(config, '/me'),\n USERS: (qp: { tenantId?: null | string; newTenantName?: null | string }) =>\n makeRestUrl(config, '/users', qp),\n USER: (userId: string) => makeRestUrl(config, `/users/${userId}`),\n TENANTS: makeRestUrl(config, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(config, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(config, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users`),\n TENANT_USER: (tenantId: string, userId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users/${userId}`),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(config, `/users/${userId}/tenants`),\n});\n","import { Routes } from '../../types';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\n\nconst key = 'ME';\n\n/**\n * @swagger\n * /api/me:\n * get:\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: me\n * responses:\n * \"200\":\n * description: Identified user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nasync function GET(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n const res = await request(url, init, config);\n return res;\n}\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config)[key];\n\n switch (request.method) {\n case 'GET':\n return await GET(url, { request }, config);\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\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';\nimport {\n X_NILE_ORIGIN,\n X_NILE_SECURECOOKIES,\n X_NILE_TENANT,\n X_NILE_USER_ID,\n} from './constants';\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, X_NILE_TENANT);\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 function makeBasicHeaders(config: Config, opts?: RequestInit) {\n const headers = new Headers(opts?.headers);\n headers.set('content-type', 'application/json; charset=utf-8');\n const cookieKey = config.api?.cookieKey;\n\n // the sdk server side calls use this\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n } else if (getToken({ config })) {\n headers.set('Authorization', `Bearer ${getToken({ config })}`);\n }\n }\n if (config && config.api.secureCookies != null) {\n headers.set(X_NILE_SECURECOOKIES, String(config.api.secureCookies));\n }\n\n if (config && config.api.origin) {\n headers.set(X_NILE_ORIGIN, config.api.origin);\n }\n return headers;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const { debug, error } = Logger(config, '[server]');\n\n const url = `${config.api?.basePath}${path}`;\n const headers = new Headers(opts?.headers);\n const tenantId = getTenantFromHttp(headers, config);\n const basicHeaders = makeBasicHeaders(config, opts);\n updateTenantId(tenantId);\n const userId = getUserFromHttp(headers, config);\n updateUserId(userId);\n\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 debug(`[fetch] ${useableUrl}`);\n\n try {\n const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n error('[fetch][response]', {\n message: e.message,\n stack: e.stack,\n debug: 'Is nile-auth running?',\n });\n return new Error(e);\n });\n\n if (response instanceof Error) {\n return new ResponseError('Failed to connect to database', {\n status: 400,\n });\n }\n if (response && response.status >= 200 && response.status < 300) {\n if (typeof response.clone === 'function') {\n try {\n debug(\n `[fetch][response][${opts?.method ?? 'GET'}] ${\n response.status\n } ${useableUrl}`,\n {\n body: await response.clone().json(),\n }\n );\n } catch (e) {\n debug(\n `[fetch][response][${opts?.method ?? 'GET'}] ${\n response.status\n } ${useableUrl}`,\n {\n body: await response.clone().text(),\n }\n );\n }\n }\n return response;\n }\n if (response?.status === 404) {\n return new ResponseError('Not found', { status: 404 });\n }\n\n if (response?.status === 401) {\n return new ResponseError('Unauthorized', { status: 401 });\n }\n if (response?.status === 405) {\n return new ResponseError('Method not allowed', { status: 405 });\n }\n const errorHandler =\n typeof response?.clone === 'function' ? response.clone() : null;\n let msg = '';\n const res = await (response as Response)?.json().catch(async (e) => {\n if (errorHandler) {\n msg = await errorHandler.text();\n if (msg) {\n error(`[fetch][response][status: ${errorHandler.status}]`, {\n message: msg,\n });\n }\n return e as ResponseError;\n }\n if (!msg) {\n error('[fetch][response]', { e });\n }\n return 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(`[fetch][response][status: ${errorHandler?.status}] ${message}`);\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n error(`[fetch][response] [status: ${errorHandler?.status}] ${message}`);\n return new ResponseError(message, { status: 400 });\n }\n error(\n `[fetch][response][status: ${errorHandler?.status}] UNHANDLED ERROR`,\n {\n response,\n message: await response.text(),\n }\n );\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n } catch (e) {\n return new ResponseError('an unexpected error has occurred', {\n status: 500,\n });\n }\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport { Config } from '../../../utils/Config';\n/**\n * @swagger\n * /api/users:\n * post:\n * tags:\n * - users\n * summary: Creates a user\n * description: Creates a user in the database\n * operationId: createUser\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const newTenantName = yurl.searchParams.get('newTenantName');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes(config).USERS({ tenantId: tenant, newTenantName });\n\n return await request(url, init, config);\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport { Config } from '../../../utils/Config';\n\n/**\n * @swagger\n * /api/users:\n * get:\n * tags:\n * - users\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided. You can also pass the a `nile.tenant_id` in the header or in a cookie.\n * operationId: listUsers\n * parameters:\n * - name: tenantId\n * in: query\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/TenantUser'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n const url = apiRoutes(config).TENANT_USERS(tenant);\n init.method = 'GET';\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes/apiRoutes';\nimport fetch from '../../../utils/request';\nimport { ActiveSession } from '../../../utils/auth';\nimport { Config } from '../../../../utils/Config';\n\n/**\n * @swagger\n * /api/users/{userid}:\n * put:\n * tags:\n * - users\n * summary: update a user\n * description: updates a user within the tenant\n * operationId: updateUser\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * Update a user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/UpdateUserRequest'\n * responses:\n * \"200\":\n * description: An updated user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n config: Config,\n session: null | undefined | ActiveSession,\n init: RequestInit & { request: Request }\n) {\n if (!session) {\n return new Response(null, { status: 401 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n\n // update the user\n\n const [userId] = new URL(init.request.url).pathname.split('/').reverse();\n\n const url = apiRoutes(config).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport auth from '../../utils/auth';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nimport { POST } from './POST';\nimport { GET } from './GET';\nimport { PUT } from './[userId]/PUT';\n\nconst key = 'USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request }, info);\n case 'POST':\n return await POST(config, { request });\n case 'PUT':\n return await PUT(config, session, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * get:\n * tags:\n * - users\n * summary: List tenant users\n * description: Lists users that are associated with the specified tenant.\n * operationId: listTenantUsers\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: Users found\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/User'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import { ActiveSession } from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport { Config } from '../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * post:\n * tags:\n * - users\n * summary: Create a user in a tenant\n * description: Creates a new user and associates that user with the specified\n * tenant.\n * operationId: createTenantUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n */\nexport async function POST(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n init.body = JSON.stringify({ email: session.email });\n init.method = 'PUT';\n const url = apiRoutes(config).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{email}:\n * delete:\n * tags:\n * - tenants\n * summary: removes a user from a tenant\n * description: removes an associated user from a specified\n * tenant.\n * operationId: unlinkUser \n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: email \n * in: path\n * required: true\n * schema:\n * type: string\n \n * responses:\n * \"204\":\n * description: User removed\n */\n\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [userId, _, tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'DELETE';\n init.body = JSON.stringify({ email: userId });\n const url = `${apiRoutes(config).TENANT_USER(tenantId, userId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../utils/request';\nimport { Config } from '../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * put:\n * tags:\n * - tenants\n * summary: associates an existing user with the tenant\n * operationId: linkUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email of the user you want to add to a tenant.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/AssociateUserRequest'\n * responses:\n * \"201\":\n * description: add user to tenant\n */\n\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport urlMatches from '../../../../utils/routes/urlMatches';\nimport { Routes } from '../../../../types';\nimport auth from '../../../../utils/auth';\nimport Logger from '../../../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\nimport { DELETE } from './[userId]/DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n if (!tenantId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\n case 'POST':\n return await POST(config, session, { request });\n case 'PUT':\n return await PUT(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * get:\n * tags:\n * - tenants\n * summary: list tenants by user\n * description: Creates a user in the database\n * operationId: listTenants\n * responses:\n * \"200\":\n * description: a list of tenants\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: \"#/components/schemas/Tenant\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n let url = `${apiRoutes(config).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config).USER_TENANTS(session.user.id)}`;\n }\n\n const res = await request(url, init, config);\n return res;\n}\n","import { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * get:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: getTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: the desired tenant\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n\n init.method = 'GET';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes a tenant.\n * operationId: deleteTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * put:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: updateTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: update an existing tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * post:\n * tags:\n * - tenants\n * summary: Create a tenant\n * description: Creates a new tenant in a database.\n * operationId: createTenant\n * requestBody:\n * description: A wrapper for the tenant name.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateTenantRequest'\n * examples:\n * Create Tenant Request:\n * summary: Creates a named tenant\n * description: Create Tenant Request\n * value:\n * name: My Sandbox\n * responses:\n * \"201\":\n * description: Tenant created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Database not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport Logger from '../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { GET as TENANT_GET } from './[tenantId]/GET';\nimport { DELETE } from './[tenantId]/DELETE';\nimport { PUT } from './[tenantId]/PUT';\nimport { POST } from './POST';\n\nfunction isUUID(value: string | null | undefined) {\n if (!value) {\n return false;\n }\n // is any UUID\n const regex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5|7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\n return regex.test(value);\n}\n\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const [possibleTenantId] = request.url.split('/').reverse();\n\n switch (request.method) {\n case 'GET':\n if (isUUID(possibleTenantId)) {\n return await TENANT_GET(config, { request }, info);\n }\n return await GET(config, session, { request });\n case 'POST':\n return await POST(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n case 'PUT':\n return await PUT(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Config } from '../../../utils/Config';\n\nimport { makeRestUrl } from './makeRestUrl';\n\nexport const proxyRoutes = (config: Config) => ({\n SIGNIN: makeRestUrl(config, '/auth/signin'),\n PROVIDERS: makeRestUrl(config, '/auth/providers'),\n SESSION: makeRestUrl(config, '/auth/session'),\n CSRF: makeRestUrl(config, '/auth/csrf'),\n CALLBACK: makeRestUrl(config, '/auth/callback'),\n SIGNOUT: makeRestUrl(config, '/auth/signout'),\n ERROR: makeRestUrl(config, '/auth/error'),\n VERIFY_REQUEST: makeRestUrl(config, '/auth/verify-request'),\n PASSWORD_RESET: makeRestUrl(config, '/auth/reset-password'),\n});\n\ntype ProxyKeys = keyof typeof proxyRoutes;\n\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n","/**\n * @swagger\n * /api/auth/signin:\n * get:\n * tags:\n * - authentication\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided\n * operationId: signin\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config)[key]}/${provider}`;\n }\n\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n\n url = `${url}${params.toString() !== '' ? `?${params.toString()}` : ''}`;\n\n const res = await request(url, { ...init, request: req }, config);\n\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).SESSION,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.SESSION);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).PROVIDERS,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PROVIDERS);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).CSRF,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CSRF);\n}\n","import { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nconst key = 'CALLBACK';\n\nexport default async function route(req: Request, config: Config) {\n const { error } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n try {\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config)[key]}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await request(\n url,\n {\n request: req,\n method: req.method,\n },\n config\n ).catch((e) => {\n error('an error as occurred', e);\n });\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n } catch (e) {\n error(e);\n }\n return new Response('An unexpected error has occurred.', { status: 400 });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport fetch from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: request.method,\n };\n if (request.method === 'POST') {\n init.body = request.body;\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n url = `${proxyRoutes(config)[key]}${\n provider !== 'signout' ? `/${provider}` : ''\n }`;\n }\n\n const res = await fetch(url, { ...init, request }, config);\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_REQUEST';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'PASSWORD_RESET';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PASSWORD_RESET);\n}\n","import Logger from '../../utils/Logger';\nimport me, { matches as matchesMe } from '../routes/me';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[GET MATCHER]');\n return async function GET(req: Request) {\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n if (authRoutes.matchesVerifyRequest(configRoutes, req)) {\n info('matches verify-request');\n return authRoutes.handleVerifyRequest(req, config);\n }\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn('No GET routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/signup:\n * post:\n * tags:\n * - users\n * summary: signs a user up\n * description: signs a user up and logs them in. Expects a email and password combo\n * operationId: signUp\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User and session created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).SIGNUP}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\n\nimport { POST } from './POST';\n\nconst key = 'SIGNUP';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'POST':\n return await POST(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import Logger, { matchesLog } from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport signup, { matches as matchesSignup } from '../routes/signup';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport * as authRoutes from '../routes/auth';\n\nexport default function POSTER(configRoutes: Routes, config: Config) {\n const { info, warn, error } = Logger(config, '[POST MATCHER]');\n return async function POST(req: Request) {\n // special case for logging client errors\n if (matchesLog(configRoutes, req)) {\n if (req.body) {\n try {\n const text = await req.text();\n error(text);\n return new Response(null, {\n status: 200,\n });\n } catch (e) {\n //noop\n }\n }\n }\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesSignup(configRoutes, req)) {\n info('matches signup');\n return signup(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n warn('No POST routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantsUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[DELETE MATCHER]');\n return async function DELETE(req: Request) {\n if (matchesTenantsUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { handlePasswordReset, matchesPasswordReset } from '../routes/auth';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[PUT MATCHER]');\n return async function PUT(req: Request) {\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesPasswordReset(configRoutes, req)) {\n info('matches reset password');\n return handlePasswordReset(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../utils/Config';\nimport { Routes } from '../types';\n\nimport getter from './GET';\nimport poster from './POST';\nimport deleter from './DELETE';\nimport puter from './PUT';\n\nexport default function Handlers(configRoutes: Routes, config: Config) {\n const GET = getter(configRoutes, config);\n const POST = poster(configRoutes, config);\n const DELETE = deleter(configRoutes, config);\n const PUT = puter(configRoutes, config);\n return {\n GET,\n POST,\n DELETE,\n PUT,\n };\n}\n","import { Routes } from '../../types';\n\nexport const appRoutes = (prefix = '/api'): Routes => ({\n SIGNIN: `${prefix}/auth/signin`,\n PROVIDERS: `${prefix}/auth/providers`,\n SESSION: `${prefix}/auth/session`,\n CSRF: `${prefix}/auth/csrf`,\n CALLBACK: `${prefix}/auth/callback`,\n SIGNOUT: `${prefix}/auth/signout`,\n ERROR: `${prefix}/auth/error`,\n VERIFY_REQUEST: `${prefix}/auth/verify-request`,\n PASSWORD_RESET: `${prefix}/auth/reset-password`,\n ME: `${prefix}/me`,\n USERS: `${prefix}/users`,\n TENANTS: `${prefix}/tenants`,\n TENANT: `${prefix}/tenants/{tenantId}`,\n TENANT_USER: `${prefix}/tenants/{tenantId}/users/{userId}`,\n TENANT_USERS: `${prefix}/tenants/{tenantId}/users`,\n SIGNUP: `${prefix}/signup`,\n LOG: `${prefix}/_log`,\n});\n","import { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT } from '../constants';\nimport { _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'DELETE' | '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 body,\n method,\n ...init,\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 options 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 async post<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('POST', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n const cloned = response.clone();\n try {\n return await cloned.json();\n } catch (e) {\n // give back the response\n }\n }\n return response;\n }\n\n async get<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit,\n raw = false\n ): Promise<Response | R> {\n const response = await this.request('GET', url, req, init);\n if (raw) {\n return response;\n }\n if (response && response.status >= 200 && response.status < 300) {\n const cloned = response.clone();\n try {\n return await cloned.json();\n } catch (e) {\n // give back the response\n }\n }\n return response;\n }\n\n async put<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('PUT', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n const cloned = response.clone();\n try {\n return await cloned.json();\n } catch (e) {\n // give back the response\n }\n }\n return response;\n }\n\n async delete(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> {\n const response = await this.request('DELETE', url, req, init);\n return response;\n }\n}\n","import { ActiveSession, JWT, Provider } from '../api/utils/auth';\nimport { appRoutes } from '../api/utils/routes/defaultRoutes';\nimport { Config } from '../utils/Config';\nimport { X_NILE_ORIGIN } from '../utils/constants';\nimport Logger from '../utils/Logger';\nimport Requester, { NileRequest } from '../utils/Requester';\n\n/**\n * a helper function to log in server side.\n */\nexport function serverLogin(\n config: Config,\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n }\n) {\n const ORIGIN = config.api.origin ?? 'http://localhost:3000';\n const { info, error, debug } = Logger(config, '[server side login]');\n const routes = appRoutes(config.api.routePrefix);\n return async function login<T extends [Headers, Response]>({\n email,\n password,\n }: {\n email: string;\n password: string;\n }) {\n if (!email || !password) {\n throw new Error('Server side login requires a user email and password.');\n }\n\n const sessionUrl = new URL(`${ORIGIN}${routes.PROVIDERS}`);\n const baseHeaders = {\n host: sessionUrl.host,\n [X_NILE_ORIGIN]: ORIGIN,\n };\n info(`Obtaining providers for ${email}`);\n const sessionReq = new Request(sessionUrl, {\n method: 'GET',\n ...baseHeaders,\n });\n const sessionRes = await handlers.POST(sessionReq);\n\n if (sessionRes?.status === 404) {\n throw new Error('Unable to login, cannot find region api.');\n }\n\n let providers;\n try {\n providers = await sessionRes?.json();\n } catch (e) {\n info(sessionUrl, { sessionRes });\n error(e);\n }\n\n info('Obtaining csrf');\n const csrf = new URL(`${ORIGIN}${routes.CSRF}`);\n const csrfReq = new Request(csrf, {\n method: 'GET',\n headers: new Headers({\n ...baseHeaders,\n }),\n });\n const csrfRes = await handlers.POST(csrfReq);\n let csrfToken;\n try {\n const json = (await csrfRes?.json()) ?? {};\n csrfToken = json?.csrfToken;\n } catch (e) {\n info(sessionUrl, { csrfRes });\n error(e, { csrfRes });\n }\n\n const { credentials } = providers ?? {};\n\n const csrfCookie = csrfRes?.headers.get('set-cookie');\n\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side login.'\n );\n }\n const signInUrl = new URL(credentials.callbackUrl);\n\n if (!csrfCookie) {\n debug('CSRF failed', { headers: csrfRes?.headers });\n throw new Error('Unable to authenticate REST, CSRF missing.');\n }\n info(`Attempting sign in with email ${email} ${signInUrl.href}`);\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n const postReq = new Request(signInUrl, {\n method: 'POST',\n headers: new Headers({\n ...baseHeaders,\n 'content-type': 'application/json',\n cookie: csrfCookie.split(',').join('; '),\n }),\n body,\n });\n\n const loginRes = await handlers.POST(postReq);\n const authCookie = loginRes?.headers.get('set-cookie');\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n\n const token = parseToken(loginRes?.headers);\n if (!token) {\n error('Unable to obtain auth token', { authCookie });\n throw new Error('Server login failed');\n }\n info('Server login successful', { authCookie, csrfCookie });\n const headers = new Headers({\n ...baseHeaders,\n cookie: [token, csrfCookie].join('; '),\n });\n return [headers, loginRes] as T;\n };\n}\n\nexport function parseToken(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.session-token=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\nexport default class Auth extends Config {\n headers?: Headers;\n resetHeaders?: (headers?: Headers) => void;\n constructor(\n config: Config,\n headers?: Headers,\n params?: { resetHeaders: () => void }\n ) {\n super(config);\n this.logger = Logger(config, '[auth]');\n this.headers = headers;\n this.logger = Logger(config, '[auth]');\n this.resetHeaders = params?.resetHeaders;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n const cburl = getCallbackUrl(this.headers);\n if (cburl) {\n try {\n this.headers.set(X_NILE_ORIGIN, new URL(cburl).origin);\n } catch (e) {\n if (this.logger?.debug) {\n this.logger.debug('Invalid URL supplied by cookie header');\n }\n }\n }\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n\n get sessionUrl() {\n return '/auth/session';\n }\n\n getSession = async <T = JWT | ActiveSession | Response | undefined>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n const session = await _requester.get(req, this.sessionUrl, _init);\n if (Object.keys(session).length === 0) {\n return undefined as T;\n }\n return session as T;\n };\n\n get getCsrfUrl() {\n return '/auth/csrf';\n }\n\n async getCsrf<T = Response | JSON>(\n req: NileRequest<void> | Headers,\n init?: RequestInit,\n raw = false\n ) {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.getCsrfUrl, _init, raw)) as T;\n }\n get listProvidersUrl() {\n return '/auth/providers';\n }\n\n listProviders = async <T = Response | { [key: string]: Provider }>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.listProvidersUrl, _init)) as T;\n };\n\n get signOutUrl() {\n return '/auth/signout';\n }\n\n signOut = async <T = Response | { url: string }>(\n req: NileRequest<void | { callbackUrl?: string }> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n\n const csrf = await this.getCsrf<Response>(\n req as NileRequest<void>,\n undefined,\n true\n );\n const csrfHeader = getCsrfToken(csrf.headers, this.headers);\n const callbackUrl =\n req && 'callbackUrl' in req ? String(req.callbackUrl) : '/';\n\n if (!csrfHeader) {\n this.logger?.debug &&\n this.logger.debug('Request blocked from invalid csrf header');\n return new Response('Request blocked', { status: 400 }) as T;\n }\n\n const headers = new Headers(_init?.headers);\n const { csrfToken } = (await csrf.json()) ?? {};\n const cooks = getCookies(headers);\n if (csrfHeader) {\n if (cooks['__Secure-nile.csrf-token']) {\n cooks['__Secure-nile.csrf-token'] = encodeURIComponent(csrfHeader);\n }\n if (cooks['nile.csrf-token']) {\n cooks['nile.csrf-token'] = encodeURIComponent(csrfHeader);\n }\n }\n\n headers.set(\n 'cookie',\n Object.keys(cooks)\n .map((key) => `${key}=${cooks[key]}`)\n .join('; ')\n );\n\n const res = await _requester.post(req, this.signOutUrl, {\n method: 'post',\n body: JSON.stringify({\n csrfToken,\n callbackUrl,\n json: String(true),\n }),\n ..._init,\n headers,\n });\n\n this.resetHeaders && this.resetHeaders();\n\n return res as T;\n };\n}\nfunction getCallbackUrl(headers: Headers | void): string | void {\n if (headers) {\n const cookies = getCookies(headers);\n if (cookies) {\n return (\n cookies['__Secure-nile.callback-url'] || cookies['nile.callback-url']\n );\n }\n }\n}\n\nfunction getCsrfToken(\n headers: Headers | void,\n initHeaders: Headers | void\n): string | void {\n if (headers) {\n const cookies = getCookies(headers);\n let validCookie = '';\n if (cookies) {\n validCookie =\n cookies['__Secure-nile.csrf-token'] || cookies['nile.csrf-token'];\n }\n if (validCookie) {\n return validCookie;\n }\n }\n if (initHeaders) {\n const cookies = getCookies(initHeaders);\n if (cookies) {\n return cookies['__Secure-nile.csrf-token'] || cookies['nile.csrf-token'];\n }\n }\n}\n\nconst getCookies = (headers: Headers | void): Record<string, string> => {\n if (!headers) return {};\n\n // Get 'cookie' and 'set-cookie' headers\n const cookieHeader = headers.get('cookie') || '';\n const setCookieHeaders = headers.get('set-cookie') || '';\n\n // Merge both headers into an array\n const allCookies = [\n ...cookieHeader.split('; '), // Regular 'cookie' header (semicolon-separated)\n ...setCookieHeaders.split(/,\\s*(?=[^;, ]+=)/), // Smart split for 'set-cookie'\n ].filter(Boolean); // Remove empty entries\n\n // Convert cookies into an object\n return Object.fromEntries(\n allCookies.map((cookie) => {\n const [key, ...val] = cookie.split('=');\n return [\n decodeURIComponent(key.trim()),\n decodeURIComponent(val.join('=').trim()),\n ];\n })\n );\n};\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest } from '../utils/Requester';\n\nimport { Tenant } from './types';\n\nexport default class Tenants extends Config {\n headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n get tenantsUrl() {\n return '/tenants';\n }\n get tenantUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}`;\n }\n\n createTenant = async <T = Tenant | Response>(\n req: NileRequest<{ name: string }> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n let _req;\n if (typeof req === 'string') {\n _req = new Request(`${this.api.basePath}${this.tenantsUrl}`, {\n body: JSON.stringify({ name: req }),\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n });\n } else {\n _req = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.post(_req, this.tenantsUrl, _init) as T;\n };\n\n getTenant = async <T = Tenant | Response>(\n req: NileRequest<{ id: string }> | Headers | string | void,\n init?: RequestInit\n ): Promise<T> => {\n if (typeof req === 'string') {\n this.tenantId = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.get<Tenant>(req, this.tenantUrl, _init) as T;\n };\n\n get tenantListUrl() {\n return `/users/${this.userId ?? '{userId}'}/tenants`;\n }\n\n listTenants = async <T = Tenant[] | Response>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.get<Tenant[]>(req, this.tenantListUrl, _init) as T;\n };\n\n deleteTenant = async <T = Response>(\n req: NileRequest<void> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n if (typeof req === 'string') {\n this.tenantId = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.delete(req, this.tenantUrl, _init) as T;\n };\n updateTenant = async <T = Tenant | Response>(\n req: NileRequest<void> | Headers | { name: string },\n init?: RequestInit\n ): Promise<T> => {\n let _req;\n if (req && 'name' in req) {\n _req = new Request(`${this.api.basePath}${this.tenantUrl}`, {\n body: JSON.stringify(req),\n method: 'PUT',\n });\n } else {\n _req = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.put<Tenant>(_req, this.tenantUrl, _init) as T;\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest } from '../utils/Requester';\n\nimport { CreateBasicUserRequest, CreateTenantUserRequest, User } from './types';\n\nexport default class Users extends Config {\n headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n\n usersUrl(user: CreateBasicUserRequest) {\n const params = new URLSearchParams();\n if (user.newTenantName) {\n params.set('newTenantName', user.newTenantName);\n }\n if (user.tenantId) {\n params.set('tenantId', user.tenantId);\n }\n return `/users?${params.size > 0 ? params : ''}`;\n }\n\n get tenantUsersUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n get linkUsersUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users/${\n this.userId ?? '{userId}'\n }/link`;\n }\n\n get tenantUserUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users/${\n this.userId ?? '{userId}'\n }`;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n\n createUser = async <T = User | Response>(\n user: CreateBasicUserRequest,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n\n const _init = this.handleHeaders(init);\n return (await _requester.post(user, this.usersUrl(user), _init)) as T;\n };\n\n createTenantUser = async <T = User | Response>(\n req: NileRequest<CreateTenantUserRequest>,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n\n const _init = this.handleHeaders(init);\n return (await _requester.post(req, this.tenantUsersUrl, _init)) as T;\n };\n\n updateUser = async <T = User[] | Response>(\n req: NileRequest<\n Partial<Omit<User, 'email' | 'tenants' | 'created' | 'updated'>>\n >,\n init?: RequestInit\n ): Promise<T> => {\n let _req;\n if (req && 'id' in req) {\n _req = new Request(`${this.api.basePath}${this.tenantUserUrl}`, {\n body: JSON.stringify(req),\n method: 'PUT',\n });\n this.userId = String(req.id);\n } else {\n _req = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.put(_req, this.tenantUserUrl, _init)) as T;\n };\n\n listUsers = async <T = User[] | Response>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.tenantUsersUrl, _init)) as T;\n };\n\n linkUser = async <T = User | Response>(\n req: NileRequest<{ id: string; tenantId?: string }> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n if (typeof req === 'string') {\n this.userId = req;\n } else {\n if ('id' in req) {\n this.userId = req.id;\n }\n if ('tenantId' in req) {\n this.tenantId = req.tenantId;\n }\n }\n\n const _init = this.handleHeaders(init);\n return (await _requester.put(req, this.linkUsersUrl, _init)) as T;\n };\n\n unlinkUser = async <T = Response>(\n req: NileRequest<{ id: string; tenantId?: string }> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n if (typeof req === 'string') {\n this.userId = req;\n } else {\n if ('id' in req) {\n this.userId = req.id;\n }\n if ('tenantId' in req) {\n this.tenantId = req.tenantId;\n }\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.delete(req, this.linkUsersUrl, _init)) as T;\n };\n\n get meUrl() {\n return '/me';\n }\n\n me = async <T = User | Response>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.meUrl, _init)) as T;\n };\n updateMe = async <T = User | Response>(\n req:\n | NileRequest<\n Partial<\n Omit<User, 'email' | 'id' | 'tenants' | 'created' | 'updated'>\n >\n >\n | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.put(req, this.meUrl, _init)) as T;\n };\n}\n","import Handlers from './api/handlers';\nimport { Routes } from './api/types';\nimport auth from './api/utils/auth';\nimport { appRoutes } from './api/utils/routes/defaultRoutes';\nimport Auth, { parseToken, serverLogin } from './auth';\nimport Tenants from './tenants';\nimport Users from './users';\nimport { Config } from './utils/Config';\n\nexport class Api {\n config: Config;\n users: Users;\n auth: Auth;\n tenants: Tenants;\n routes: Routes;\n #headers: undefined | Headers;\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n };\n paths: {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n };\n constructor(config: Config) {\n this.config = config;\n this.auth = new Auth(config, undefined, {\n resetHeaders: this.resetHeaders,\n });\n this.users = new Users(config);\n this.tenants = new Tenants(config);\n this.routes = {\n ...appRoutes(config?.api.routePrefix),\n ...config?.api.routes,\n };\n\n this.handlers = Handlers(this.routes, config);\n this.paths = {\n get: [\n this.routes.ME,\n this.routes.TENANT_USERS,\n this.routes.TENANTS,\n this.routes.TENANT,\n this.routes.SESSION,\n this.routes.SIGNIN,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n this.routes.PASSWORD_RESET,\n this.routes.CALLBACK,\n this.routes.SIGNOUT,\n this.routes.VERIFY_REQUEST,\n this.routes.ERROR,\n ],\n post: [\n this.routes.TENANT_USERS,\n this.routes.SIGNUP,\n this.routes.USERS,\n this.routes.TENANTS,\n this.routes.SESSION,\n `${this.routes.SIGNIN}/{provider}`,\n this.routes.PASSWORD_RESET,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n `${this.routes.CALLBACK}/{provider}`,\n this.routes.SIGNOUT,\n ],\n put: [\n this.routes.TENANT_USERS,\n this.routes.USERS,\n this.routes.TENANT,\n this.routes.PASSWORD_RESET,\n ],\n delete: [this.routes.TENANT_USER, this.routes.TENANT],\n };\n }\n\n reset = () => {\n this.users = new Users(this.config, this.#headers);\n this.tenants = new Tenants(this.config, this.#headers);\n this.auth = new Auth(this.config, this.#headers, {\n resetHeaders: this.resetHeaders,\n });\n };\n\n updateConfig = (config: Config) => {\n this.config = config;\n this.handlers = Handlers(this.routes, config);\n };\n\n resetHeaders = (headers?: Headers) => {\n this.#headers = new Headers(headers ?? {});\n this.reset();\n };\n\n set headers(headers: Headers | Record<string, string>) {\n const updates: [string, string][] = [];\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n updates.push([key.toLowerCase(), value]);\n });\n } else {\n for (const [key, value] of Object.entries(headers)) {\n updates.push([key.toLowerCase(), value]);\n }\n }\n\n const merged: Record<string, string> = {};\n this.#headers?.forEach((value, key) => {\n merged[key.toLowerCase()] = value;\n });\n\n for (const [key, value] of updates) {\n merged[key] = value;\n }\n\n this.#headers = new Headers();\n for (const [key, value] of Object.entries(merged)) {\n this.#headers.set(key, value);\n }\n\n this.reset();\n }\n\n get headers(): Headers | undefined {\n return this.#headers;\n }\n\n getCookie(req?: Request | Headers) {\n if (req instanceof Headers) {\n return parseToken(req);\n } else if (req instanceof Request) {\n return parseToken(req.headers);\n }\n return null;\n }\n\n login = async (\n payload: { email: string; password: string },\n config?: { returnResponse?: boolean }\n ) => {\n const [headers, loginRes] = await serverLogin(\n this.config,\n this.handlers\n )(payload);\n this.headers = headers;\n if (config?.returnResponse) {\n return loginRes;\n }\n return undefined; // preserve existing behavior where login returns undefined\n };\n\n session = async (req?: Request | Headers | null | undefined) => {\n if (req instanceof Headers) {\n return this.auth.getSession(req);\n } else if (req instanceof Request) {\n return auth(req, this.config);\n }\n return this.auth.getSession(this.#headers);\n };\n}\n","import pg from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport { Api } from './Api';\n\nexport class Server {\n config: Config;\n api: Api;\n private manager!: DbManager;\n\n constructor(config?: ServerConfig) {\n this.config = new Config(config as ServerConfig, '[initial config]');\n this.api = new Api(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 this.api.updateConfig(this.config);\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\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.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.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.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.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): pg.Pool {\n return this.manager.getConnection(this.config);\n }\n\n clearConnections() {\n this.manager.clear(this.config);\n }\n\n /**\n * A convenience function that applies a config and ensures whatever was passed is set properly\n */\n\n getInstance(config: ServerConfig): Server {\n const _config = { ...this.config, ...config };\n\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n this.setConfig(updatedConfig);\n // propagate special config items\n this.tenantId = updatedConfig.tenantId;\n this.userId = updatedConfig.userId;\n // if we have a token, update it, else use the one that was there\n if (updatedConfig.api.token) {\n this.token = updatedConfig.api.token;\n }\n this.databaseId = updatedConfig.databaseId;\n\n return this;\n }\n}\n\nlet server: Server;\nexport async function create(config?: ServerConfig): Promise<Server> {\n if (!server) {\n server = new Server(config);\n }\n if (config) {\n return await server.init(new Config(config));\n }\n return await server.init();\n}\n"]}
1
+ {"version":3,"sources":["../src/users/types.ts","../src/api/utils/routes/urlMatches.ts","../src/utils/Logger.ts","../src/utils/constants.ts","../src/context/asyncStorage.ts","../src/api/utils/request.ts","../src/api/utils/auth.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/db/PoolProxy.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/api/utils/routes/makeRestUrl.ts","../src/api/utils/routes/apiRoutes.ts","../src/api/routes/me/index.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/%5BuserId%5D/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/users/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/users/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/users/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/users/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.ts","../src/api/utils/routes/proxyRoutes.ts","../src/api/routes/auth/signin.ts","../src/api/routes/auth/session.ts","../src/api/routes/auth/providers.ts","../src/api/routes/auth/csrf.ts","../src/api/routes/auth/callback.ts","../src/api/routes/auth/signout.ts","../src/api/routes/auth/error.ts","../src/api/routes/auth/verify-request.ts","../src/api/routes/auth/password-reset.ts","../src/api/handlers/GET.ts","../src/api/routes/signup/POST.ts","../src/api/routes/signup/index.tsx","../src/api/handlers/POST.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts","../src/api/handlers/index.ts","../src/api/utils/routes/defaultRoutes.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/tenants/index.ts","../src/users/index.ts","../src/Api.ts","../src/Server.ts"],"names":["route","request","key","pg","afterCreate","GET","matches","POST","PUT","DELETE","getCallbackUrl"],"mappings":";;;;;AAoBO,IAAM,8BAAiC,GAAA;AAAA,EAC5C,WAAa,EAAA,cAAA;AAAA,EACb,YAAc,EAAA,eAAA;AAAA,EACd,OAAS,EAAA;AACX;;;ACxBe,SAAR,UAAA,CAA4B,YAAoBA,OAAe,EAAA;AACpE,EAAM,MAAA,GAAA,GAAM,IAAI,GAAA,CAAI,UAAU,CAAA;AAC9B,EAAO,OAAA,GAAA,CAAI,QAAS,CAAA,UAAA,CAAWA,OAAK,CAAA;AACtC;;;ACIA,IAAM,GAAM,GAAA,UAAA;AACZ,IAAM,MAAS,GAAA,sBAAA;AACf,IAAM,MAAS,GAAA,wBAAA;AACf,IAAM,MAAS,GAAA,sBAAA;AACf,IAAM,KAAQ,GAAA,SAAA;AAEd,IAAM,UAAA,GAAa,CAAC,MAAA,EAAA,GAAgC,MAAuB,MAAA;AAAA,EACzE,IAAA,CAAK,SAA2B,IAAgC,EAAA;AAC9D,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,UACzD;AAAA,SACD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,QACpB,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAK,CAAA,GAAA;AAAA,OACrC;AAAA;AACF,GACF;AAAA,EACA,KAAA,CAAM,SAA2B,IAAgC,EAAA;AAC/D,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAQ,OAAA,CAAA,KAAA;AAAA,QACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,UACzD;AAAA,SACD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,QACpB,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAK,CAAA,GAAA;AAAA,OACrC;AAAA;AACF,GACF;AAAA,EACA,IAAA,CAAK,SAA2B,IAAgC,EAAA;AAC9D,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,MAAM,CAAA,MAAA,EAAS,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,UACxD;AAAA,SACD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,QACpB,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAI,GAAA;AAAA,OAChC;AAAA;AACF,GACF;AAAA,EACA,KAAA,CAAM,SAA2B,IAAgC,EAAA;AAC/D,IAAQ,OAAA,CAAA,KAAA;AAAA,MACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,GAAG,CAAA,OAAA,EAAU,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,QACtD;AAAA,OACD,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,MAClB,OAAO,IAAO,GAAA,EAAA;AAAA,MACd,GAAG,KAAK,CAAA;AAAA,KACV;AAAA;AAEJ,CAAA,CAAA;AAEe,SAAR,MAAA,CACL,WACG,MACH,EAAA;AACA,EAAM,MAAA,IAAA,GAAO,UAAW,CAAA,MAAA,EAAQ,MAAM,CAAA;AACtC,EAAA,MAAM,IAAO,GAAA,MAAA,EAAQ,MAAQ,EAAA,IAAA,IAAQ,IAAK,CAAA,IAAA;AAC1C,EAAA,MAAM,KAAQ,GAAA,MAAA,EAAQ,MAAQ,EAAA,KAAA,IAAS,IAAK,CAAA,KAAA;AAC5C,EAAA,MAAM,IAAO,GAAA,MAAA,EAAQ,MAAQ,EAAA,IAAA,IAAQ,IAAK,CAAA,IAAA;AAC1C,EAAA,MAAM,KAAQ,GAAA,MAAA,EAAQ,MAAQ,EAAA,KAAA,IAAS,IAAK,CAAA,KAAA;AAC5C,EAAA,OAAO,EAAE,IAAA,EAAM,IAAM,EAAA,KAAA,EAAO,KAAM,EAAA;AACpC;AAEO,SAAS,UAAA,CAAW,cAAsBC,QAA2B,EAAA;AAC1E,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,GAAG,CAAA;AACjD;;;ACpEO,IAAM,aAAgB,GAAA,gBAAA;AACtB,IAAM,cAAiB,GAAA,cAAA;AACvB,IAAM,aAAgB,GAAA,aAAA;AAEtB,IAAM,oBAAuB,GAAA,qBAAA;;;ACYpC,IAAI,aAAqC,GAAA,IAAA;AAElC,SAAS,WAAW,OAAkB,EAAA;AAC3C,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAA;AACxC,EAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,GAAA,CAAI,MAAM,CAAA;AAC/B,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAA;AACnC,EAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAA;AAC1C,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,GAAA,CAAI,cAAc,CAAA;AACzC,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAA,CAAQ,MAAS,GAAA,MAAA;AAAA,aACR,IAAM,EAAA;AACf,IAAA,OAAA,CAAQ,MAAS,GAAA,IAAA;AAAA;AAGnB,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAA,CAAQ,MAAS,GAAA,MAAA;AAAA;AAGnB,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,OAAA,CAAQ,QAAW,GAAA,QAAA;AAAA;AAErB,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAA,CAAQ,MAAS,GAAA,MAAA;AAAA;AAEnB,EAAgB,aAAA,GAAA,OAAA;AAClB;AAEO,SAAS,SAAsB,GAAA;AACpC,EAAA,OAAO,aAAe,EAAA,MAAA;AACxB;AAEO,SAAS,SAAsB,GAAA;AACpC,EAAA,OAAO,aAAe,EAAA,MAAA;AACxB;AAUO,SAAS,UAAU,OAAmB,EAAA;AAC3C,EAAM,MAAA,MAAA,GAAS,SAAS,YAAe,IAAA;AACvC,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAA,MAAM,gBAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,QAAQ,MAAQ,EAAA;AACzB,MAAA,MAAM,CAAC,CAAC,CAAI,GAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAC3B,MAAA,MAAM,GAAG,GAAG,CAAI,GAAA,CAAA,CAAE,MAAM,GAAG,CAAA;AAC3B,MAAA,IAAI,GAAK,EAAA;AACP,QAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA;AACtB;AAGF,IAAM,MAAA,MAAA,GAAS,aAAa,aAAa,CAAA;AACzC,IAAgB,aAAA,GAAA,EAAE,GAAG,aAAA,EAAe,MAAO,EAAA;AAAA;AAE/C;AAEA,SAAS,aAAa,aAAiC,EAAA;AACrD,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAA,MAAM,YAAoC,EAAC;AAE3C,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAO,OAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA;AAEhC,EAAA,YAAA,CAAa,KAAM,CAAA,GAAG,CAAE,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAC1C,IAAM,MAAA,CAAC,QAAQ,GAAG,MAAM,IAAI,MAAO,CAAA,IAAA,EAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AACnD,IAAMC,MAAAA,KAAAA,GAAM,OAAO,IAAK,EAAA;AACxB,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,IAAK,CAAA,GAAG,EAAE,IAAK,EAAA;AACpC,IAAIA,IAAAA,KAAAA,EAAeA,SAAAA,CAAAA,KAAG,CAAI,GAAA,KAAA;AAAA,GAC3B,CAAA;AAED,EAAc,aAAA,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAChC,IAAM,MAAA,CAAC,QAAQ,GAAG,MAAM,IAAI,MAAO,CAAA,IAAA,EAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AACnD,IAAMA,MAAAA,KAAAA,GAAM,OAAO,IAAK,EAAA;AACxB,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,IAAK,CAAA,GAAG,EAAE,IAAK,EAAA;AACpC,IAAIA,IAAAA,KAAAA,EAAeA,SAAAA,CAAAA,KAAG,CAAI,GAAA,KAAA;AAAA,GAC3B,CAAA;AAED,EAAA,OAAO,OAAO,OAAQ,CAAA,SAAS,CAC5B,CAAA,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAE,CAAA,CAAA,CAC3B,KAAK,IAAI,CAAA;AACd;;;AC9FA,eAAO,OAAA,CACL,GACA,EAAA,KAAA,EACA,MACA,EAAA;AACA,EAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AACzD,EAAA,MAAM,EAAE,OAAA,EAAAD,QAAS,EAAA,GAAG,MAAS,GAAA,KAAA;AAC7B,EAAA,MAAM,UAAa,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AACtC,EAAA,MAAM,cAAiB,GAAA,IAAI,OAAQ,CAAA,EAAE,CAAA;AACrC,EAAA,IAAIA,QAAQ,CAAA,OAAA,CAAQ,GAAI,CAAA,QAAQ,CAAG,EAAA;AACjC,IAAe,cAAA,CAAA,GAAA,CAAI,UAAU,MAAOA,CAAAA,QAAAA,CAAQ,QAAQ,GAAI,CAAA,QAAQ,CAAC,CAAC,CAAA;AAAA;AAEpE,EAAA,IAAIA,QAAQ,CAAA,OAAA,CAAQ,GAAI,CAAA,aAAa,CAAG,EAAA;AACtC,IAAe,cAAA,CAAA,GAAA;AAAA,MACb,aAAA;AAAA,MACA,MAAOA,CAAAA,QAAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAC;AAAA,KAC3C;AAAA;AAEF,EAAI,IAAA,MAAA,CAAO,GAAI,CAAA,aAAA,IAAiB,IAAM,EAAA;AACpC,IAAA,cAAA,CAAe,IAAI,oBAAsB,EAAA,MAAA,CAAO,MAAO,CAAA,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA;AAG3E,EAAe,cAAA,CAAA,GAAA,CAAI,MAAQ,EAAA,UAAA,CAAW,IAAI,CAAA;AAC1C,EAAI,IAAA,MAAA,CAAO,IAAI,WAAa,EAAA;AAC1B,IAAA,MAAM,KAAQ,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,IAAI,WAAW,CAAA;AAC5C,IAAA,KAAA;AAAA,MACE,CAAA,4CAAA,EAA+C,MAAO,CAAA,GAAA,CAAI,WAAW,CAAA;AAAA,KACvE;AACA,IAAe,cAAA,CAAA,GAAA,CAAI,aAAe,EAAA,KAAA,CAAM,MAAM,CAAA;AAAA,GAChD,MAAA,IAAW,MAAO,CAAA,GAAA,CAAI,MAAQ,EAAA;AAC5B,IAAA,KAAA,CAAM,CAA0C,uCAAA,EAAA,MAAA,CAAO,GAAI,CAAA,MAAM,CAAE,CAAA,CAAA;AACnE,IAAA,cAAA,CAAe,GAAI,CAAA,aAAA,EAAe,MAAO,CAAA,GAAA,CAAI,MAAM,CAAA;AAAA,GAC9C,MAAA;AACL,IAAe,cAAA,CAAA,GAAA,CAAI,aAAe,EAAA,UAAA,CAAW,MAAM,CAAA;AACnD,IAAM,KAAA,CAAA,CAAA,6BAAA,EAAgC,UAAW,CAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AAE3D,EAAA,MAAM,MAAS,GAAA,EAAE,GAAG,IAAA,EAAM,SAAS,cAAe,EAAA;AAClD,EACE,IAAA,MAAA,CAAO,QAAQ,WAAY,EAAA,KAAM,UACjC,MAAO,CAAA,MAAA,EAAQ,WAAY,EAAA,KAAM,KACjC,EAAA;AACA,IAAI,IAAA;AACF,MAAe,cAAA,CAAA,GAAA,CAAI,gBAAgB,kBAAkB,CAAA;AACrD,MAAM,MAAA,QAAA,GAAW,MAAM,IAAI,QAAS,CAAA,KAAA,CAAM,QAAQ,KAAM,EAAA,CAAE,IAAI,CAAA,CAAE,IAAK,EAAA;AACrE,MAAM,MAAA,WAAA,GAAc,MAAM,IAAI,QAAA,CAASA,SAAQ,KAAM,EAAA,CAAE,IAAI,CAAA,CAAE,IAAK,EAAA;AAClE,MAAA,MAAA,CAAO,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,QAAA,IAAY,WAAW,CAAA;AAAA,aAC7C,CAAG,EAAA;AACV,MAAe,cAAA,CAAA,GAAA,CAAI,gBAAgB,mCAAmC,CAAA;AACtE,MAAM,MAAA,QAAA,GAAW,MAAM,IAAI,QAAS,CAAA,KAAA,CAAM,QAAQ,KAAM,EAAA,CAAE,IAAI,CAAA,CAAE,IAAK,EAAA;AACrE,MAAM,MAAA,WAAA,GAAc,MAAM,IAAI,QAAA,CAASA,SAAQ,KAAM,EAAA,CAAE,IAAI,CAAA,CAAE,IAAK,EAAA;AAClE,MAAA,MAAA,CAAO,OAAO,QAAY,IAAA,WAAA;AAAA;AAC5B;AAGF,EAAA,MAAM,OAAU,GAAA,CAAA,EAAG,GAAG,CAAA,EAAG,WAAW,MAAM,CAAA,CAAA;AAC1C,EAAI,IAAA;AACF,IAAA,UAAA,CAAW,cAAc,CAAA;AAEzB,IAAM,MAAA,GAAA,GAAuB,MAAM,KAAM,CAAA,OAAA,EAAS,EAAE,GAAG,MAAA,EAAQ,CAAE,CAAA,KAAA;AAAA,MAC/D,CAAC,CAAM,KAAA;AACL,QAAA,KAAA,CAAM,oCAAsC,EAAA;AAAA,UAC1C,SAAS,CAAE,CAAA,OAAA;AAAA,UACX,OAAO,CAAE,CAAA;AAAA,SACV,CAAA;AACD,QAAA,OAAO,IAAI,QAAA;AAAA,UACT,gEAAA;AAAA,UACA,EAAE,QAAQ,GAAI;AAAA,SAChB;AAAA;AACF,KACF;AACA,IAAA,MAAM,aAAa,OAAO,GAAA,EAAK,UAAU,UAAa,GAAA,GAAA,EAAK,OAAU,GAAA,IAAA;AACrE,IAAA,IAAA,CAAK,IAAI,MAAO,CAAA,MAAA,IAAU,KAAK,CAAA,EAAA,EAAK,OAAO,CAAI,CAAA,EAAA;AAAA,MAC7C,QAAQ,GAAK,EAAA,MAAA;AAAA,MACb,YAAY,GAAK,EAAA,UAAA;AAAA,MACjB,IAAA,EAAM,MAAM,UAAA,EAAY,IAAK;AAAA,KAC9B,CAAA;AAED,IAAA,SAAA,CAAU,KAAK,OAAO,CAAA;AACtB,IAAO,OAAA,GAAA;AAAA,WACA,CAAG,EAAA;AACV,IAAA,IAAI,aAAa,KAAO,EAAA;AACtB,MAAA,KAAA,CAAM,oCAAsC,EAAA;AAAA,QAC1C,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,OAAO,CAAE,CAAA;AAAA,OACV,CAAA;AAAA;AAEH,IAAA,OAAO,IAAI,QAAA;AAAA,MACT,gEAAA;AAAA,MACA,EAAE,QAAQ,GAAI;AAAA,KAChB;AAAA;AAEJ;;;ACnDA,eAAO,IAAA,CACL,KACA,MAC2C,EAAA;AAC3C,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AACnD,EAAA,IAAA,CAAK,eAAe,CAAA;AAEpB,EAAA,MAAM,UAAa,GAAA,CAAA,EAAG,MAAO,CAAA,GAAA,CAAI,QAAQ,CAAA,aAAA,CAAA;AACzC,EAAK,IAAA,CAAA,CAAA,aAAA,EAAgB,UAAU,CAAE,CAAA,CAAA;AAEjC,EAAI,GAAA,CAAA,OAAA,CAAQ,OAAO,gBAAgB,CAAA;AAEnC,EAAM,MAAA,GAAA,GAAM,MAAM,OAAQ,CAAA,UAAA,EAAY,EAAE,OAAS,EAAA,GAAA,IAAO,MAAM,CAAA;AAC9D,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAA,IAAA,CAAK,kBAAkB,CAAA;AACvB,IAAO,OAAA,MAAA;AAAA;AAET,EAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,EAAI,IAAA;AACF,IAAA,MAAM,UAAU,MAAM,IAAI,SAAS,GAAI,CAAA,IAAI,EAAE,IAAK,EAAA;AAClD,IAAA,IAAI,MAAO,CAAA,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAG,EAAA;AACrC,MAAO,OAAA,KAAA,CAAA;AAAA;AAET,IAAO,OAAA,OAAA;AAAA,WACA,CAAG,EAAA;AACV,IAAA,KAAA,CAAM,CAAC,CAAA;AACP,IAAO,OAAA,MAAA;AAAA;AAEX;ACpEO,IAAM,cAAA,GAAiB,CAAC,GAAmB,KAAA;AAChD,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,mBAAmB,CAAG,EAAA;AAChD,IAAA,OAAO,QAAQ,GAAI,CAAA,mBAAA;AAAA;AAErB,EAAA,OAAO,QAAQ,GAAK,EAAA,WAAA;AACtB,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,GAAmB,KAAA;AAClD,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,oBAAoB,CAAG,EAAA;AACjD,IAAO,OAAA,OAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,oBAAoB,CAAA;AAAA;AAEjD,EAAA,OAAO,QAAQ,GAAK,EAAA,aAAA;AACtB,CAAA;AAEO,IAAM,aAAA,GAAgB,CAAC,GAAmB,KAAA;AAC/C,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAE3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,cAAc,CAAA;AAC9C,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,UAAU,CAAG,EAAA;AACnC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,EAAQ,UAAU,CAAE,CAAA,CAAA;AACxD,IAAO,OAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AAAA;AAElC,EAAA,MAAM,SAAY,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,SAAS,CAAA;AAEnD,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,SAAS,CAAE,CAAA,CAAA;AAClD,IAAO,OAAA,SAAA;AAAA;AAGT,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,cAAc,CAAA;AACnD,EAAA,IAAI,IAAM,EAAA;AACR,IAAI,IAAA;AACF,MAAM,MAAA,KAAA,GAAQ,IAAI,GAAA,CAAI,IAAI,CAAA;AAC1B,MAAA,OAAO,KAAM,CAAA,QAAA,CAAS,KAAM,CAAA,GAAG,EAAE,CAAC,CAAA;AAAA,aAC3B,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAO,OAAA,IAAA;AACT,CAAA;AACO,IAAM,WAAA,GAAc,CAAC,GAAmB,KAAA;AAC7C,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAE3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAC5C,EAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,CAAO,IAAI,CAAE,CAAA,CAAA;AACjD,IAAO,OAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA;AAE5B,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAA;AAChD,EAAA,IAAI,IAAM,EAAA;AACR,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,cAAA,EAAiB,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAME,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,GAAA,GAAM,IAAI,GAAA,CAAIA,GAAE,CAAA;AACtB,MAAA,IAAI,IAAI,QAAU,EAAA;AAChB,QAAA,OAAO,GAAI,CAAA,QAAA;AAAA;AACb,aACO,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAO,OAAA,MAAA;AACT,CAAA;AAEO,IAAM,WAAA,GAAc,CAAC,GAAmB,KAAA;AAC7C,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAM,MAAA,GAAA,GAAM,aAAa,MAAM,CAAA;AAC/B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAC5C,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,QAAQ,CAAG,EAAA;AACjC,IAAA,GAAA,IAAO,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,EAAQ,QAAQ,CAAE,CAAA,CAAA;AACnD,IAAO,OAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAAA;AAGhC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,eAAe,CAAA;AACpD,EAAA,IAAI,IAAM,EAAA;AACR,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,kBAAA,EAAqB,IAAI,CAAE,CAAA,CAAA;AAEnD,IAAO,OAAA,IAAA;AAAA;AAET,EAAA,MAAMA,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,GAAA,GAAM,IAAI,GAAA,CAAIA,GAAE,CAAA;AACtB,MAAA,IAAI,IAAI,QAAU,EAAA;AAChB,QAAA,OAAO,GAAI,CAAA,QAAA;AAAA;AACb,aACO,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAO,OAAA,MAAA;AACT,CAAA;AAEO,IAAM,aAAA,GAAgB,CAAC,GAAmB,KAAA;AAC/C,EAAA,OAAO,GAAG,WAAY,CAAA,GAAG,CAAC,CAAI,CAAA,EAAA,WAAA,CAAY,GAAG,CAAC,CAAA,CAAA;AAChD,CAAA;AAEO,IAAM,QAAA,GAAW,CAAC,GAAmB,KAAA;AAC1C,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,SAAS,CAAA;AACzC,EAAA,IAAI,WAAY,CAAA,MAAA,EAAQ,GAAK,EAAA,KAAK,CAAG,EAAA;AACnC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,YAAY,MAAQ,EAAA,GAAA,EAAK,KAAK,CAAE,CAAA,CAAA;AACxD,IAAO,OAAA,MAAA,CAAO,MAAQ,EAAA,GAAA,EAAK,KAAK,CAAA;AAAA;AAElC,EAAA,MAAM,KAAQ,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,YAAY,CAAA;AAClD,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,eAAA,EAAkB,KAAK,CAAE,CAAA,CAAA;AACjD,IAAO,OAAA,KAAA;AAAA;AAET,EAAO,OAAA,MAAA;AACT,CAAA;AAEO,IAAM,eAAA,GAAkB,CAAC,GAAmB,KAAA;AACjD,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AAChD,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,YAAY,CAAG,EAAA;AACrC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,EAAQ,YAAY,CAAE,CAAA,CAAA;AAC1D,IAAO,OAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA;AAEpC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAA;AAChD,EAAA,IAAI,IAAM,EAAA;AACR,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,cAAA,EAAiB,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAO,OAAA,IAAA;AAAA;AAGT,EAAI,IAAA,OAAA,CAAQ,IAAI,mBAAqB,EAAA;AACnC,IAAI,IAAA;AACF,MAAA,MAAM,KAAQ,GAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AACrD,MAAO,OAAA,KAAA,CAAM,QAAS,CAAA,SAAA,CAAU,CAAC,CAAA;AAAA,aAC1B,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAO,OAAA,IAAA;AACT,CAAA;AAEO,IAAM,WAAA,GAAc,CAAC,GAAkC,KAAA;AAC5D,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAC5C,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,QAAQ,CAAG,EAAA;AACjC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,EAAQ,QAAQ,CAAE,CAAA,CAAA;AACtD,IAAO,OAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAAA;AAGhC,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,aAAa,CAAG,EAAA;AAC1C,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,mBAAmB,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAE,CAAA,CAAA;AACtE,IAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAA;AAAA;AAGzC,EAAO,OAAA,IAAA;AACT,CAAA;AAEO,IAAM,YAAA,GAAe,CAAC,GAA2B,KAAA;AACtD,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AAC7C,EAAA,IAAI,WAAY,CAAA,MAAA,EAAQ,GAAK,EAAA,SAAS,CAAG,EAAA;AACvC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,YAAY,MAAQ,EAAA,GAAA,EAAK,SAAS,CAAE,CAAA,CAAA;AAC5D,IAAO,OAAA,MAAA,CAAO,MAAQ,EAAA,GAAA,EAAK,SAAS,CAAA;AAAA;AAGtC,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,iBAAiB,CAAG,EAAA;AAC9C,IAAA,MAAA,IACE,KAAK,CAAG,EAAA,MAAM,uBAAuB,OAAQ,CAAA,GAAA,CAAI,iBAAiB,CAAE,CAAA,CAAA;AACtE,IAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,CAAI,iBAAiB,CAAA;AAAA;AAG7C,EAAO,OAAA,OAAA;AACT,CAAA;AAMO,IAAM,WAAA,GAAc,CAAC,GAAuC,KAAA;AACjE,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AACzD,EAAM,MAAA,QAAA,GAAW,QAAQ,GAAK,EAAA,QAAA;AAC9B,EAAI,IAAA,WAAA,CAAY,QAAQ,CAAG,EAAA;AACzB,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,QAAQ,CAAE,CAAA,CAAA;AAC9C,IAAO,OAAA,QAAA;AAAA;AAGT,EAAA,MAAM,MAAS,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,cAAc,CAAA;AACrD,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,oBAAoB,OAAQ,CAAA,GAAA,CAAI,cAAc,CAAE,CAAA,CAAA;AACxE,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,IAAI,GAAA,CAAI,MAAM,CAAA;AAC7B,MAAA,OAAO,MAAO,CAAA,IAAA;AAAA,aACP,CAAG,EAAA;AACV,MAAA,IAAI,aAAa,KAAO,EAAA;AACtB,QAAA,KAAA,CAAM,EAAE,KAAK,CAAA;AAAA;AACf;AACF;AAGF,EAAA,IAAA,CAAK,sCAAsC,CAAA;AAC3C,EAAO,OAAA,MAAA;AACT,CAAA;AAEO,IAAM,eAAA,GAAkB,CAAC,GAAmB,KAAA;AACjD,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAE5C,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,YAAY,CAAG,EAAA;AACrC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,EAAQ,YAAY,CAAE,CAAA,CAAA;AAC1D,IAAO,OAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA;AAGpC,EAAA,MAAM,aAAgB,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,gBAAgB,CAAA;AAC9D,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA,MAAA,IACE,KAAK,CAAG,EAAA,MAAM,sBAAsB,OAAQ,CAAA,GAAA,CAAI,gBAAgB,CAAE,CAAA,CAAA;AAEpE,IAAA,IAAI,CAAC,aAAA,CAAc,UAAW,CAAA,MAAM,CAAG,EAAA;AACrC,MAAO,OAAA,CAAA,QAAA,EAAW,OAAQ,CAAA,GAAA,CAAI,gBAAgB,CAAA,CAAA;AAAA;AAEhD,IAAA,OAAO,QAAQ,GAAI,CAAA,gBAAA;AAAA;AAGrB,EAAU,MAAA,IAAA,IAAA,CAAK,CAAG,EAAA,MAAM,CAAsC,oCAAA,CAAA,CAAA;AAC9D,EAAO,OAAA,4BAAA;AACT,CAAA;AAEO,SAAS,UAAU,GAAgB,EAAA;AACxC,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AAE3C,EAAA,IAAI,YAAY,MAAQ,EAAA,EAAA,IAAM,MAAO,CAAA,EAAA,CAAG,IAAI,CAAG,EAAA;AAC7C,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,YAAY,MAAQ,EAAA,EAAA,EAAI,IAAI,CAAE,CAAA,CAAA;AACtD,IAAO,OAAA,MAAA,CAAO,MAAQ,EAAA,EAAA,EAAI,IAAI,CAAA;AAAA;AAGhC,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,WAAW,CAAG,EAAA;AACxC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,iBAAiB,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAE,CAAA,CAAA;AAClE,IAAA,OAAO,QAAQ,GAAI,CAAA,WAAA;AAAA;AAGrB,EAAA,MAAMA,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,KAAA,GAAQ,IAAI,GAAA,CAAIA,GAAE,CAAA;AACxB,MAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAyB,sBAAA,EAAA,KAAA,CAAM,QAAQ,CAAE,CAAA,CAAA;AACjE,MAAA,OAAO,KAAM,CAAA,QAAA;AAAA,aACN,CAAG,EAAA;AAAA;AAEZ;AAGF,EAAU,MAAA,IAAA,IAAA,CAAK,CAAG,EAAA,MAAM,CAA0B,wBAAA,CAAA,CAAA;AAClD,EAAO,OAAA,gBAAA;AACT;AAEO,SAAS,UAAU,GAAwB,EAAA;AAChD,EAAM,MAAA,EAAE,MAAQ,EAAA,MAAA,EAAW,GAAA,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AAC3C,EAAA,IAAI,QAAQ,EAAI,EAAA,IAAA,IAAQ,MAAO,CAAA,EAAA,CAAG,QAAQ,IAAM,EAAA;AAC9C,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,YAAY,MAAQ,EAAA,EAAA,CAAG,IAAI,CAAE,CAAA,CAAA;AACrD,IAAO,OAAA,MAAA,CAAO,MAAO,CAAA,EAAA,EAAI,IAAI,CAAA;AAAA;AAG/B,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,WAAW,CAAG,EAAA;AACxC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,iBAAiB,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAE,CAAA,CAAA;AAClE,IAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAA;AAAA;AAGvC,EAAA,MAAMA,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,KAAA,GAAQ,IAAI,GAAA,CAAIA,GAAE,CAAA;AACxB,MAAA,IAAI,MAAM,IAAM,EAAA;AACd,QAAO,OAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA;AAC1B,aACO,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAU,MAAA,IAAA,IAAA,CAAK,CAAG,EAAA,MAAM,CAAgB,cAAA,CAAA,CAAA;AACxC,EAAO,OAAA,IAAA;AACT;AAGA,IAAM,YAAA,GAAe,CAAC,MAAoB,KAAA;AACxC,EAAO,OAAA,OAAA,CAAQ,IAAI,QAAa,KAAA,aAAA,IAC9B,QAAQ,GAAI,CAAA,QAAA,KAAa,SACvB,MACA,GAAA,IAAA;AACN,CAAA;AAEA,IAAM,WAAA,GAAc,CAAC,GAAmC,KAAA;AACtD,EAAI,IAAA,GAAA,IAAO,QAAQ,EAAI,EAAA;AACrB,IAAO,OAAA,GAAA;AAAA;AAET,EAAA;AACF,CAAA;;;AC9QO,IAAM,YAAN,MAAgB;AAAA,EACd,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA;AAAA,EAEP,MAAA;AAAA,EAEA,WAAA,CAAY,QAAuB,MAAiB,EAAA;AAClD,IAAM,MAAA,YAAA,GAA0B,EAAE,MAAA,EAAQ,MAAO,EAAA;AAEjD,IAAK,IAAA,CAAA,SAAA,GAAY,aAAa,YAAY,CAAA;AAC1C,IAAK,IAAA,CAAA,MAAA,GAAS,SAAS,YAAY,CAAA;AACnC,IAAK,IAAA,CAAA,WAAA,GAAc,eAAe,YAAY,CAAA;AAC9C,IAAK,IAAA,CAAA,aAAA,GAAgB,iBAAiB,YAAY,CAAA;AAClD,IAAK,IAAA,CAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AAExC,IAAK,IAAA,CAAA,MAAA,GAAS,QAAQ,GAAK,EAAA,MAAA;AAC3B,IAAK,IAAA,CAAA,WAAA,GAAc,QAAQ,GAAK,EAAA,WAAA;AAChC,IAAK,IAAA,CAAA,MAAA,GAAS,QAAQ,GAAK,EAAA,MAAA;AAAA;AAC7B,EAEA,IAAW,KAA4B,GAAA;AACrC,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA;AACd,EAEA,IAAW,MAAM,KAA2B,EAAA;AAC1C,IAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AAAA;AAElB,CAAA;AAEO,IAAM,SAAN,MAAa;AAAA,EAClB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EAEA,KAAA;AAAA,EAEA,EAAA;AAAA,EAEA,GAAA;AAAA,EAEQ,SAAA;AAAA,EACA,OAAA;AAAA,EAER,IAAW,QAAsC,GAAA;AAC/C,IAAA,OAAO,IAAK,CAAA,SAAA;AAAA;AACd,EAEA,IAAW,SAAS,KAAkC,EAAA;AACpD,IAAA,IAAA,CAAK,SAAY,GAAA,KAAA;AAAA;AACnB,EAEA,IAAW,MAAoC,GAAA;AAC7C,IAAA,OAAO,IAAK,CAAA,OAAA;AAAA;AACd,EAEA,IAAW,OAAO,KAAkC,EAAA;AAClD,IAAA,IAAA,CAAK,OAAU,GAAA,KAAA;AAAA;AACjB,EAEA,WAAA,CAAY,QAAuB,MAAiB,EAAA;AAClD,IAAM,MAAA,YAAA,GAA0B,EAAE,MAAA,EAAQ,MAAO,EAAA;AACjD,IAAK,IAAA,CAAA,IAAA,GAAO,YAAY,YAAY,CAAA;AACpC,IAAA,IAAA,CAAK,SAAS,MAAQ,EAAA,MAAA;AACtB,IAAK,IAAA,CAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AACxC,IAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,MAAQ,EAAA;AACnC,MAAI,IAAA,CAAC,KAAK,IAAM,EAAA;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA;AAEF,MAAI,IAAA,CAAC,KAAK,QAAU,EAAA;AAClB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA;AACF;AAGF,IAAK,IAAA,CAAA,UAAA,GAAa,cAAc,YAAY,CAAA;AAC5C,IAAK,IAAA,CAAA,YAAA,GAAe,gBAAgB,YAAY,CAAA;AAChD,IAAK,IAAA,CAAA,SAAA,GAAY,YAAY,YAAY,CAAA;AACzC,IAAK,IAAA,CAAA,KAAA,GAAQ,OAAQ,CAAA,MAAA,EAAQ,KAAK,CAAA;AAClC,IAAA,IAAA,CAAK,UAAU,MAAQ,EAAA,MAAA;AAEvB,IAAM,MAAA,EAAE,MAAM,IAAM,EAAA,GAAG,UAAa,GAAA,MAAA,EAAQ,MAAM,EAAC;AACnD,IAAM,MAAA,cAAA,GAAiB,IAAQ,IAAA,SAAA,CAAU,YAAY,CAAA;AACrD,IAAM,MAAA,cAAA,GAAiB,IAAQ,IAAA,SAAA,CAAU,YAAY,CAAA;AAErD,IAAA,IAAA,CAAK,GAAM,GAAA,IAAI,SAAU,CAAA,MAAA,EAAQ,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,EAAK,GAAA;AAAA,MACR,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,UAAU,IAAK,CAAA,QAAA;AAAA,MACf,IAAM,EAAA,cAAA;AAAA,MACN,IAAM,EAAA,cAAA;AAAA,MACN,GAAG;AAAA,KACL;AACA,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAK,IAAA,CAAA,EAAA,CAAG,WAAW,IAAK,CAAA,YAAA;AAAA;AAC1B;AACF,EAEA,SAAA,GAAY,OAAO,MAA0C,KAAA;AAC3D,IAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAO,OAAU,GAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAEtD,IAAA,MAAM,YAA0B,GAAA;AAAA,MAC9B;AAAA,KACF;AAEA,IAAM,MAAA,EAAE,MAAM,IAAM,EAAA,GAAG,UAAa,GAAA,MAAA,CAAO,MAAM,EAAC;AAClD,IAAI,IAAA,cAAA,GAAiB,IAAQ,IAAA,SAAA,CAAU,YAAY,CAAA;AACnD,IAAM,MAAA,cAAA,GAAiB,IAAQ,IAAA,SAAA,CAAU,YAAY,CAAA;AACrD,IAAI,IAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AACvC,IAAA,IAAI,cAAkB,IAAA,IAAA,CAAK,YAAgB,IAAA,IAAA,CAAK,cAAc,QAAU,EAAA;AACtE,MAAA,IAAA,CAAK,oCAAoC,CAAA;AACzC,MAAK,IAAA,CAAA,GAAA,GAAM,IAAI,SAAA,CAAU,MAAM,CAAA;AAC/B,MAAA,IAAA,CAAK,EAAK,GAAA;AAAA,QACR,MAAM,IAAK,CAAA,IAAA;AAAA,QACX,UAAU,IAAK,CAAA,QAAA;AAAA,QACf,IAAM,EAAA,cAAA;AAAA,QACN,IAAM,EAAA,cAAA;AAAA,QACN,UAAU,IAAK,CAAA,YAAA;AAAA,QACf,GAAG;AAAA,OACL;AACA,MAAK,IAAA,CAAA,cAAA,EAAgB,EAAE,EAAI,EAAA,IAAA,CAAK,IAAI,GAAK,EAAA,IAAA,CAAK,KAAK,CAAA;AACnD,MAAO,OAAA,IAAA;AAAA,KACF,MAAA;AACL,MAAA,MAAM,MAAM,EAAC;AACb,MAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,QAAA,GAAA,CAAI,KAAK,eAAe,CAAA;AAAA;AAE1B,MAAI,IAAA,CAAC,KAAK,YAAc,EAAA;AACtB,QAAA,GAAA,CAAI,KAAK,eAAe,CAAA;AAAA;AAE1B,MAAI,IAAA,CAAC,KAAK,UAAY,EAAA;AACpB,QAAA,GAAA,CAAI,KAAK,aAAa,CAAA;AAAA;AAExB,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA;AAEpB,MAAA,IAAA;AAAA,QACE,CAAA,gBAAA,EAAmB,GAAI,CAAA,IAAA,CAAK,IAAI,CAAC,IAC/B,GAAI,CAAA,MAAA,GAAS,CAAI,GAAA,KAAA,GAAQ,IAC3B,CAAA,qDAAA;AAAA,OACF;AAAA;AAGF,IAAM,MAAA,EAAA,GAAK,gBAAgB,YAAY,CAAA;AAEvC,IAAA,MAAM,eAAe,eAAgB,CAAA,EAAE,MAAQ,EAAA,MAAA,EAAQ,WAAW,CAAA;AAClE,IAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,CAAA,EAAG,EAAE,CAAsB,oBAAA,CAAA,CAAA;AAC/C,IAAA,IAAI,YAAc,EAAA;AAChB,MAAI,GAAA,CAAA,YAAA,CAAa,GAAI,CAAA,cAAA,EAAgB,YAAY,CAAA;AAAA;AAEnD,IAAK,IAAA,CAAA,CAAA,iBAAA,EAAoB,GAAI,CAAA,IAAI,CAAE,CAAA,CAAA;AACnC,IAAM,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAC3B,OAAS,EAAA;AAAA,QACP,eAAe,CAAU,OAAA,EAAA,aAAA,CAAc,EAAE,MAAA,EAAQ,CAAC,CAAA;AAAA;AACpD,KACD,CAAE,CAAA,KAAA,CAAM,MAAM;AACb,MAAM,KAAA,CAAA,CAAA,6BAAA,EAAgC,GAAG,CAAa,WAAA,CAAA,CAAA;AAAA,KACvD,CAAA;AACD,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAO,OAAA,IAAA;AAAA;AAET,IAAI,IAAA,QAAA;AACJ,IAAM,MAAA,aAAA,GAAgB,IAAI,KAAM,EAAA;AAChC,IAAI,IAAA;AACF,MAAM,MAAA,IAAA,GAAiB,MAAM,GAAA,CAAI,IAAK,EAAA;AACtC,MAAI,IAAA,GAAA,CAAI,WAAW,GAAK,EAAA;AACtB,QAAA,IAAA,CAAK,yCAAyC,CAAA;AAAA;AAEhD,MAAA,IAAI,IAAK,CAAA,MAAA,IAAU,IAAK,CAAA,MAAA,KAAW,OAAS,EAAA;AAC1C,QAAW,QAAA,GAAA,EAAE,SAAS,2BAA4B,EAAA;AAAA,OAC7C,MAAA;AACL,QAAW,QAAA,GAAA,IAAA;AAAA;AACb,aACO,CAAG,EAAA;AACV,MAAM,MAAA,OAAA,GAAU,MAAM,aAAA,CAAc,IAAK,EAAA;AACzC,MAAA,KAAA,CAAM,0BAA0B,CAAA;AAChC,MAAA,KAAA,CAAM,OAAO,CAAA;AACb,MAAA,QAAA,GAAW,EAAE,OAAQ,EAAA;AAAA;AAEvB,IAAA,IAAA,CAAK,sBAAsB,QAAQ,CAAA;AACnC,IAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,MAAQ,EAAA;AACnC,MAAA,IAAI,aAAa,QAAU,EAAA;AACzB,QAAA,IAAI,gBAAgB,QAAU,EAAA;AAC5B,UAAA,KAAA,CAAM,QAAQ,CAAA;AACd,UAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA,SACpC,MAAA;AACL,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA;AACF;AAEF,MAAI,IAAA,OAAO,aAAa,QAAU,EAAA;AAChC,QAAA,MAAM,EAAE,OAAA,EAAS,MAAQ,EAAA,IAAA,EAAM,IAAO,GAAA,QAAA;AACtC,QAAA,QAAA,GAAW,QAAY,IAAA,OAAA;AACvB,QAAA,IAAA,CAAK,UAAa,GAAA,EAAA;AAClB,QAAA,IAAA,CAAK,YAAe,GAAA,IAAA;AACpB,QAAM,MAAA,KAAA,GAAQ,IAAI,GAAA,CAAI,MAAM,CAAA;AAC5B,QAAA,cAAA,GAAiB,KAAM,CAAA,QAAA;AAAA;AACzB;AAEF,IAAK,IAAA,CAAA,GAAA,GAAM,IAAI,SAAA,CAAU,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,EAAK,GAAA;AAAA,MACR,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,UAAU,IAAK,CAAA,QAAA;AAAA,MACf,IAAM,EAAA,cAAA;AAAA,MACN,IAAM,EAAA,cAAA;AAAA,MACN,UAAU,IAAK,CAAA,YAAA;AAAA,MACf,GAAG;AAAA,KACL;AACA,IAAK,IAAA,CAAA,cAAA,EAAgB,EAAE,EAAI,EAAA,IAAA,CAAK,IAAI,GAAK,EAAA,IAAA,CAAK,KAAK,CAAA;AACnD,IAAO,OAAA,IAAA;AAAA,GACT;AACF,CAAA;;;AChQA,IAAM,UAAN,MAAc;AAAA,EACJ,SAAuC,EAAC;AAAA;AAAA,EAGhD,OAAA,CAAQ,WAAmB,KAAkB,EAAA;AAC3C,IAAM,MAAA,YAAA,GAAe,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AAC1C,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,KAAA,MAAW,YAAY,YAAc,EAAA;AACnC,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA;AAChB;AACF;AACF;AAAA,EAGA,SAAA,CAAU,WAAmB,QAAmB,EAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAO,CAAA,SAAS,CAAG,EAAA;AAC3B,MAAK,IAAA,CAAA,MAAA,CAAO,SAAS,CAAA,GAAI,EAAC;AAAA;AAE5B,IAAA,IAAA,CAAK,MAAO,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AACtC;AAAA,EAGA,WAAA,CAAY,WAAmB,QAAmB,EAAA;AAChD,IAAM,MAAA,YAAA,GAAe,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AAE1C,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAA;AAAA;AAGF,IAAM,MAAA,KAAA,GAAQ,YAAa,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAC3C,IAAA,IAAI,UAAU,EAAI,EAAA;AAChB,MAAa,YAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA;AAI9B,IAAI,IAAA,YAAA,CAAa,WAAW,CAAG,EAAA;AAC7B,MAAO,OAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA;AAC9B;AAEJ,CAAA;AAGA,IAAM,OAAA,GAAU,IAAI,OAAQ,EAAA;AAErB,IAAM,cAAA,GAAiB,CAAC,QAAwB,KAAA;AACrD,EAAQ,OAAA,CAAA,OAAA,CAAQ,yBAAe,QAAQ,CAAA;AACzC,CAAA;AAEO,IAAM,gBAAgB,CAAC,EAAA,KAC5B,OAAQ,CAAA,SAAA,CAAU,yBAAe,EAAE,CAAA;AAE9B,IAAM,YAAA,GAAe,CAAC,MAAsB,KAAA;AACjD,EAAQ,OAAA,CAAA,OAAA,CAAQ,qBAAa,MAAM,CAAA;AACrC,CAAA;AAEO,IAAM,cAAc,CAAC,EAAA,KAAgB,OAAQ,CAAA,SAAA,CAAU,qBAAa,EAAE,CAAA;AAMtE,IAAM,aAAa,CAAC,EAAA,KAAgB,OAAQ,CAAA,SAAA,CAAU,qBAAc,EAAE,CAAA;AAEtE,IAAM,iBAAiB,CAAC,EAAA,KAC7B,OAAQ,CAAA,SAAA,CAAU,6BAAkB,EAAE,CAAA;AAEjC,IAAM,SAAA,GAAY,CAAC,GAAmB,KAAA;AAC3C,EAAQ,OAAA,CAAA,OAAA,CAAQ,6BAAkB,GAAG,CAAA;AACvC,CAAA;;;ACpEO,SAAS,kBAAA,CAAmB,MAAe,MAAyB,EAAA;AACzE,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC/C,EAAO,OAAA,IAAI,MAAe,IAAM,EAAA;AAAA,IAC9B,GAAA,CAAI,QAAkB,QAAU,EAAA;AAC9B,MAAA,IAAI,aAAa,OAAS,EAAA;AAExB,QAAI,IAAA,CAAC,MAAO,CAAA,EAAA,CAAG,gBAAkB,EAAA;AAC/B,UAAA,IAAI,CAAC,MAAA,CAAO,IAAQ,IAAA,CAAC,OAAO,QAAU,EAAA;AACpC,YAAA,KAAA;AAAA,cACE;AAAA,aACF;AAAA,WACS,MAAA,IAAA,CAAC,MAAO,CAAA,EAAA,CAAG,QAAU,EAAA;AAC9B,YAAA,KAAA;AAAA,cACE;AAAA,aACF;AAAA;AACF;AAEF,QAAM,MAAA,MAAA,GAAS,OAAO,QAAQ,CAAA;AAC9B,QAAO,OAAA,SAAS,SAAS,IAAgB,EAAA;AACvC,UAAK,IAAA,CAAA,OAAA,EAAS,GAAG,IAAI,CAAA;AAErB,UAAA,MAAM,MAAS,GAAA,MAAA,CAAO,KAAM,CAAA,IAAA,EAAM,IAAI,CAAA;AACtC,UAAO,OAAA,MAAA;AAAA,SACT;AAAA;AAEF,MAAA,OAAO,OAAO,QAAQ,CAAA;AAAA;AACxB,GACD,CAAA;AACH;;;AC1BA,IAAM,eAAN,MAAmB;AAAA,EACjB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,EAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EAEA,WAAA,CAAY,QAAgB,EAAY,EAAA;AACtC,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AAC7D,IAAA,IAAA,CAAK,EAAK,GAAA,EAAA;AACV,IAAA,MAAM,UAAa,GAAA;AAAA,MACjB,GAAK,EAAA,CAAA;AAAA,MACL,GAAK,EAAA,EAAA;AAAA,MACL,iBAAmB,EAAA,GAAA;AAAA,MACnB,GAAG,MAAO,CAAA;AAAA,KACZ;AACA,IAAA,MAAM,EAAE,WAAA,EAAa,GAAG,SAAA,EAAc,GAAA,UAAA;AAEtC,IAAA,MAAA,CAAO,EAAK,GAAA,UAAA;AACZ,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,KAAA,CAAM,0BAA0B,IAAK,CAAA,SAAA,CAAU,KAAK,MAAO,CAAA,EAAE,CAAC,CAAE,CAAA,CAAA;AAEhE,IAAK,IAAA,CAAA,IAAA,GAAO,mBAAmB,IAAI,EAAA,CAAG,KAAK,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA;AAElE,IAAI,IAAA,OAAO,gBAAgB,UAAY,EAAA;AACrC,MAAA,IAAA;AAAA,QACE;AAAA,OACF;AAAA;AAIF,IAAA,IAAA,CAAK,YAAa,EAAA;AAClB,IAAA,IAAA,CAAK,IAAK,CAAA,EAAA,CAAG,SAAW,EAAA,OAAO,MAAW,KAAA;AACxC,MAAM,KAAA,CAAA,CAAA,eAAA,EAAkB,IAAK,CAAA,EAAE,CAAE,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,YAAa,EAAA;AAClB,MAAA,MAAMC,YAA2B,GAAA,eAAA;AAAA,QAC/B,MAAA;AAAA,QACA,CAAG,EAAA,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA;AAAA,OAC1B;AACA,MAAAA,YAAAA,CAAY,MAAQ,EAAA,CAAC,GAAQ,KAAA;AAC3B,QAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,yBAAyB,CAAA;AAC1D,QAAA,IAAI,GAAK,EAAA;AACP,UAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,UAAA,KAAA,CAAM,qBAAuB,EAAA;AAAA,YAC3B,SAAS,GAAI,CAAA,OAAA;AAAA,YACb,OAAO,GAAI,CAAA;AAAA,WACZ,CAAA;AACD,UAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA;AACnB,OACD,CAAA;AAAA,KACF,CAAA;AACD,IAAA,IAAA,CAAK,IAAK,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,GAAQ,KAAA;AAC7B,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,MAAK,IAAA,CAAA,CAAA,KAAA,EAAQ,IAAK,CAAA,EAAE,CAAW,OAAA,CAAA,EAAA;AAAA,QAC7B,SAAS,GAAI,CAAA,OAAA;AAAA,QACb,OAAO,GAAI,CAAA;AAAA,OACZ,CAAA;AACD,MAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,IAAK,CAAA,EAAA,CAAG,SAAW,EAAA,CAAC,OAAY,KAAA;AACnC,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,QAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AACjB,QAAM,KAAA,CAAA,CAAA,gBAAA,EAAmB,IAAK,CAAA,EAAE,CAAE,CAAA,CAAA;AAAA;AACpC,KACD,CAAA;AAAA;AACH,EAEA,YAAe,GAAA;AACb,IAAA,MAAM,EAAE,KAAM,EAAA,GAAI,MAAO,CAAA,IAAA,CAAK,QAAQ,gBAAgB,CAAA;AACtD,IAAA,IAAI,KAAK,KAAO,EAAA;AACd,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA;AAEzB,IAAK,IAAA,CAAA,KAAA,GAAQ,WAAW,MAAM;AAC5B,MAAA,KAAA;AAAA,QACE,CAAA,gCAAA,EAAmC,IAAK,CAAA,EAAE,CACxC,eAAA,EAAA,MAAA,CAAO,KAAK,MAAO,CAAA,EAAA,CAAG,iBAAiB,CAAA,IAAK,GAC9C,CAAA,EAAA;AAAA,OACF;AACA,MAAK,IAAA,CAAA,IAAA,CAAK,IAAI,MAAM;AAClB,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,QAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,OAClB,CAAA;AAAA,OACA,MAAO,CAAA,IAAA,CAAK,OAAO,EAAG,CAAA,iBAAiB,KAAK,GAAK,CAAA;AAAA;AACtD,EACA,QAAW,GAAA;AACT,IAAA,MAAM,EAAE,KAAM,EAAA,GAAI,MAAO,CAAA,IAAA,CAAK,QAAQ,gBAAgB,CAAA;AACtD,IAAM,KAAA,CAAA,CAAA,wBAAA,EAA2B,IAAK,CAAA,EAAE,CAAE,CAAA,CAAA;AAC1C,IAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,IAAK,IAAA,CAAA,IAAA,CAAK,IAAI,MAAM;AAClB,MAAM,KAAA,CAAA,CAAA,EAAG,IAAK,CAAA,EAAE,CAAqB,mBAAA,CAAA,CAAA;AAAA,KACtC,CAAA;AAAA;AAEL,CAAA;AAEA,IAAO,oBAAQ,GAAA,YAAA;AAEf,SAAS,eAAA,CAAgB,QAAgB,EAAyB,EAAA;AAChE,EAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AAC7D,EAAO,OAAA,CAAC,MAAM,IAAS,KAAA;AACrB,IAAA,IAAA,CAAK,EAAG,CAAA,OAAA,EAAS,SAAS,YAAA,CAAa,CAAU,EAAA;AAC/C,MAAM,KAAA,CAAA,CAAA,WAAA,EAAc,EAAE,CAA6B,yBAAA,CAAA,EAAA;AAAA,QACjD,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,OAAO,CAAE,CAAA;AAAA,OACV,CAAA;AACD,MAAA,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,KACb,CAAA;AAED,IAAA,IAAI,OAAO,QAAU,EAAA;AACnB,MAAA,MAAM,KAAQ,GAAA,CAAC,CAAyB,sBAAA,EAAA,MAAA,CAAO,QAAQ,CAAG,CAAA,CAAA,CAAA;AAC1D,MAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,QAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,UAAA,IAAA,CAAK,wDAAwD,CAAA;AAAA;AAE/D,QAAA,KAAA,CAAM,IAAK,CAAA,CAAA,oBAAA,EAAuB,MAAO,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA;AAAA;AAIpD,MAAA,IAAA,CAAK,MAAM,KAAM,CAAA,IAAA,CAAK,GAAG,CAAA,EAAG,SAAU,GAAY,EAAA;AAChD,QAAA,IAAI,GAAK,EAAA;AACP,UAAA,KAAA,CAAM,yBAA2B,EAAA;AAAA,YAC/B,OAAO,GAAI,CAAA,KAAA;AAAA,YACX,OAAO,GAAI,CAAA,KAAA;AAAA,YACX,SAAS,GAAI,CAAA,OAAA;AAAA,YACb,MAAM,GAAI,CAAA,IAAA;AAAA,YACV;AAAA,WACD,CAAA;AAAA,SACI,MAAA;AACL,UAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,YAAM,KAAA,CAAA,CAAA,iCAAA,EAAoC,MAAO,CAAA,QAAQ,CAAE,CAAA,CAAA;AAAA;AAE7D,UAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,YAAA,KAAA;AAAA,cACE,CAAoC,iCAAA,EAAA,MAAA,CAAO,QAAQ,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA;AAAA,aAC7E;AAAA;AACF;AAGF,QAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,OACf,CAAA;AAAA;AAEH,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,GACjB;AACF;;;ACjJA,IAAqB,YAArB,MAA+B;AAAA,EAC7B,WAAA;AAAA,EACA,OAAA;AAAA,EACQ,aAAA;AAAA,EAEA,MAAA,CACN,UACA,MACA,EAAA;AACA,IAAA,IAAI,YAAY,MAAQ,EAAA;AACtB,MAAO,OAAA,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA;AAE9B,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,OAAO,GAAG,QAAQ,CAAA,CAAA;AAAA;AAEpB,IAAO,OAAA,MAAA;AAAA;AACT,EACA,YAAY,MAAsB,EAAA;AAChC,IAAA,IAAA,CAAK,OAAU,GAAA,KAAA;AACf,IAAK,IAAA,CAAA,WAAA,uBAAkB,GAAI,EAAA;AAC3B,IAAK,IAAA,CAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,CAAY,MAAM,CAAA;AAC5C,IAAA,cAAA,CAAe,KAAK,aAAa,CAAA;AAAA;AACnC,EACA,WAAc,GAAA,CAAC,MAAyB,KAAA,CAAC,EAAkC,KAAA;AACzE,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AACnD,IAAA,IAAI,EAAM,IAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,EAAE,CAAG,EAAA;AAClC,MAAK,IAAA,CAAA,CAAA,SAAA,EAAY,EAAE,CAA2B,yBAAA,CAAA,CAAA;AAC9C,MAAA,MAAM,UAAa,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,EAAE,CAAA;AAC1C,MAAA,UAAA,EAAY,QAAS,EAAA;AACrB,MAAK,IAAA,CAAA,WAAA,CAAY,OAAO,EAAE,CAAA;AAAA,KACrB,MAAA;AACL,MAAK,IAAA,CAAA,CAAA,mBAAA,EAAsB,EAAE,CAAE,CAAA,CAAA;AAAA;AACjC,GACF;AAAA,EAEA,aAAA,GAAgB,CAAC,MAAkC,KAAA;AACjD,IAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AAC7C,IAAA,MAAM,KAAK,IAAK,CAAA,MAAA,CAAO,MAAO,CAAA,QAAA,EAAU,OAAO,MAAM,CAAA;AAErD,IAAA,MAAM,QAAW,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,EAAE,CAAA;AACxC,IAAA,IAAA,CAAK,CAAmB,gBAAA,EAAA,IAAA,CAAK,WAAY,CAAA,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAK,IAAA,CAAA,CAAA,mBAAA,EAAsB,EAAE,CAAE,CAAA,CAAA;AAC/B,MAAA,QAAA,CAAS,YAAa,EAAA;AACtB,MAAA,OAAO,QAAS,CAAA,IAAA;AAAA;AAElB,IAAA,MAAM,SAAS,IAAI,oBAAA,CAAa,IAAI,MAAO,CAAA,MAAM,GAAG,EAAE,CAAA;AACtD,IAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,EAAA,EAAI,MAAM,CAAA;AAC/B,IAAK,IAAA,CAAA,CAAA,YAAA,EAAe,EAAE,CAAE,CAAA,CAAA;AACxB,IAAA,IAAA,CAAK,CAAmB,gBAAA,EAAA,IAAA,CAAK,WAAY,CAAA,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAA,CAAK,OAAU,GAAA,KAAA;AAAA;AAEjB,IAAA,OAAO,MAAO,CAAA,IAAA;AAAA,GAChB;AAAA,EAEA,KAAA,GAAQ,CAAC,MAAyB,KAAA;AAChC,IAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AAC7C,IAAA,IAAA,CAAK,CAA4B,yBAAA,EAAA,IAAA,CAAK,WAAY,CAAA,IAAI,CAAE,CAAA,CAAA;AACxD,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA;AACf,IAAK,IAAA,CAAA,WAAA,CAAY,OAAQ,CAAA,CAAC,UAAe,KAAA;AACvC,MAAA,UAAA,CAAW,QAAS,EAAA;AAAA,KACrB,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,KAAM,EAAA;AAAA,GACzB;AACF,CAAA;;;ACxEA,IAAM,cAAA,GAAiB,QAAQ,GAAI,CAAA,cAAA;AAEnC,SAAS,oBACP,GAC4C,EAAA;AAC5C,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAO,OAAA,MAAA;AAAA;AAET,EAAA,OAAO,MAAO,CAAA,WAAA;AAAA,IACZ,MAAA,CAAO,OAAQ,CAAA,GAAG,CAAE,CAAA,MAAA;AAAA,MAClB,CAAC,GAAG,KAAK,CAAM,KAAA,KAAA,KAAU,QAAQ,KAAU,KAAA;AAAA;AAC7C,GACF;AACF;AAEO,SAAS,WAAA,CACd,MACA,EAAA,IAAA,EACA,EACA,EAAA;AACA,EAAM,MAAA,GAAA,GAAM,MAAO,CAAA,GAAA,CAAI,QAAY,IAAA,cAAA;AACnC,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAA,MAAM,SAAS,IAAI,eAAA;AAAA,IACjB,oBAAoB,EAAE;AAAA,GACxB;AACA,EAAM,MAAA,SAAA,GAAY,OAAO,QAAS,EAAA;AAClC,EAAA,OAAO,GAAG,CAAC,GAAA,EAAK,KAAK,SAAU,CAAA,CAAA,EAAG,KAAK,MAAM,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,EACvD,YAAY,CAAI,CAAA,EAAA,SAAS,KAAK,EAChC,CAAA,CAAA;AACF;;;AC7BO,IAAM,SAAA,GAAY,CAAC,MAAoB,MAAA;AAAA,EAC5C,EAAA,EAAI,WAAY,CAAA,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7B,OAAO,CAAC,EAAA,KACN,WAAY,CAAA,MAAA,EAAQ,UAAU,EAAE,CAAA;AAAA,EAClC,MAAM,CAAC,MAAA,KAAmB,YAAY,MAAQ,EAAA,CAAA,OAAA,EAAU,MAAM,CAAE,CAAA,CAAA;AAAA,EAChE,OAAA,EAAS,WAAY,CAAA,MAAA,EAAQ,UAAU,CAAA;AAAA,EACvC,QAAQ,CAAC,QAAA,KAAqB,YAAY,MAAQ,EAAA,CAAA,SAAA,EAAY,QAAQ,CAAE,CAAA,CAAA;AAAA,EACxE,MAAA,EAAQ,WAAY,CAAA,MAAA,EAAQ,SAAS,CAAA;AAAA,EACrC,cAAc,CAAC,QAAA,KACb,YAAY,MAAQ,EAAA,CAAA,SAAA,EAAY,QAAQ,CAAQ,MAAA,CAAA,CAAA;AAAA,EAClD,WAAA,EAAa,CAAC,QAAA,EAAkB,MAC9B,KAAA,WAAA,CAAY,QAAQ,CAAY,SAAA,EAAA,QAAQ,CAAU,OAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AAAA,EAC5D,cAAc,CAAC,MAAA,KACb,YAAY,MAAQ,EAAA,CAAA,OAAA,EAAU,MAAM,CAAU,QAAA,CAAA;AAClD,CAAA,CAAA;;;ACdA,IAAM,GAAM,GAAA,IAAA;AA+BZ,eAAe,GAAA,CACb,GACA,EAAA,IAAA,EACA,MACA,EAAA;AACA,EAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,GAAA,EAAK,MAAM,MAAM,CAAA;AAC3C,EAAO,OAAA,GAAA;AACT;AAEA,eAAO,KAAA,CAA6BH,UAAkB,MAAgB,EAAA;AACpE,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,GAAG,CAAA;AAEjC,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,MAAM,GAAI,CAAA,GAAA,EAAK,EAAE,OAAAA,EAAAA,QAAAA,IAAW,MAAM,CAAA;AAAA,IAE3C;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAAS,OAAA,CAAQ,cAAsBA,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,GAAG,CAAC,CAAA;AAClD;;;AC5DO,IAAM,gBAAN,MAAoB;AAAA,EACzB,QAAA;AAAA,EACA,WAAA,CAAY,MAAwB,IAAqB,EAAA;AACvD,IAAA,IAAA,CAAK,QAAW,GAAA,IAAI,QAAS,CAAA,IAAA,EAAM,IAAI,CAAA;AAAA;AAE3C,CAAA;;;ACwBA,SAAS,kBAAA,CAAmB,SAAkB,SAA0B,EAAA;AACtE,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAA,EAAG,KAAM,CAAA,IAAI,CAAK,IAAA,SAAA,EAAa,EAAA,KAAA,CAAM,IAAI,CAAA;AAC5E,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,MAAM,MAAA,WAAA,GAAc,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,MAAM,UAAU,WAAY,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,QAAA,CAAS,IAAI,CAAI,GAAA,OAAA;AAAA;AACnB;AAGF,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,MAAM,MAAA,WAAA,GAAc,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,MAAM,UAAU,WAAY,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,QAAA,CAAS,IAAI,CAAI,GAAA,OAAA;AAAA;AACnB;AAEF,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,OAAO,SAAS,SAAS,CAAA;AAAA;AAE3B,EAAO,OAAA,IAAA;AACT;AACO,SAAS,iBAAA,CAAkB,SAAkB,MAAiB,EAAA;AACnE,EAAM,MAAA,YAAA,GAAe,kBAAmB,CAAA,OAAA,EAAS,aAAa,CAAA;AAC9D,EAAA,OAAO,YAAgB,IAAA,OAAA,EAAS,GAAI,CAAA,aAAa,KAAK,MAAQ,EAAA,QAAA;AAChE;AAEO,SAAS,eAAA,CAAgB,SAAkB,MAAgB,EAAA;AAChE,EAAA,MAAM,KAAQ,GAAA,kBAAA,CAAmB,OAAS,EAAA,MAAA,CAAO,IAAI,SAAS,CAAA;AAC9D,EAAA,IAAI,KAAO,EAAA;AACT,IAAM,MAAA,GAAA,GAAM,UAAU,KAAK,CAAA;AAC3B,IAAA,OAAO,GAAI,CAAA,GAAA;AAAA;AAEb,EAAA,OAAO,OAAS,EAAA,GAAA,CAAI,cAAc,CAAA,IAAK,MAAO,CAAA,MAAA;AAChD;AAEO,SAAS,gBAAA,CACd,MACA,EAAA,GAAA,EACA,IACA,EAAA;AACA,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AAClD,EAAA,MAAM,OAAU,GAAA,IAAI,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA;AACzC,EAAQ,OAAA,CAAA,GAAA,CAAI,gBAAgB,iCAAiC,CAAA;AAC7D,EAAM,MAAA,SAAA,GAAY,OAAO,GAAK,EAAA,SAAA;AAG9B,EAAM,MAAA,UAAA,GAAa,OAAQ,CAAA,GAAA,CAAI,eAAe,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAM,MAAA,KAAA,GAAQ,kBAAmB,CAAA,OAAA,EAAS,SAAS,CAAA;AACnD,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,OAAA,CAAQ,GAAI,CAAA,eAAA,EAAiB,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA,KACrC,MAAA,IAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,CAAG,EAAA;AAC/B,MAAQ,OAAA,CAAA,GAAA,CAAI,iBAAiB,CAAU,OAAA,EAAA,QAAA,CAAS,EAAE,MAAO,EAAC,CAAC,CAAE,CAAA,CAAA;AAAA;AAC/D;AAEF,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAA;AACnC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,gBAAgB,SAAU,EAAA;AAChC,IAAA,IAAI,aAAe,EAAA;AACjB,MAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,aAAa,CAAA;AAAA,KAC9B,MAAA;AAEL,MAAA,IAAI,CAAC,GAAA,CAAI,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC3B,QAAA,KAAA;AAAA,UACE;AAAA,SACF;AAAA;AACF;AACF;AAEF,EAAA,IAAI,MAAU,IAAA,MAAA,CAAO,GAAI,CAAA,aAAA,IAAiB,IAAM,EAAA;AAC9C,IAAA,OAAA,CAAQ,IAAI,oBAAsB,EAAA,MAAA,CAAO,MAAO,CAAA,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA;AAGpE,EAAA,MAAM,cAAc,SAAU,EAAA;AAE9B,EAAI,IAAA,MAAA,IAAU,MAAO,CAAA,GAAA,CAAI,MAAQ,EAAA;AAC/B,IAAA,OAAA,CAAQ,GAAI,CAAA,aAAA,EAAe,MAAO,CAAA,GAAA,CAAI,MAAM,CAAA;AAAA,aACnC,WAAa,EAAA;AACtB,IAAQ,OAAA,CAAA,GAAA,CAAI,eAAe,WAAW,CAAA;AAAA,GACjC,MAAA;AACL,IAAA,IAAA;AAAA,MACE;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,OAAA;AACT;AAEA,eAAsB,MAAA,CACpB,MACA,EAAA,IAAA,EACA,IACmC,EAAA;AACnC,EAAA,MAAM,EAAE,KAAO,EAAA,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AAElD,EAAA,MAAM,MAAM,CAAG,EAAA,MAAA,CAAO,GAAK,EAAA,QAAQ,GAAG,IAAI,CAAA,CAAA;AAC1C,EAAA,MAAM,OAAU,GAAA,IAAI,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA;AACzC,EAAM,MAAA,QAAA,GAAW,iBAAkB,CAAA,OAAA,EAAS,MAAM,CAAA;AAClD,EAAA,MAAM,YAAe,GAAA,gBAAA,CAAiB,MAAQ,EAAA,GAAA,EAAK,IAAI,CAAA;AACvD,EAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,EAAM,MAAA,MAAA,GAAS,eAAgB,CAAA,OAAA,EAAS,MAAM,CAAA;AAC9C,EAAA,YAAA,CAAa,MAAM,CAAA;AAEnB,EAAA,IAAI,GAAI,CAAA,QAAA,CAAS,YAAY,CAAA,IAAK,CAAC,QAAU,EAAA;AAC3C,IAAO,OAAA,IAAI,cAAc,iCAAmC,EAAA;AAAA,MAC1D,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA;AAEH,EAAA,MAAM,aAAa,GAChB,CAAA,OAAA,CAAQ,YAAc,EAAA,kBAAA,CAAmB,OAAO,QAAQ,CAAC,CAAC,CAAA,CAC1D,QAAQ,UAAY,EAAA,kBAAA,CAAmB,MAAO,CAAA,MAAM,CAAC,CAAC,CAAA;AAEzD,EAAM,KAAA,CAAA,CAAA,QAAA,EAAW,UAAU,CAAE,CAAA,CAAA;AAE7B,EAAI,IAAA;AACF,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,UAAY,EAAA;AAAA,MACvC,GAAG,IAAA;AAAA,MACH,OAAS,EAAA;AAAA,KACV,CAAA,CAAE,KAAM,CAAA,CAAC,CAAM,KAAA;AACd,MAAA,KAAA,CAAM,mBAAqB,EAAA;AAAA,QACzB,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,OAAO,CAAE,CAAA,KAAA;AAAA,QACT,KAAO,EAAA;AAAA,OACR,CAAA;AACD,MAAO,OAAA,IAAI,MAAM,CAAC,CAAA;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,oBAAoB,KAAO,EAAA;AAC7B,MAAO,OAAA,IAAI,cAAc,+BAAiC,EAAA;AAAA,QACxD,MAAQ,EAAA;AAAA,OACT,CAAA;AAAA;AAEH,IAAA,IAAI,YAAY,QAAS,CAAA,MAAA,IAAU,GAAO,IAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAC/D,MAAI,IAAA,OAAO,QAAS,CAAA,KAAA,KAAU,UAAY,EAAA;AACxC,QAAI,IAAA;AACF,UAAA,KAAA;AAAA,YACE,CAAA,kBAAA,EAAqB,MAAM,MAAU,IAAA,KAAK,KACxC,QAAS,CAAA,MACX,IAAI,UAAU,CAAA,CAAA;AAAA,YACd;AAAA,cACE,IAAM,EAAA,MAAM,QAAS,CAAA,KAAA,GAAQ,IAAK;AAAA;AACpC,WACF;AAAA,iBACO,CAAG,EAAA;AACV,UAAA,KAAA;AAAA,YACE,CAAA,kBAAA,EAAqB,MAAM,MAAU,IAAA,KAAK,KACxC,QAAS,CAAA,MACX,IAAI,UAAU,CAAA,CAAA;AAAA,YACd;AAAA,cACE,IAAM,EAAA,MAAM,QAAS,CAAA,KAAA,GAAQ,IAAK;AAAA;AACpC,WACF;AAAA;AACF;AAEF,MAAO,OAAA,QAAA;AAAA;AAET,IAAI,IAAA,QAAA,EAAU,WAAW,GAAK,EAAA;AAC5B,MAAA,OAAO,IAAI,aAAc,CAAA,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAGvD,IAAI,IAAA,QAAA,EAAU,WAAW,GAAK,EAAA;AAC5B,MAAA,OAAO,IAAI,aAAc,CAAA,cAAA,EAAgB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE1D,IAAI,IAAA,QAAA,EAAU,WAAW,GAAK,EAAA;AAC5B,MAAA,OAAO,IAAI,aAAc,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAEhE,IAAA,MAAM,eACJ,OAAO,QAAA,EAAU,UAAU,UAAa,GAAA,QAAA,CAAS,OAAU,GAAA,IAAA;AAC7D,IAAA,IAAI,GAAM,GAAA,EAAA;AACV,IAAA,MAAM,MAAM,MAAO,QAAA,EAAuB,MAAO,CAAA,KAAA,CAAM,OAAO,CAAM,KAAA;AAClE,MAAA,IAAI,YAAc,EAAA;AAChB,QAAM,GAAA,GAAA,MAAM,aAAa,IAAK,EAAA;AAC9B,QAAA,IAAI,GAAK,EAAA;AACP,UAAM,KAAA,CAAA,CAAA,0BAAA,EAA6B,YAAa,CAAA,MAAM,CAAK,CAAA,CAAA,EAAA;AAAA,YACzD,OAAS,EAAA;AAAA,WACV,CAAA;AAAA;AAEH,QAAO,OAAA,CAAA;AAAA;AAET,MAAA,IAAI,CAAC,GAAK,EAAA;AACR,QAAM,KAAA,CAAA,mBAAA,EAAqB,EAAE,CAAA,EAAG,CAAA;AAAA;AAElC,MAAO,OAAA,CAAA;AAAA,KACR,CAAA;AAED,IAAA,IAAI,GAAK,EAAA;AACP,MAAA,OAAO,IAAI,aAAc,CAAA,GAAA,EAAK,EAAE,MAAQ,EAAA,YAAA,EAAc,QAAQ,CAAA;AAAA;AAGhE,IAAI,IAAA,GAAA,IAAO,aAAa,GAAK,EAAA;AAC3B,MAAM,MAAA,EAAE,SAAY,GAAA,GAAA;AACpB,MAAA,KAAA,CAAM,CAA6B,0BAAA,EAAA,YAAA,EAAc,MAAM,CAAA,EAAA,EAAK,OAAO,CAAE,CAAA,CAAA;AACrE,MAAA,OAAO,IAAI,aAAc,CAAA,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAEnD,IAAI,IAAA,GAAA,IAAO,YAAY,GAAK,EAAA;AAC1B,MAAM,MAAA;AAAA,QACJ,MAAA,EAAQ,CAAC,OAAO;AAAA,OACd,GAAA,GAAA;AACJ,MAAA,KAAA,CAAM,CAA8B,2BAAA,EAAA,YAAA,EAAc,MAAM,CAAA,EAAA,EAAK,OAAO,CAAE,CAAA,CAAA;AACtE,MAAA,OAAO,IAAI,aAAc,CAAA,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAEnD,IAAA,KAAA;AAAA,MACE,CAAA,0BAAA,EAA6B,cAAc,MAAM,CAAA,iBAAA,CAAA;AAAA,MACjD;AAAA,QACE,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,CAAS,IAAK;AAAA;AAC/B,KACF;AACA,IAAO,OAAA,IAAI,cAAc,IAAM,EAAA;AAAA,MAC7B,MAAA,EAAS,UAAuB,MAAU,IAAA;AAAA,KAC3C,CAAA;AAAA,WACM,CAAG,EAAA;AACV,IAAO,OAAA,IAAI,cAAc,kCAAoC,EAAA;AAAA,MAC3D,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA;AAEL;;;ACrLA,eAAsB,IAAA,CACpB,QACA,IACA,EAAA;AACA,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAA,MAAM,QAAW,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA;AACjD,EAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,CAAI,eAAe,CAAA;AAC3D,EAAA,MAAM,MAAS,GAAA,QAAA,IAAY,iBAAkB,CAAA,IAAA,CAAK,QAAQ,OAAO,CAAA;AAEjE,EAAM,MAAA,GAAA,GAAM,UAAU,MAAM,CAAA,CAAE,MAAM,EAAE,QAAA,EAAU,MAAQ,EAAA,aAAA,EAAe,CAAA;AAEvE,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;AC7CA,eAAsBI,IAAAA,CACpB,MACA,EAAA,IAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAA,MAAM,QAAW,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA;AACjD,EAAA,MAAM,MAAS,GAAA,QAAA,IAAY,iBAAkB,CAAA,IAAA,CAAK,QAAQ,OAAO,CAAA;AAEjE,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,aAAa,MAAM,CAAA;AACjD,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACVA,eAAsB,GAAA,CACpB,MACA,EAAA,OAAA,EACA,IACA,EAAA;AACA,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AAId,EAAA,MAAM,CAAC,MAAM,CAAI,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAG,CAAE,CAAA,QAAA,CAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AAEvE,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,KAAK,MAAM,CAAA;AAEzC,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;AClDA,IAAMH,IAAM,GAAA,OAAA;AAEZ,eAAOF,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AAAA,IACf,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYC,IAAG,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,OAAU,GAAA,MAAM,IAAKD,CAAAA,QAAAA,EAAS,MAAM,CAAA;AAE1C,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,MAAMI,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAAJ,EAAAA,QAAAA,IAAW,IAAI,CAAA;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,MAAM,IAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAA,UAAS,CAAA;AAAA,IACvC,KAAK,KAAA;AACH,MAAA,OAAO,MAAM,GAAI,CAAA,MAAA,EAAQ,SAAS,EAAE,OAAA,EAAAA,UAAS,CAAA;AAAA,IAE/C;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AACO,SAASK,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaC,IAAG,CAAC,CAAA;AAClD;;;ACEA,eAAsBG,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEtD,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAA;AACvD,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACCA,eAAsBE,KAAAA,CACpB,MACA,EAAA,OAAA,EACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAGtD,EAAA,IAAA,CAAK,OAAO,IAAK,CAAA,SAAA,CAAU,EAAE,KAAO,EAAA,OAAA,CAAQ,OAAO,CAAA;AACnD,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,aAAa,QAAQ,CAAA;AAEnD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;AC5BA,eAAsB,MAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAErC,EAAM,MAAA,CAAC,MAAQ,EAAA,CAAA,EAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAE/D,EAAA,IAAA,CAAK,MAAS,GAAA,QAAA;AACd,EAAA,IAAA,CAAK,OAAO,IAAK,CAAA,SAAA,CAAU,EAAE,KAAA,EAAO,QAAQ,CAAA;AAC5C,EAAM,MAAA,GAAA,GAAM,GAAG,SAAU,CAAA,MAAM,EAAE,WAAY,CAAA,QAAA,EAAU,MAAM,CAAC,CAAA,CAAA;AAE9D,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACfA,eAAsBC,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEtD,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAA;AAEvD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;AC7BA,IAAMN,IAAM,GAAA,cAAA;AAEZ,eAAOF,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AAAA,IACf,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYC,IAAG,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,OAAU,GAAA,MAAM,IAAKD,CAAAA,QAAAA,EAAS,MAAM,CAAA;AAE1C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,IAAA,CAAK,KAAK,CAAA;AACV,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAA,MAAM,IAAO,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAChC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEtD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,IAAA,CAAK,4BAA4B,CAAA;AACjC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,MAAMI,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAJ,UAAS,CAAA;AAAA,IACtC,KAAK,MAAA;AACH,MAAA,OAAO,MAAMM,KAAK,CAAA,MAAA,EAAQ,SAAS,EAAE,OAAA,EAAAN,UAAS,CAAA;AAAA,IAChD,KAAK,KAAA;AACH,MAAA,OAAO,MAAMO,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAP,UAAS,CAAA;AAAA,IACtC,KAAK,QAAA;AACH,MAAA,OAAO,MAAM,MAAO,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAA,UAAS,CAAA;AAAA,IAEzC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASK,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,MAAM,GAAM,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAC/B,EAAM,MAAA,CAAC,MAAQ,EAAA,gBAAA,EAAkB,QAAQ,CAAA,GAAI,IAAI,QAC9C,CAAA,KAAA,CAAM,GAAG,CAAA,CACT,OAAQ,EAAA;AACX,EAAID,IAAAA,OAAAA,GAAQ,YAAaE,CAAAA,IAAG,CACzB,CAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA,CAC9B,OAAQ,CAAA,UAAA,EAAY,MAAM,CAAA;AAC7B,EAAA,IAAI,WAAW,OAAS,EAAA;AACtB,IAAAF,UAAQ,YAAaE,CAAAA,IAAG,CAAE,CAAA,OAAA,CAAQ,cAAc,gBAAgB,CAAA;AAAA;AAElE,EAAO,OAAA,UAAA,CAAWD,QAAQ,CAAA,GAAA,EAAKD,OAAK,CAAA;AACtC;;;AC1BA,eAAsBK,IAAAA,CACpB,MACA,EAAA,OAAA,EACA,IACA,EAAA;AACA,EAAI,IAAA,GAAA,GAAM,GAAG,SAAU,CAAA,MAAM,EAAE,YAAa,CAAA,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAA;AACvD,EAAA,IAAI,OAAO,OAAY,KAAA,QAAA,IAAY,MAAU,IAAA,OAAA,IAAW,QAAQ,IAAM,EAAA;AACpE,IAAM,GAAA,GAAA,CAAA,EAAG,UAAU,MAAM,CAAA,CAAE,aAAa,OAAQ,CAAA,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AAAA;AAG1D,EAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,GAAA,EAAK,MAAM,MAAM,CAAA;AAC3C,EAAO,OAAA,GAAA;AACT;;;ACRA,eAAsBA,IAAAA,CACpB,MACA,EAAA,IAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAK,SAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AACpD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACnBA,eAAsBI,OAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAK,SAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AACpD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,IAAA,CAAK,MAAS,GAAA,QAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACVA,eAAsBD,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAK,SAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AACpD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACPA,eAAsBD,KAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,SAAU,CAAA,MAAM,EAAE,OAAO,CAAA,CAAA;AAExC,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;AC1CA,SAAS,OAAO,KAAkC,EAAA;AAChD,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,MAAM,KACJ,GAAA,6EAAA;AAEF,EAAO,OAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AAEA,IAAML,IAAM,GAAA,SAAA;AAEZ,eAAOF,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AAAA,IACf,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYC,IAAG,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,OAAU,GAAA,MAAM,IAAKD,CAAAA,QAAAA,EAAS,MAAM,CAAA;AAE1C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,IAAA,CAAK,KAAK,CAAA;AACV,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAM,MAAA,CAAC,gBAAgB,CAAIA,GAAAA,QAAAA,CAAQ,IAAI,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AAE1D,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAI,IAAA,MAAA,CAAO,gBAAgB,CAAG,EAAA;AAC5B,QAAA,OAAO,MAAMI,IAAW,CAAA,MAAA,EAAQ,EAAE,OAAAJ,EAAAA,QAAAA,IAAW,IAAI,CAAA;AAAA;AAEnD,MAAA,OAAO,MAAMI,IAAI,CAAA,MAAA,EAAQ,SAAS,EAAE,OAAA,EAAAJ,UAAS,CAAA;AAAA,IAC/C,KAAK,MAAA;AACH,MAAA,OAAO,MAAMM,KAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAN,UAAS,CAAA;AAAA,IACvC,KAAK,QAAA;AACH,MAAA,OAAO,MAAMQ,OAAO,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAR,UAAS,CAAA;AAAA,IACzC,KAAK,KAAA;AACH,MAAA,OAAO,MAAMO,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAP,UAAS,CAAA;AAAA,IAEtC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASK,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaC,IAAG,CAAC,CAAA;AAClD;;;ACtDO,IAAM,WAAA,GAAc,CAAC,MAAoB,MAAA;AAAA,EAC9C,MAAA,EAAQ,WAAY,CAAA,MAAA,EAAQ,cAAc,CAAA;AAAA,EAC1C,SAAA,EAAW,WAAY,CAAA,MAAA,EAAQ,iBAAiB,CAAA;AAAA,EAChD,OAAA,EAAS,WAAY,CAAA,MAAA,EAAQ,eAAe,CAAA;AAAA,EAC5C,IAAA,EAAM,WAAY,CAAA,MAAA,EAAQ,YAAY,CAAA;AAAA,EACtC,QAAA,EAAU,WAAY,CAAA,MAAA,EAAQ,gBAAgB,CAAA;AAAA,EAC9C,OAAA,EAAS,WAAY,CAAA,MAAA,EAAQ,eAAe,CAAA;AAAA,EAC5C,KAAA,EAAO,WAAY,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,EACxC,cAAA,EAAgB,WAAY,CAAA,MAAA,EAAQ,sBAAsB,CAAA;AAAA,EAC1D,cAAA,EAAgB,WAAY,CAAA,MAAA,EAAQ,sBAAsB;AAC5D,CAAA,CAAA;;;ACuBA,IAAMA,IAAM,GAAA,QAAA;AAEZ,eAAOF,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAA,IAAI,GAAM,GAAA,WAAA,CAAY,MAAM,CAAA,CAAEE,IAAG,CAAA;AAEjC,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,QAAQ,GAAI,CAAA,MAAA;AAAA,IACZ,SAAS,GAAI,CAAA;AAAA,GACf;AACA,EAAI,IAAA,GAAA,CAAI,WAAW,MAAQ,EAAA;AACzB,IAAA,MAAM,CAAC,QAAQ,CAAI,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEhE,IAAA,GAAA,GAAM,GAAG,WAAY,CAAA,MAAM,EAAEA,IAAG,CAAC,IAAI,QAAQ,CAAA,CAAA;AAAA;AAG/C,EAAA,MAAM,cAAiB,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA;AACtC,EAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,cAAA,CAAe,MAAM,CAAA;AAExD,EAAA,GAAA,GAAM,CAAG,EAAA,GAAG,CAAG,EAAA,MAAA,CAAO,QAAS,EAAA,KAAM,EAAK,GAAA,CAAA,CAAA,EAAI,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAEtE,EAAM,MAAA,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,OAAA,EAAS,GAAI,EAAA,EAAG,MAAM,CAAA;AAEhE,EAAO,OAAA,GAAA;AACT;AACO,SAASI,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaC,IAAG,CAAC,CAAA;AAClD;;;ACzDA,eAAOF,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAE,CAAA,OAAA;AAAA,IACpB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASM,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,OAAO,CAAA;AACrD;;;ACZA,eAAOD,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAE,CAAA,SAAA;AAAA,IACpB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASM,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,SAAS,CAAA;AACvD;;;ACZA,eAAOD,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAE,CAAA,IAAA;AAAA,IACpB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASM,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,IAAI,CAAA;AAClD;;;ACXA,IAAMC,IAAM,GAAA,UAAA;AAEZ,eAAOF,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAM,MAAA,EAAE,OAAU,GAAA,MAAA;AAAA,IAChB,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYE,IAAG,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,CAAC,QAAQ,CAAI,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAChE,EAAI,IAAA;AACF,IAAA,MAAM,cAAiB,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,cAAA,CAAe,MAAM,CAAA;AACxD,IAAA,MAAM,MAAM,CAAG,EAAA,WAAA,CAAY,MAAM,CAAEA,CAAAA,IAAG,CAAC,CAAI,CAAA,EAAA,QAAQ,GACjD,MAAO,CAAA,QAAA,OAAe,EAAK,GAAA,CAAA,CAAA,EAAI,OAAO,QAAS,EAAC,KAAK,EACvD,CAAA,CAAA;AAEA,IAAA,MAAM,MAAM,MAAM,OAAA;AAAA,MAChB,GAAA;AAAA,MACA;AAAA,QACE,OAAS,EAAA,GAAA;AAAA,QACT,QAAQ,GAAI,CAAA;AAAA,OACd;AAAA,MACA;AAAA,KACF,CAAE,KAAM,CAAA,CAAC,CAAM,KAAA;AACb,MAAA,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,QAAW,GAAA,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,QAC7B,MAAQ,EAAA,GAAA;AAAA,QACR,SAAS,GAAK,EAAA;AAAA,OACf,CAAA;AAAA;AAEH,IAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,MAC7B,QAAQ,GAAK,EAAA,MAAA;AAAA,MACb,SAAS,GAAK,EAAA;AAAA,KACf,CAAA;AAAA,WACM,CAAG,EAAA;AACV,IAAA,KAAA,CAAM,CAAC,CAAA;AAAA;AAET,EAAA,OAAO,IAAI,QAAS,CAAA,mCAAA,EAAqC,EAAE,MAAA,EAAQ,KAAK,CAAA;AAC1E;AACO,SAASI,QAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,QAAQ,CAAA;AACtD;;;AC7CA,IAAMC,IAAM,GAAA,SAAA;AACZ,eAAOF,OAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAA,IAAI,GAAM,GAAA,WAAA,CAAY,MAAM,CAAA,CAAEC,IAAG,CAAA;AAEjC,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,QAAQD,QAAQ,CAAA;AAAA,GAClB;AACA,EAAIA,IAAAA,QAAAA,CAAQ,WAAW,MAAQ,EAAA;AAC7B,IAAA,IAAA,CAAK,OAAOA,QAAQ,CAAA,IAAA;AACpB,IAAA,MAAM,CAAC,QAAQ,CAAI,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACpE,IAAA,GAAA,GAAM,CAAG,EAAA,WAAA,CAAY,MAAM,CAAA,CAAEC,IAAG,CAAC,CAC/B,EAAA,QAAA,KAAa,SAAY,GAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,EAC5C,CAAA,CAAA;AAAA;AAGF,EAAM,MAAA,GAAA,GAAM,MAAM,OAAA,CAAM,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,OAAA,EAAAD,QAAQ,EAAA,EAAG,MAAM,CAAA;AACzD,EAAO,OAAA,GAAA;AACT;AACO,SAASK,SAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaC,IAAG,CAAC,CAAA;AAClD;;;ACpBA,IAAMA,IAAM,GAAA,OAAA;AACZ,eAAOF,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAA,CAAEE,IAAG,CAAA;AAAA,IACvB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASI,SAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaC,IAAG,CAAC,CAAA;AAClD;;;ACbA,IAAMA,IAAM,GAAA,gBAAA;AAEZ,eAAOF,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAA,CAAEE,IAAG,CAAA;AAAA,IACvB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASI,SAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaC,IAAG,CAAC,CAAA;AAClD;;;ACdA,IAAMA,KAAM,GAAA,gBAAA;AACZ,eAAOF,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAA,MAAM,GAAM,GAAA,WAAA,CAAY,MAAM,CAAA,CAAEE,KAAG,CAAA;AAEnC,EAAA,MAAM,MAAM,MAAM,OAAA;AAAA,IAChB,GAAA;AAAA,IACA;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAW,GAAA,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAC5C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,MAC7B,MAAQ,EAAA,GAAA;AAAA,MACR,SAAS,GAAK,EAAA;AAAA,KACf,CAAA;AAAA;AAEH,EAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,IAC7B,QAAQ,GAAK,EAAA,MAAA;AAAA,IACb,SAAS,GAAK,EAAA;AAAA,GACf,CAAA;AACH;AACO,SAASI,SAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,cAAc,CAAA;AAC5D;;;ACtBe,SAAR,MAAA,CAAwB,cAAsB,MAAgB,EAAA;AACnE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AACrD,EAAO,OAAA,eAAeI,KAAI,GAAc,EAAA;AACtC,IAAI,IAAA,OAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAChC,MAAA,IAAA,CAAK,YAAY,CAAA;AACjB,MAAO,OAAA,KAAA,CAAG,KAAK,MAAM,CAAA;AAAA;AAEvB,IAAIC,IAAAA,QAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACzC,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAON,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAEhC,IAAIM,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AACnC,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAON,OAAAA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA;AAG1B,IAAIM,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAON,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAG5B,IAAeM,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBN,OAAAA,MAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAG7C,IAAeM,IAAAA,QAAAA,CAAY,YAAc,EAAA,GAAG,CAAG,EAAA;AAC7C,MAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,MAAkBN,OAAAA,MAAAA,CAAa,KAAK,MAAM,CAAA;AAAA;AAG5C,IAAeM,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AAChD,MAAA,IAAA,CAAK,mBAAmB,CAAA;AACxB,MAAkBN,OAAAA,MAAAA,CAAgB,KAAK,MAAM,CAAA;AAAA;AAG/C,IAAeM,IAAAA,QAAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAC3C,MAAA,IAAA,CAAK,cAAc,CAAA;AACnB,MAAkBN,OAAAA,MAAAA,CAAW,KAAK,MAAM,CAAA;AAAA;AAG1C,IAAeM,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AACtD,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAkBN,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAGnD,IAAeM,IAAAA,QAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AAC/C,MAAA,IAAA,CAAK,kBAAkB,CAAA;AACvB,MAAkBN,OAAAA,MAAAA,CAAe,KAAK,MAAM,CAAA;AAAA;AAE9C,IAAeM,IAAAA,SAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBN,OAAAA,OAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAE7C,IAAeM,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AACtD,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAkBN,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAEnD,IAAeM,IAAAA,SAAAA,CAAW,YAAc,EAAA,GAAG,CAAG,EAAA;AAC5C,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAkBN,OAAAA,OAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAE3C,IAAA,IAAA,CAAK,uBAAuB,CAAA;AAC5B,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;ACVA,eAAsBO,KAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,SAAU,CAAA,MAAM,EAAE,MAAM,CAAA,CAAA;AAEvC,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACrEA,IAAML,KAAM,GAAA,QAAA;AAEZ,eAAOF,OAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,MAAMM,KAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAN,UAAS,CAAA;AAAA,IAEvC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASK,SAAAA,CAAQ,cAAsBL,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaC,KAAG,CAAC,CAAA;AAClD;;;ACTe,SAAR,MAAA,CAAwB,cAAsB,MAAgB,EAAA;AACnE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AAC7D,EAAO,OAAA,eAAeK,MAAK,GAAc,EAAA;AAEvC,IAAI,IAAA,UAAA,CAAW,YAAc,EAAA,GAAG,CAAG,EAAA;AACjC,MAAA,IAAI,IAAI,IAAM,EAAA;AACZ,QAAI,IAAA;AACF,UAAM,MAAA,IAAA,GAAO,MAAM,GAAA,CAAI,IAAK,EAAA;AAC5B,UAAA,KAAA,CAAM,IAAI,CAAA;AACV,UAAO,OAAA,IAAI,SAAS,IAAM,EAAA;AAAA,YACxB,MAAQ,EAAA;AAAA,WACT,CAAA;AAAA,iBACM,CAAG,EAAA;AAAA;AAEZ;AACF;AAGF,IAAID,IAAAA,QAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACzC,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAON,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAGhC,IAAIM,IAAAA,SAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AACpC,MAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,MAAON,OAAAA,OAAAA,CAAO,KAAK,MAAM,CAAA;AAAA;AAG3B,IAAIM,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AACnC,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAON,OAAAA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA;AAE1B,IAAIM,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAON,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAG5B,IAAeM,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBN,OAAAA,MAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAG7C,IAAeM,IAAAA,QAAAA,CAAY,YAAc,EAAA,GAAG,CAAG,EAAA;AAC7C,MAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,MAAkBN,OAAAA,MAAAA,CAAa,KAAK,MAAM,CAAA;AAAA;AAE5C,IAAeM,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AACtD,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAkBN,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAGnD,IAAeM,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AAChD,MAAA,IAAA,CAAK,mBAAmB,CAAA;AACxB,MAAkBN,OAAAA,MAAAA,CAAgB,KAAK,MAAM,CAAA;AAAA;AAG/C,IAAeM,IAAAA,QAAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAC3C,MAAA,IAAA,CAAK,cAAc,CAAA;AACnB,MAAkBN,OAAAA,MAAAA,CAAW,KAAK,MAAM,CAAA;AAAA;AAG1C,IAAeM,IAAAA,QAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AAC/C,MAAA,IAAA,CAAK,kBAAkB,CAAA;AACvB,MAAkBN,OAAAA,MAAAA,CAAe,KAAK,MAAM,CAAA;AAAA;AAE9C,IAAeM,IAAAA,SAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBN,OAAAA,OAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAE7C,IAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;AC3Ee,SAAR,OAAA,CAAyB,cAAsB,MAAgB,EAAA;AACpE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,kBAAkB,CAAA;AACxD,EAAO,OAAA,eAAeS,QAAO,GAAc,EAAA;AACzC,IAAIH,IAAAA,QAAAA,CAAoB,YAAc,EAAA,GAAG,CAAG,EAAA;AAC1C,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAON,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAGhC,IAAIM,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAON,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAG5B,IAAA,IAAA,CAAK,0BAA0B,CAAA;AAC/B,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;ACde,SAAR,KAAA,CAAuB,cAAsB,MAAgB,EAAA;AAClE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AACrD,EAAO,OAAA,eAAeQ,KAAI,GAAc,EAAA;AACtC,IAAIF,IAAAA,QAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACzC,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAON,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAEhC,IAAIM,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AACnC,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAON,OAAAA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA;AAE1B,IAAIM,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAON,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAE5B,IAAIM,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AAC3C,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAON,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAExC,IAAA,IAAA,CAAK,uBAAuB,CAAA;AAC5B,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;ACxBe,SAAR,QAAA,CAA0B,cAAsB,MAAgB,EAAA;AACrE,EAAMK,MAAAA,IAAAA,GAAM,MAAO,CAAA,YAAA,EAAc,MAAM,CAAA;AACvC,EAAME,MAAAA,KAAAA,GAAO,MAAO,CAAA,YAAA,EAAc,MAAM,CAAA;AACxC,EAAME,MAAAA,OAAAA,GAAS,OAAQ,CAAA,YAAA,EAAc,MAAM,CAAA;AAC3C,EAAMD,MAAAA,IAAAA,GAAM,KAAM,CAAA,YAAA,EAAc,MAAM,CAAA;AACtC,EAAO,OAAA;AAAA,IACL,GAAAH,EAAAA,IAAAA;AAAA,IACA,IAAAE,EAAAA,KAAAA;AAAA,IACA,MAAAE,EAAAA,OAAAA;AAAA,IACA,GAAAD,EAAAA;AAAA,GACF;AACF;;;ACjBO,IAAM,SAAA,GAAY,CAAC,MAAA,GAAS,MAAoB,MAAA;AAAA,EACrD,MAAA,EAAQ,GAAG,MAAM,CAAA,YAAA,CAAA;AAAA,EACjB,SAAA,EAAW,GAAG,MAAM,CAAA,eAAA,CAAA;AAAA,EACpB,OAAA,EAAS,GAAG,MAAM,CAAA,aAAA,CAAA;AAAA,EAClB,IAAA,EAAM,GAAG,MAAM,CAAA,UAAA,CAAA;AAAA,EACf,QAAA,EAAU,GAAG,MAAM,CAAA,cAAA,CAAA;AAAA,EACnB,OAAA,EAAS,GAAG,MAAM,CAAA,aAAA,CAAA;AAAA,EAClB,KAAA,EAAO,GAAG,MAAM,CAAA,WAAA,CAAA;AAAA,EAChB,cAAA,EAAgB,GAAG,MAAM,CAAA,oBAAA,CAAA;AAAA,EACzB,cAAA,EAAgB,GAAG,MAAM,CAAA,oBAAA,CAAA;AAAA,EACzB,EAAA,EAAI,GAAG,MAAM,CAAA,GAAA,CAAA;AAAA,EACb,KAAA,EAAO,GAAG,MAAM,CAAA,MAAA,CAAA;AAAA,EAChB,OAAA,EAAS,GAAG,MAAM,CAAA,QAAA,CAAA;AAAA,EAClB,MAAA,EAAQ,GAAG,MAAM,CAAA,mBAAA,CAAA;AAAA,EACjB,WAAA,EAAa,GAAG,MAAM,CAAA,kCAAA,CAAA;AAAA,EACtB,YAAA,EAAc,GAAG,MAAM,CAAA,yBAAA,CAAA;AAAA,EACvB,MAAA,EAAQ,GAAG,MAAM,CAAA,OAAA,CAAA;AAAA,EACjB,GAAA,EAAK,GAAG,MAAM,CAAA,KAAA;AAChB,CAAA,CAAA;;;ACZA,IAAqB,SAAA,GAArB,cAA0C,MAAO,CAAA;AAAA,EAC/C,YAAY,MAAgB,EAAA;AAC1B,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA;AACd,EAEA,MAAM,UAAA,CACJ,MACA,EAAA,GAAA,EACA,MACA,IACmB,EAAA;AACnB,IAAA,MAAM,KAAQ,GAAA;AAAA,MACZ,IAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,GAAM,GAAA,MAAM,MAAO,CAAA,IAAA,EAAM,KAAK,KAAK,CAAA;AAEzC,IAAA,IAAI,eAAe,aAAe,EAAA;AAChC,MAAA,OAAO,GAAI,CAAA,QAAA;AAAA;AAGb,IAAO,OAAA,GAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAgB,OAAA,CACd,MACA,EAAA,GAAA,EACA,KACA,IACmB,EAAA;AAEnB,IAAA,MAAM,UAAU,IAAI,OAAA,CAAQ,OAAO,IAAM,EAAA,OAAA,GAAU,EAAE,CAAA;AACrD,IAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,MAAM,MAAA,QAAA,GAAW,GAAI,CAAA,GAAA,CAAI,aAAa,CAAA;AACtC,MAAM,MAAA,MAAA,GAAS,GAAI,CAAA,GAAA,CAAI,QAAQ,CAAA;AAC/B,MAAA,IAAI,QAAU,EAAA;AACZ,QAAQ,OAAA,CAAA,GAAA,CAAI,eAAe,QAAQ,CAAA;AAAA;AAErC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,MAAM,CAAA;AAAA;AAC9B,KACF,MAAA,IAAW,eAAe,OAAS,EAAA;AAEjC,MAAA,MAAM,QAAW,GAAA,IAAI,OAAQ,CAAA,GAAA,EAAK,OAAO,CAAA;AACzC,MAAM,MAAA,QAAA,GAAW,QAAS,CAAA,GAAA,CAAI,aAAa,CAAA;AAC3C,MAAM,MAAA,MAAA,GAAS,QAAS,CAAA,GAAA,CAAI,QAAQ,CAAA;AACpC,MAAA,IAAI,QAAU,EAAA;AACZ,QAAQ,OAAA,CAAA,GAAA,CAAI,eAAe,QAAQ,CAAA;AAAA;AAErC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,MAAM,CAAA;AAAA;AAC9B;AAGF,IAAI,IAAA,IAAA,GAA2B,IAAK,CAAA,SAAA,CAAU,GAAG,CAAA;AAGjD,IAAA,IAAI,WAAW,KAAO,EAAA;AACpB,MAAO,IAAA,GAAA,MAAA;AAAA,KACT,MAAA,IAAW,eAAe,OAAS,EAAA;AACjC,MAAA,IAAA,GAAO,MAAM,IAAI,QAAA,CAAS,GAAI,CAAA,IAAI,EAAE,IAAK,EAAA;AAAA,KAC3C,MAAA;AAAA;AAAA,MAEE,GAAe,YAAA,OAAA,IACf,IAAK,CAAA,SAAA,CAAU,GAAG,CAAM,KAAA,IAAA,IACvB,GAAO,IAAA,OAAO,QAAQ,QAAY,IAAA,MAAA,CAAO,MAAO,CAAA,GAAG,EAAE,MAAW,KAAA;AAAA,MACjE;AACA,MAAO,IAAA,GAAA,MAAA;AAAA;AAGT,IAAA,MAAM,KAAQ,GAAA;AAAA,MACZ,GAAG,IAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,OAAO,MAAM,IAAK,CAAA,UAAA,CAAW,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA;AACvD,EAEA,MAAM,IAAA,CACJ,GACA,EAAA,GAAA,EACA,IACuB,EAAA;AACvB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,MAAQ,EAAA,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1D,IAAA,IAAI,YAAY,QAAS,CAAA,MAAA,IAAU,GAAO,IAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAC/D,MAAM,MAAA,MAAA,GAAS,SAAS,KAAM,EAAA;AAC9B,MAAI,IAAA;AACF,QAAO,OAAA,MAAM,OAAO,IAAK,EAAA;AAAA,eAClB,CAAG,EAAA;AAAA;AAEZ;AAEF,IAAO,OAAA,QAAA;AAAA;AACT,EAEA,MAAM,GACJ,CAAA,GAAA,EACA,GACA,EAAA,IAAA,EACA,MAAM,KACiB,EAAA;AACvB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,KAAO,EAAA,GAAA,EAAK,KAAK,IAAI,CAAA;AACzD,IAAA,IAAI,GAAK,EAAA;AACP,MAAO,OAAA,QAAA;AAAA;AAET,IAAA,IAAI,YAAY,QAAS,CAAA,MAAA,IAAU,GAAO,IAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAC/D,MAAM,MAAA,MAAA,GAAS,SAAS,KAAM,EAAA;AAC9B,MAAI,IAAA;AACF,QAAO,OAAA,MAAM,OAAO,IAAK,EAAA;AAAA,eAClB,CAAG,EAAA;AAAA;AAEZ;AAEF,IAAO,OAAA,QAAA;AAAA;AACT,EAEA,MAAM,GAAA,CACJ,GACA,EAAA,GAAA,EACA,IACuB,EAAA;AACvB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,KAAO,EAAA,GAAA,EAAK,KAAK,IAAI,CAAA;AACzD,IAAA,IAAI,YAAY,QAAS,CAAA,MAAA,IAAU,GAAO,IAAA,QAAA,CAAS,SAAS,GAAK,EAAA;AAC/D,MAAM,MAAA,MAAA,GAAS,SAAS,KAAM,EAAA;AAC9B,MAAI,IAAA;AACF,QAAO,OAAA,MAAM,OAAO,IAAK,EAAA;AAAA,eAClB,CAAG,EAAA;AAAA;AAEZ;AAEF,IAAO,OAAA,QAAA;AAAA;AACT,EAEA,MAAM,MAAA,CACJ,GACA,EAAA,GAAA,EACA,IACmB,EAAA;AACnB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,QAAU,EAAA,GAAA,EAAK,KAAK,IAAI,CAAA;AAC5D,IAAO,OAAA,QAAA;AAAA;AAEX,CAAA;;;ACxJO,SAAS,WAAA,CACd,QACA,QAMA,EAAA;AACA,EAAM,MAAA,MAAA,GAAS,MAAO,CAAA,GAAA,CAAI,MAAU,IAAA,uBAAA;AACpC,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAO,OAAU,GAAA,MAAA,CAAO,QAAQ,qBAAqB,CAAA;AACnE,EAAA,MAAM,MAAS,GAAA,SAAA,CAAU,MAAO,CAAA,GAAA,CAAI,WAAW,CAAA;AAC/C,EAAA,OAAO,eAAe,KAAqC,CAAA;AAAA,IACzD,KAAA;AAAA,IACA;AAAA,GAIC,EAAA;AACD,IAAI,IAAA,CAAC,KAAS,IAAA,CAAC,QAAU,EAAA;AACvB,MAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA;AAAA;AAGzE,IAAM,MAAA,UAAA,GAAa,IAAI,GAAI,CAAA,CAAA,EAAG,MAAM,CAAG,EAAA,MAAA,CAAO,SAAS,CAAE,CAAA,CAAA;AACzD,IAAA,MAAM,WAAc,GAAA;AAAA,MAClB,MAAM,UAAW,CAAA,IAAA;AAAA,MACjB,CAAC,aAAa,GAAG;AAAA,KACnB;AACA,IAAK,IAAA,CAAA,CAAA,wBAAA,EAA2B,KAAK,CAAE,CAAA,CAAA;AACvC,IAAM,MAAA,UAAA,GAAa,IAAI,OAAA,CAAQ,UAAY,EAAA;AAAA,MACzC,MAAQ,EAAA,KAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,UAAa,GAAA,MAAM,QAAS,CAAA,IAAA,CAAK,UAAU,CAAA;AAEjD,IAAI,IAAA,UAAA,EAAY,WAAW,GAAK,EAAA;AAC9B,MAAM,MAAA,IAAI,MAAM,0CAA0C,CAAA;AAAA;AAG5D,IAAI,IAAA,SAAA;AACJ,IAAI,IAAA;AACF,MAAY,SAAA,GAAA,MAAM,YAAY,IAAK,EAAA;AAAA,aAC5B,CAAG,EAAA;AACV,MAAK,IAAA,CAAA,UAAA,EAAY,EAAE,UAAA,EAAY,CAAA;AAC/B,MAAA,KAAA,CAAM,CAAC,CAAA;AAAA;AAGT,IAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,IAAM,MAAA,IAAA,GAAO,IAAI,GAAI,CAAA,CAAA,EAAG,MAAM,CAAG,EAAA,MAAA,CAAO,IAAI,CAAE,CAAA,CAAA;AAC9C,IAAM,MAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAM,EAAA;AAAA,MAChC,MAAQ,EAAA,KAAA;AAAA,MACR,OAAA,EAAS,IAAI,OAAQ,CAAA;AAAA,QACnB,GAAG;AAAA,OACJ;AAAA,KACF,CAAA;AACD,IAAA,MAAM,OAAU,GAAA,MAAM,QAAS,CAAA,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAI,IAAA,SAAA;AACJ,IAAI,IAAA;AACF,MAAA,MAAM,IAAQ,GAAA,MAAM,OAAS,EAAA,IAAA,MAAW,EAAC;AACzC,MAAA,SAAA,GAAY,IAAM,EAAA,SAAA;AAAA,aACX,CAAG,EAAA;AACV,MAAK,IAAA,CAAA,UAAA,EAAY,EAAE,OAAA,EAAS,CAAA;AAC5B,MAAM,KAAA,CAAA,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA;AAAA;AAGtB,IAAA,MAAM,EAAE,WAAA,EAAgB,GAAA,SAAA,IAAa,EAAC;AAEtC,IAAA,MAAM,UAAa,GAAA,OAAA,EAAS,OAAQ,CAAA,GAAA,CAAI,YAAY,CAAA;AAEpD,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAEF,IAAA,MAAM,SAAY,GAAA,IAAI,GAAI,CAAA,WAAA,CAAY,WAAW,CAAA;AAEjD,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAA,KAAA,CAAM,aAAe,EAAA,EAAE,OAAS,EAAA,OAAA,EAAS,SAAS,CAAA;AAClD,MAAM,MAAA,IAAI,MAAM,4CAA4C,CAAA;AAAA;AAE9D,IAAA,IAAA,CAAK,CAAiC,8BAAA,EAAA,KAAK,CAAI,CAAA,EAAA,SAAA,CAAU,IAAI,CAAE,CAAA,CAAA;AAC/D,IAAM,MAAA,IAAA,GAAO,KAAK,SAAU,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAa,WAAY,CAAA;AAAA,KAC1B,CAAA;AACD,IAAM,MAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,MACrC,MAAQ,EAAA,MAAA;AAAA,MACR,OAAA,EAAS,IAAI,OAAQ,CAAA;AAAA,QACnB,GAAG,WAAA;AAAA,QACH,cAAgB,EAAA,kBAAA;AAAA,QAChB,QAAQ,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,IAAI;AAAA,OACxC,CAAA;AAAA,MACD;AAAA,KACD,CAAA;AAED,IAAA,MAAM,QAAW,GAAA,MAAM,QAAS,CAAA,IAAA,CAAK,OAAO,CAAA;AAC5C,IAAA,MAAM,UAAa,GAAA,QAAA,EAAU,OAAQ,CAAA,GAAA,CAAI,YAAY,CAAA;AACrD,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA;AAAA;AAGzC,IAAM,MAAA,KAAA,GAAQ,UAAW,CAAA,QAAA,EAAU,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAM,KAAA,CAAA,6BAAA,EAA+B,EAAE,UAAA,EAAY,CAAA;AACnD,MAAM,MAAA,IAAI,MAAM,qBAAqB,CAAA;AAAA;AAEvC,IAAA,IAAA,CAAK,yBAA2B,EAAA,EAAE,UAAY,EAAA,UAAA,EAAY,CAAA;AAC1D,IAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,MAC1B,GAAG,WAAA;AAAA,MACH,QAAQ,CAAC,KAAA,EAAO,UAAU,CAAA,CAAE,KAAK,IAAI;AAAA,KACtC,CAAA;AACD,IAAO,OAAA,CAAC,SAAS,QAAQ,CAAA;AAAA,GAC3B;AACF;AAEO,SAAS,WAAW,OAAmB,EAAA;AAC5C,EAAI,IAAA,UAAA,GAAa,OAAS,EAAA,GAAA,CAAI,YAAY,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAa,UAAA,GAAA,OAAA,EAAS,IAAI,QAAQ,CAAA;AAAA;AAEpC,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,MAAA;AAAA;AAET,EAAM,MAAA,GAAG,KAAK,CAAA,GACZ,0CAA0C,IAAK,CAAA,UAAU,KAAK,EAAC;AACjE,EAAO,OAAA,KAAA;AACT;AACA,IAAqB,IAAA,GAArB,cAAkC,MAAO,CAAA;AAAA,EACvC,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,CACE,MACA,EAAA,OAAA,EACA,MACA,EAAA;AACA,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAK,IAAA,CAAA,MAAA,GAAS,MAAO,CAAA,MAAA,EAAQ,QAAQ,CAAA;AACrC,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAK,IAAA,CAAA,MAAA,GAAS,MAAO,CAAA,MAAA,EAAQ,QAAQ,CAAA;AACrC,IAAA,IAAA,CAAK,eAAe,MAAQ,EAAA,YAAA;AAAA;AAC9B,EACA,cAAc,IAAoB,EAAA;AAChC,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAM,MAAA,KAAA,GAAQE,eAAe,CAAA,IAAA,CAAK,OAAO,CAAA;AACzC,MAAA,IAAI,KAAO,EAAA;AACT,QAAI,IAAA;AACF,UAAA,IAAA,CAAK,QAAQ,GAAI,CAAA,aAAA,EAAe,IAAI,GAAI,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,iBAC9C,CAAG,EAAA;AACV,UAAI,IAAA,IAAA,CAAK,QAAQ,KAAO,EAAA;AACtB,YAAK,IAAA,CAAA,MAAA,CAAO,MAAM,uCAAuC,CAAA;AAAA;AAC3D;AACF;AAEF,MAAA,IAAI,IAAM,EAAA;AACR,QAAK,IAAA,CAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,EAAE,GAAG,KAAK,OAAS,EAAA,GAAG,IAAM,EAAA,OAAA,EAAS,CAAA;AAChE,QAAO,OAAA,IAAA;AAAA,OACF,MAAA;AACL,QAAO,IAAA,GAAA;AAAA,UACL,SAAS,IAAK,CAAA;AAAA,SAChB;AACA,QAAO,OAAA,IAAA;AAAA;AACT;AAEF,IAAO,OAAA,MAAA;AAAA;AACT,EAEA,IAAI,UAAa,GAAA;AACf,IAAO,OAAA,eAAA;AAAA;AACT,EAEA,UAAA,GAAa,OACX,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,MAAM,UAAU,MAAM,UAAA,CAAW,IAAI,GAAK,EAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAChE,IAAA,IAAI,MAAO,CAAA,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAG,EAAA;AACrC,MAAO,OAAA,MAAA;AAAA;AAET,IAAO,OAAA,OAAA;AAAA,GACT;AAAA,EAEA,IAAI,UAAa,GAAA;AACf,IAAO,OAAA,YAAA;AAAA;AACT,EAEA,MAAM,OAAA,CACJ,GACA,EAAA,IAAA,EACA,MAAM,KACN,EAAA;AACA,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,GAAA,CAAI,KAAK,IAAK,CAAA,UAAA,EAAY,OAAO,GAAG,CAAA;AAAA;AAC/D,EACA,IAAI,gBAAmB,GAAA;AACrB,IAAO,OAAA,iBAAA;AAAA;AACT,EAEA,aAAA,GAAgB,OACd,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,GAAA,CAAI,GAAK,EAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,GAChE;AAAA,EAEA,IAAI,UAAa,GAAA;AACf,IAAO,OAAA,eAAA;AAAA;AACT,EAEA,OAAA,GAAU,OACR,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AAErC,IAAM,MAAA,IAAA,GAAO,MAAM,IAAK,CAAA,OAAA;AAAA,MACtB,GAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,UAAa,GAAA,YAAA,CAAa,IAAK,CAAA,OAAA,EAAS,KAAK,OAAO,CAAA;AAC1D,IAAA,MAAM,cACJ,GAAO,IAAA,aAAA,IAAiB,MAAM,MAAO,CAAA,GAAA,CAAI,WAAW,CAAI,GAAA,GAAA;AAE1D,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAA,IAAA,CAAK,MAAQ,EAAA,KAAA,IACX,IAAK,CAAA,MAAA,CAAO,MAAM,0CAA0C,CAAA;AAC9D,MAAA,OAAO,IAAI,QAAS,CAAA,iBAAA,EAAmB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAGxD,IAAA,MAAM,OAAU,GAAA,IAAI,OAAQ,CAAA,KAAA,EAAO,OAAO,CAAA;AAC1C,IAAA,MAAM,EAAE,SAAU,EAAA,GAAK,MAAM,IAAK,CAAA,IAAA,MAAW,EAAC;AAC9C,IAAM,MAAA,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,IAAA,IAAI,UAAY,EAAA;AACd,MAAI,IAAA,KAAA,CAAM,0BAA0B,CAAG,EAAA;AACrC,QAAM,KAAA,CAAA,0BAA0B,CAAI,GAAA,kBAAA,CAAmB,UAAU,CAAA;AAAA;AAEnE,MAAI,IAAA,KAAA,CAAM,iBAAiB,CAAG,EAAA;AAC5B,QAAM,KAAA,CAAA,iBAAiB,CAAI,GAAA,kBAAA,CAAmB,UAAU,CAAA;AAAA;AAC1D;AAGF,IAAQ,OAAA,CAAA,GAAA;AAAA,MACN,QAAA;AAAA,MACA,OAAO,IAAK,CAAA,KAAK,CACd,CAAA,GAAA,CAAI,CAACR,KAAQ,KAAA,CAAA,EAAGA,KAAG,CAAA,CAAA,EAAI,MAAMA,KAAG,CAAC,CAAE,CAAA,CAAA,CACnC,KAAK,IAAI;AAAA,KACd;AAEA,IAAA,MAAM,MAAM,MAAM,UAAA,CAAW,IAAK,CAAA,GAAA,EAAK,KAAK,UAAY,EAAA;AAAA,MACtD,MAAQ,EAAA,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAU,CAAA;AAAA,QACnB,SAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA,EAAM,OAAO,IAAI;AAAA,OAClB,CAAA;AAAA,MACD,GAAG,KAAA;AAAA,MACH;AAAA,KACD,CAAA;AAED,IAAK,IAAA,CAAA,YAAA,IAAgB,KAAK,YAAa,EAAA;AAEvC,IAAO,OAAA,GAAA;AAAA,GACT;AACF,CAAA;AACA,SAASQ,gBAAe,OAAwC,EAAA;AAC9D,EAAA,IAAI,OAAS,EAAA;AACX,IAAM,MAAA,OAAA,GAAU,WAAW,OAAO,CAAA;AAClC,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,OACE,OAAQ,CAAA,4BAA4B,CAAK,IAAA,OAAA,CAAQ,mBAAmB,CAAA;AAAA;AAExE;AAEJ;AAEA,SAAS,YAAA,CACP,SACA,WACe,EAAA;AACf,EAAA,IAAI,OAAS,EAAA;AACX,IAAM,MAAA,OAAA,GAAU,WAAW,OAAO,CAAA;AAClC,IAAA,IAAI,WAAc,GAAA,EAAA;AAClB,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,WAAA,GACE,OAAQ,CAAA,0BAA0B,CAAK,IAAA,OAAA,CAAQ,iBAAiB,CAAA;AAAA;AAEpE,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,WAAA;AAAA;AACT;AAEF,EAAA,IAAI,WAAa,EAAA;AACf,IAAM,MAAA,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,OAAO,OAAQ,CAAA,0BAA0B,CAAK,IAAA,OAAA,CAAQ,iBAAiB,CAAA;AAAA;AACzE;AAEJ;AAEA,IAAM,UAAA,GAAa,CAAC,OAAoD,KAAA;AACtE,EAAI,IAAA,CAAC,OAAS,EAAA,OAAO,EAAC;AAGtB,EAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,GAAI,CAAA,QAAQ,CAAK,IAAA,EAAA;AAC9C,EAAA,MAAM,gBAAmB,GAAA,OAAA,CAAQ,GAAI,CAAA,YAAY,CAAK,IAAA,EAAA;AAGtD,EAAA,MAAM,UAAa,GAAA;AAAA,IACjB,GAAG,YAAa,CAAA,KAAA,CAAM,IAAI,CAAA;AAAA;AAAA,IAC1B,GAAG,gBAAiB,CAAA,KAAA,CAAM,kBAAkB;AAAA;AAAA,GAC9C,CAAE,OAAO,OAAO,CAAA;AAGhB,EAAA,OAAO,MAAO,CAAA,WAAA;AAAA,IACZ,UAAA,CAAW,GAAI,CAAA,CAAC,MAAW,KAAA;AACzB,MAAA,MAAM,CAACR,KAAK,EAAA,GAAG,GAAG,CAAI,GAAA,MAAA,CAAO,MAAM,GAAG,CAAA;AACtC,MAAO,OAAA;AAAA,QACL,kBAAA,CAAmBA,KAAI,CAAA,IAAA,EAAM,CAAA;AAAA,QAC7B,mBAAmB,GAAI,CAAA,IAAA,CAAK,GAAG,CAAA,CAAE,MAAM;AAAA,OACzC;AAAA,KACD;AAAA,GACH;AACF,CAAA;;;AC9UA,IAAqB,OAAA,GAArB,cAAqC,MAAO,CAAA;AAAA,EAC1C,OAAA;AAAA,EACA,WAAA,CAAY,QAAgB,OAAmB,EAAA;AAC7C,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AAAA;AACjB,EACA,cAAc,IAAoB,EAAA;AAChC,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAI,IAAM,EAAA;AACR,QAAK,IAAA,CAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,EAAE,GAAG,KAAK,OAAS,EAAA,GAAG,IAAM,EAAA,OAAA,EAAS,CAAA;AAChE,QAAO,OAAA,IAAA;AAAA,OACF,MAAA;AACL,QAAO,IAAA,GAAA;AAAA,UACL,SAAS,IAAK,CAAA;AAAA,SAChB;AACA,QAAO,OAAA,IAAA;AAAA;AACT;AAEF,IAAO,OAAA,MAAA;AAAA;AACT,EACA,IAAI,UAAa,GAAA;AACf,IAAO,OAAA,UAAA;AAAA;AACT,EACA,IAAI,SAAY,GAAA;AACd,IAAO,OAAA,CAAA,SAAA,EAAY,IAAK,CAAA,QAAA,IAAY,YAAY,CAAA,CAAA;AAAA;AAClD,EAEA,YAAA,GAAe,OACb,GAAA,EACA,IACe,KAAA;AACf,IAAI,IAAA,IAAA;AACJ,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAO,IAAA,GAAA,IAAI,QAAQ,CAAG,EAAA,IAAA,CAAK,IAAI,QAAQ,CAAA,EAAG,IAAK,CAAA,UAAU,CAAI,CAAA,EAAA;AAAA,QAC3D,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,QAClC,MAAQ,EAAA,MAAA;AAAA,QACR,OAAS,EAAA;AAAA,UACP,cAAgB,EAAA;AAAA;AAClB,OACD,CAAA;AAAA,KACI,MAAA;AACL,MAAO,IAAA,GAAA,GAAA;AAAA;AAET,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAO,UAAW,CAAA,IAAA,CAAK,IAAM,EAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,GACrD;AAAA,EAEA,SAAA,GAAY,OACV,GAAA,EACA,IACe,KAAA;AACf,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,QAAW,GAAA,GAAA;AAAA;AAElB,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAO,UAAW,CAAA,GAAA,CAAY,GAAK,EAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,GAC1D;AAAA,EAEA,IAAI,aAAgB,GAAA;AAClB,IAAO,OAAA,CAAA,OAAA,EAAU,IAAK,CAAA,MAAA,IAAU,UAAU,CAAA,QAAA,CAAA;AAAA;AAC5C,EAEA,WAAA,GAAc,OACZ,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAO,UAAW,CAAA,GAAA,CAAc,GAAK,EAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,GAChE;AAAA,EAEA,YAAA,GAAe,OACb,GAAA,EACA,IACe,KAAA;AACf,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,QAAW,GAAA,GAAA;AAAA;AAElB,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAO,UAAW,CAAA,MAAA,CAAO,GAAK,EAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,GACrD;AAAA,EACA,YAAA,GAAe,OACb,GAAA,EACA,IACe,KAAA;AACf,IAAI,IAAA,IAAA;AACJ,IAAI,IAAA,GAAA,IAAO,UAAU,GAAK,EAAA;AACxB,MAAO,IAAA,GAAA,IAAI,QAAQ,CAAG,EAAA,IAAA,CAAK,IAAI,QAAQ,CAAA,EAAG,IAAK,CAAA,SAAS,CAAI,CAAA,EAAA;AAAA,QAC1D,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,GAAG,CAAA;AAAA,QACxB,MAAQ,EAAA;AAAA,OACT,CAAA;AAAA,KACI,MAAA;AACL,MAAO,IAAA,GAAA,GAAA;AAAA;AAET,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAO,UAAW,CAAA,GAAA,CAAY,IAAM,EAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,GAC3D;AACF,CAAA;;;ACrGA,IAAqB,KAAA,GAArB,cAAmC,MAAO,CAAA;AAAA,EACxC,OAAA;AAAA,EACA,WAAA,CAAY,QAAgB,OAAmB,EAAA;AAC7C,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AAAA;AACjB,EAEA,SAAS,IAA8B,EAAA;AACrC,IAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,EAAA;AACnC,IAAA,IAAI,KAAK,aAAe,EAAA;AACtB,MAAO,MAAA,CAAA,GAAA,CAAI,eAAiB,EAAA,IAAA,CAAK,aAAa,CAAA;AAAA;AAEhD,IAAA,IAAI,KAAK,QAAU,EAAA;AACjB,MAAO,MAAA,CAAA,GAAA,CAAI,UAAY,EAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AAEtC,IAAA,OAAO,CAAU,OAAA,EAAA,MAAA,CAAO,IAAO,GAAA,CAAA,GAAI,SAAS,EAAE,CAAA,CAAA;AAAA;AAChD,EAEA,IAAI,cAAiB,GAAA;AACnB,IAAO,OAAA,CAAA,SAAA,EAAY,IAAK,CAAA,QAAA,IAAY,YAAY,CAAA,MAAA,CAAA;AAAA;AAClD,EACA,IAAI,YAAe,GAAA;AACjB,IAAA,OAAO,YAAY,IAAK,CAAA,QAAA,IAAY,YAAY,CAC9C,OAAA,EAAA,IAAA,CAAK,UAAU,UACjB,CAAA,KAAA,CAAA;AAAA;AACF,EAEA,IAAI,aAAgB,GAAA;AAClB,IAAA,OAAO,YAAY,IAAK,CAAA,QAAA,IAAY,YAAY,CAC9C,OAAA,EAAA,IAAA,CAAK,UAAU,UACjB,CAAA,CAAA;AAAA;AACF,EACA,cAAc,IAAoB,EAAA;AAChC,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAI,IAAM,EAAA;AACR,QAAK,IAAA,CAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,EAAE,GAAG,KAAK,OAAS,EAAA,GAAG,IAAM,EAAA,OAAA,EAAS,CAAA;AAChE,QAAO,OAAA,IAAA;AAAA,OACF,MAAA;AACL,QAAO,IAAA,GAAA;AAAA,UACL,SAAS,IAAK,CAAA;AAAA,SAChB;AACA,QAAO,OAAA,IAAA;AAAA;AACT;AAEF,IAAO,OAAA,MAAA;AAAA;AACT,EAEA,UAAA,GAAa,OACX,IAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AAErC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAQ,OAAA,MAAM,WAAW,IAAK,CAAA,IAAA,EAAM,KAAK,QAAS,CAAA,IAAI,GAAG,KAAK,CAAA;AAAA,GAChE;AAAA,EAEA,gBAAA,GAAmB,OACjB,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AAErC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,IAAA,CAAK,GAAK,EAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,GAC/D;AAAA,EAEA,UAAA,GAAa,OACX,GAAA,EAGA,IACe,KAAA;AACf,IAAI,IAAA,IAAA;AACJ,IAAI,IAAA,GAAA,IAAO,QAAQ,GAAK,EAAA;AACtB,MAAO,IAAA,GAAA,IAAI,QAAQ,CAAG,EAAA,IAAA,CAAK,IAAI,QAAQ,CAAA,EAAG,IAAK,CAAA,aAAa,CAAI,CAAA,EAAA;AAAA,QAC9D,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,GAAG,CAAA;AAAA,QACxB,MAAQ,EAAA;AAAA,OACT,CAAA;AACD,MAAK,IAAA,CAAA,MAAA,GAAS,MAAO,CAAA,GAAA,CAAI,EAAE,CAAA;AAAA,KACtB,MAAA;AACL,MAAO,IAAA,GAAA,GAAA;AAAA;AAET,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,GAAA,CAAI,IAAM,EAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,GAC9D;AAAA,EAEA,SAAA,GAAY,OACV,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,GAAA,CAAI,GAAK,EAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,GAC9D;AAAA,EAEA,QAAA,GAAW,OACT,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,MAAS,GAAA,GAAA;AAAA,KACT,MAAA;AACL,MAAA,IAAI,QAAQ,GAAK,EAAA;AACf,QAAA,IAAA,CAAK,SAAS,GAAI,CAAA,EAAA;AAAA;AAEpB,MAAA,IAAI,cAAc,GAAK,EAAA;AACrB,QAAA,IAAA,CAAK,WAAW,GAAI,CAAA,QAAA;AAAA;AACtB;AAGF,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,GAAA,CAAI,GAAK,EAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,GAC5D;AAAA,EAEA,UAAA,GAAa,OACX,GAAA,EACA,IACe,KAAA;AACf,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,MAAS,GAAA,GAAA;AAAA,KACT,MAAA;AACL,MAAA,IAAI,QAAQ,GAAK,EAAA;AACf,QAAA,IAAA,CAAK,SAAS,GAAI,CAAA,EAAA;AAAA;AAEpB,MAAA,IAAI,cAAc,GAAK,EAAA;AACrB,QAAA,IAAA,CAAK,WAAW,GAAI,CAAA,QAAA;AAAA;AACtB;AAEF,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,MAAA,CAAO,GAAK,EAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,GAC/D;AAAA,EAEA,IAAI,KAAQ,GAAA;AACV,IAAO,OAAA,KAAA;AAAA;AACT,EAEA,EAAA,GAAK,OACH,GAAA,EACA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,GAAA,CAAI,GAAK,EAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,GACrD;AAAA,EACA,QAAA,GAAW,OACT,GAAA,EAOA,IACe,KAAA;AACf,IAAM,MAAA,UAAA,GAAa,IAAI,SAAA,CAAU,IAAI,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,OAAQ,MAAM,UAAW,CAAA,GAAA,CAAI,GAAK,EAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,GACrD;AACF,CAAA;;;AC5JO,IAAM,MAAN,MAAU;AAAA,EACf,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EAMA,KAAA;AAAA,EAMA,YAAY,MAAgB,EAAA;AAC1B,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,IAAA,CAAK,IAAO,GAAA,IAAI,IAAK,CAAA,MAAA,EAAQ,MAAW,EAAA;AAAA,MACtC,cAAc,IAAK,CAAA;AAAA,KACpB,CAAA;AACD,IAAK,IAAA,CAAA,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAM,CAAA;AAC7B,IAAK,IAAA,CAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,SAAA,CAAU,MAAQ,EAAA,GAAA,CAAI,WAAW,CAAA;AAAA,MACpC,GAAG,QAAQ,GAAI,CAAA;AAAA,KACjB;AAEA,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAS,IAAK,CAAA,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,GAAK,EAAA;AAAA,QACH,KAAK,MAAO,CAAA,EAAA;AAAA,QACZ,KAAK,MAAO,CAAA,YAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA,SAAA;AAAA,QACZ,KAAK,MAAO,CAAA,IAAA;AAAA,QACZ,KAAK,MAAO,CAAA,cAAA;AAAA,QACZ,KAAK,MAAO,CAAA,QAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,cAAA;AAAA,QACZ,KAAK,MAAO,CAAA;AAAA,OACd;AAAA,MACA,IAAM,EAAA;AAAA,QACJ,KAAK,MAAO,CAAA,YAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA,KAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,CAAA,EAAG,IAAK,CAAA,MAAA,CAAO,MAAM,CAAA,WAAA,CAAA;AAAA,QACrB,KAAK,MAAO,CAAA,cAAA;AAAA,QACZ,KAAK,MAAO,CAAA,SAAA;AAAA,QACZ,KAAK,MAAO,CAAA,IAAA;AAAA,QACZ,CAAA,EAAG,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,WAAA,CAAA;AAAA,QACvB,KAAK,MAAO,CAAA;AAAA,OACd;AAAA,MACA,GAAK,EAAA;AAAA,QACH,KAAK,MAAO,CAAA,YAAA;AAAA,QACZ,KAAK,MAAO,CAAA,KAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA;AAAA,OACd;AAAA,MACA,QAAQ,CAAC,IAAA,CAAK,OAAO,WAAa,EAAA,IAAA,CAAK,OAAO,MAAM;AAAA,KACtD;AAAA;AACF,EAEA,QAAQ,MAAM;AACZ,IAAA,IAAA,CAAK,QAAQ,IAAI,KAAA,CAAM,IAAK,CAAA,MAAA,EAAQ,KAAK,QAAQ,CAAA;AACjD,IAAA,IAAA,CAAK,UAAU,IAAI,OAAA,CAAQ,IAAK,CAAA,MAAA,EAAQ,KAAK,QAAQ,CAAA;AACrD,IAAA,IAAA,CAAK,OAAO,IAAI,IAAA,CAAK,IAAK,CAAA,MAAA,EAAQ,KAAK,QAAU,EAAA;AAAA,MAC/C,cAAc,IAAK,CAAA;AAAA,KACpB,CAAA;AAAA,GACH;AAAA,EAEA,YAAA,GAAe,CAAC,MAAmB,KAAA;AACjC,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAS,IAAK,CAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,GAC9C;AAAA,EAEA,YAAA,GAAe,CAAC,OAAsB,KAAA;AACpC,IAAA,IAAA,CAAK,QAAW,GAAA,IAAI,OAAQ,CAAA,OAAA,IAAW,EAAE,CAAA;AACzC,IAAgB,UAAA,CAAA,IAAI,SAAS,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAM,EAAA;AAAA,GACb;AAAA,EAEA,IAAI,QAAQ,OAA2C,EAAA;AACrD,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,IAAI,mBAAmB,OAAS,EAAA;AAC9B,MAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAOA,KAAQ,KAAA;AAC9B,QAAA,OAAA,CAAQ,KAAK,CAACA,KAAAA,CAAI,WAAY,EAAA,EAAG,KAAK,CAAC,CAAA;AAAA,OACxC,CAAA;AAAA,KACI,MAAA;AACL,MAAA,KAAA,MAAW,CAACA,KAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,OAAO,CAAG,EAAA;AAClD,QAAA,OAAA,CAAQ,KAAK,CAACA,KAAAA,CAAI,WAAY,EAAA,EAAG,KAAK,CAAC,CAAA;AAAA;AACzC;AAGF,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,IAAA,CAAK,QAAU,EAAA,OAAA,CAAQ,CAAC,KAAA,EAAOA,KAAQ,KAAA;AACrC,MAAOA,MAAAA,CAAAA,KAAAA,CAAI,WAAY,EAAC,CAAI,GAAA,KAAA;AAAA,KAC7B,CAAA;AAED,IAAA,KAAA,MAAW,CAACA,KAAAA,EAAK,KAAK,CAAA,IAAK,OAAS,EAAA;AAClC,MAAA,MAAA,CAAOA,KAAG,CAAI,GAAA,KAAA;AAAA;AAGhB,IAAK,IAAA,CAAA,QAAA,GAAW,IAAI,OAAQ,EAAA;AAC5B,IAAA,KAAA,MAAW,CAACA,KAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,MAAM,CAAG,EAAA;AACjD,MAAK,IAAA,CAAA,QAAA,CAAS,GAAIA,CAAAA,KAAAA,EAAK,KAAK,CAAA;AAAA;AAG9B,IAAA,IAAA,CAAK,KAAM,EAAA;AAAA;AACb,EAEA,IAAI,OAA+B,GAAA;AACjC,IAAA,OAAO,IAAK,CAAA,QAAA;AAAA;AACd,EAEA,UAAU,GAAyB,EAAA;AACjC,IAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,KACvB,MAAA,IAAW,eAAe,OAAS,EAAA;AACjC,MAAO,OAAA,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA;AAE/B,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,KAAA,GAAQ,OACN,OAAA,EACA,MACG,KAAA;AACH,IAAA,MAAM,CAAC,OAAA,EAAS,QAAQ,CAAA,GAAI,MAAM,WAAA;AAAA,MAChC,IAAK,CAAA,MAAA;AAAA,MACL,IAAK,CAAA;AAAA,MACL,OAAO,CAAA;AACT,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAA,IAAA,CAAK,WAAW,OAAO,CAAA;AACvB,IAAA,IAAI,QAAQ,cAAgB,EAAA;AAC1B,MAAO,OAAA,QAAA;AAAA;AAET,IAAO,OAAA,MAAA;AAAA,GACT;AAAA,EAEA,OAAA,GAAU,OAAO,GAA+C,KAAA;AAC9D,IAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,MAAO,OAAA,IAAA,CAAK,IAAK,CAAA,UAAA,CAAW,GAAG,CAAA;AAAA,KACjC,MAAA,IAAW,eAAe,OAAS,EAAA;AACjC,MAAO,OAAA,IAAA,CAAK,GAAK,EAAA,IAAA,CAAK,MAAM,CAAA;AAAA;AAE9B,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,GAC3C;AAAA,EACA,UAAA,GAAa,CAAC,GAA2B,KAAA;AACvC,IAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,MAAA,UAAA,CAAgB,GAAG,CAAA;AAAA,KACrB,MAAA,IAAW,eAAe,OAAS,EAAA;AACjC,MAAA,UAAA,CAAgB,IAAI,OAAO,CAAA;AAAA;AAG7B,IAAA,MAAM,EAAE,IAAK,EAAA,GAAI,MAAO,CAAA,IAAA,CAAK,QAAQ,OAAO,CAAA;AAE5C,IAAA,IAAI,IAAM,EAAA;AACR,MAAA,IAAA,CAAK,gDAAgD,CAAA;AAAA;AACvD,GACF;AACF,CAAA;;;AC7KO,IAAM,SAAN,MAAa;AAAA,EAClB,MAAA;AAAA,EACA,GAAA;AAAA,EACQ,OAAA;AAAA,EAER,YAAY,MAAuB,EAAA;AACjC,IAAA,IAAA,CAAK,MAAS,GAAA,IAAI,MAAO,CAAA,MAAA,EAAwB,kBAAkB,CAAA;AACnE,IAAA,IAAA,CAAK,GAAM,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,MAAM,CAAA;AAC9B,IAAA,IAAA,CAAK,OAAU,GAAA,IAAI,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA;AAExC,IAAA,aAAA,CAAc,CAAC,QAAa,KAAA;AAC1B,MAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAAA,KACjB,CAAA;AAED,IAAA,WAAA,CAAY,CAAC,MAAW,KAAA;AACtB,MAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAAA,KACf,CAAA;AAED,IAAA,UAAA,CAAW,CAAC,KAAU,KAAA;AACpB,MAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AAAA,KACd,CAAA;AAAA;AACH,EAEA,UAAU,GAAa,EAAA;AACrB,IAAK,IAAA,CAAA,MAAA,GAAS,IAAI,MAAA,CAAO,GAAG,CAAA;AAC5B,IAAK,IAAA,CAAA,GAAA,CAAI,YAAa,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA;AACnC,EAEA,MAAM,KAAK,GAAc,EAAA;AACvB,IAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,MAAA,CAAO,SAAU,CAAA;AAAA,MAChD,GAAG,IAAK,CAAA,MAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,IAAA,CAAK,UAAU,aAAa,CAAA;AAE5B,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,IAAI,WAAW,GAAoB,EAAA;AACjC,IAAA,IAAI,GAAK,EAAA;AACP,MAAA,IAAA,CAAK,OAAO,UAAa,GAAA,GAAA;AACzB,MAAK,IAAA,CAAA,GAAA,CAAI,MAAM,UAAa,GAAA,GAAA;AAC5B,MAAK,IAAA,CAAA,GAAA,CAAI,QAAQ,UAAa,GAAA,GAAA;AAAA;AAChC;AACF,EAEA,IAAI,MAAoC,GAAA;AACtC,IAAA,OAAO,KAAK,MAAO,CAAA,MAAA;AAAA;AACrB,EAEA,IAAI,OAAO,MAAmC,EAAA;AAC5C,IAAK,IAAA,CAAA,UAAA,GAAa,KAAK,MAAO,CAAA,UAAA;AAE9B,IAAA,IAAA,CAAK,OAAO,MAAS,GAAA,MAAA;AAErB,IAAA,IAAI,KAAK,GAAK,EAAA;AACZ,MAAA,IAAA,CAAK,GAAI,CAAA,KAAA,CAAM,MAAS,GAAA,IAAA,CAAK,MAAO,CAAA,MAAA;AACpC,MAAA,IAAA,CAAK,GAAI,CAAA,OAAA,CAAQ,MAAS,GAAA,IAAA,CAAK,MAAO,CAAA,MAAA;AAAA;AACxC;AACF,EAEA,IAAI,QAAsC,GAAA;AACxC,IAAA,OAAO,KAAK,MAAO,CAAA,QAAA;AAAA;AACrB,EAEA,IAAI,SAAS,QAAqC,EAAA;AAChD,IAAK,IAAA,CAAA,UAAA,GAAa,KAAK,MAAO,CAAA,UAAA;AAC9B,IAAA,IAAA,CAAK,OAAO,QAAW,GAAA,QAAA;AAEvB,IAAA,IAAI,KAAK,GAAK,EAAA;AACZ,MAAK,IAAA,CAAA,GAAA,CAAI,MAAM,QAAW,GAAA,QAAA;AAC1B,MAAK,IAAA,CAAA,GAAA,CAAI,QAAQ,QAAW,GAAA,QAAA;AAAA;AAC9B;AACF,EAEA,IAAI,KAAmC,GAAA;AACrC,IAAO,OAAA,IAAA,CAAK,QAAQ,GAAK,EAAA,KAAA;AAAA;AAC3B,EAEA,IAAI,MAAM,KAAkC,EAAA;AAC1C,IAAA,IAAI,KAAO,EAAA;AACT,MAAK,IAAA,CAAA,MAAA,CAAO,IAAI,KAAQ,GAAA,KAAA;AACxB,MAAA,IAAI,KAAK,GAAK,EAAA;AACZ,QAAK,IAAA,CAAA,GAAA,CAAI,KAAM,CAAA,GAAA,CAAI,KAAQ,GAAA,KAAA;AAC3B,QAAK,IAAA,CAAA,GAAA,CAAI,OAAQ,CAAA,GAAA,CAAI,KAAQ,GAAA,KAAA;AAAA;AAC/B;AACF;AACF,EACA,IAAI,EAAc,GAAA;AAChB,IAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,aAAc,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA;AAC/C,EAEA,gBAAmB,GAAA;AACjB,IAAK,IAAA,CAAA,OAAA,CAAQ,KAAM,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA;AAChC;AAAA;AAAA;AAAA,EAMA,YAAY,MAA8B,EAAA;AACxC,IAAA,MAAM,UAAU,EAAE,GAAG,IAAK,CAAA,MAAA,EAAQ,GAAG,MAAO,EAAA;AAG5C,IAAM,MAAA,aAAA,GAAgB,IAAI,MAAA,CAAO,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,UAAU,aAAa,CAAA;AAE5B,IAAA,IAAA,CAAK,WAAW,aAAc,CAAA,QAAA;AAC9B,IAAA,IAAA,CAAK,SAAS,aAAc,CAAA,MAAA;AAE5B,IAAI,IAAA,aAAA,CAAc,IAAI,KAAO,EAAA;AAC3B,MAAK,IAAA,CAAA,KAAA,GAAQ,cAAc,GAAI,CAAA,KAAA;AAAA;AAEjC,IAAA,IAAA,CAAK,aAAa,aAAc,CAAA,UAAA;AAEhC,IAAO,OAAA,IAAA;AAAA;AAEX;AAEA,IAAI,MAAA;AACJ,eAAsB,OAAO,MAAwC,EAAA;AACnE,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAS,MAAA,GAAA,IAAI,OAAO,MAAM,CAAA;AAAA;AAE5B,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAO,MAAM,MAAO,CAAA,IAAA,CAAK,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA;AAE7C,EAAO,OAAA,MAAM,OAAO,IAAK,EAAA;AAC3B","file":"index.mjs","sourcesContent":["export interface CreateBasicUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n // create a tenant for the new user to an existing tenant\n newTenantName?: string;\n // add the new user to an existing tenant\n tenantId?: string;\n}\nexport interface CreateTenantUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: 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 email: string;\n name?: string | null;\n familyName?: string | null;\n givenName?: string | null;\n picture?: string | null;\n created: string;\n updated?: string;\n emailVerified?: string | null;\n tenants: { id: string }[];\n}\n","export default function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\n","/* eslint-disable no-console */\nimport { Routes } from '../api/types';\nimport urlMatches from '../api/utils/routes/urlMatches';\nimport { ServerConfig } from '../types';\n\nimport { Config } from './Config';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[38;2;255;255;0m';\nconst purple = '\\x1b[38;2;200;160;255m';\nconst orange = '\\x1b[38;2;255;165;0m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | ServerConfig, ...params: unknown[]) => ({\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.debug(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${orange}[niledb]${reset}${yellow}[WARN]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? JSON.stringify(meta) : ''\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${orange}[niledb]${reset}${red}[ERROR]${reset}${params.join(\n ''\n )}${red} ${message}`,\n meta ? meta : '',\n `${reset}`\n );\n },\n});\n\nexport default function Logger(\n config?: Config | ServerConfig,\n ...params: unknown[]\n) {\n const base = baseLogger(config, params);\n const info = config?.logger?.info ?? base.info;\n const debug = config?.logger?.debug ?? base.debug;\n const warn = config?.logger?.warn ?? base.warn;\n const error = config?.logger?.error ?? base.error;\n return { info, warn, error, debug };\n}\n\nexport function matchesLog(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.LOG);\n}\n","// these two are a pass though\nexport const X_NILE_TENANT = 'nile.tenant_id';\nexport const X_NILE_USER_ID = 'nile.user_id';\nexport const X_NILE_ORIGIN = 'nile.origin';\n// this one is not\nexport const X_NILE_SECURECOOKIES = 'nile.secure_cookies';\n","/**\n * Acts as a bridge between `api.handlers` and the subsequent functions\n */\nimport {\n X_NILE_ORIGIN,\n X_NILE_TENANT,\n X_NILE_USER_ID,\n} from '../utils/constants';\n\ntype Optional = string | undefined | null;\nexport type AsyncContext = {\n origin?: Optional;\n cookie?: Optional;\n tenantId?: Optional;\n userId?: Optional;\n};\n\nlet globalContext: AsyncContext | null = null;\n\nexport function setContext(headers: Headers) {\n const origin = headers.get(X_NILE_ORIGIN);\n const host = headers.get('host');\n const cookie = headers.get('cookie');\n const tenantId = headers.get(X_NILE_TENANT);\n const userId = headers.get(X_NILE_USER_ID);\n const context: AsyncContext = {};\n if (origin) {\n context.origin = origin;\n } else if (host) {\n context.origin = host;\n }\n\n if (cookie) {\n context.cookie = cookie;\n }\n\n if (tenantId) {\n context.tenantId = tenantId;\n }\n if (userId) {\n context.userId = userId;\n }\n globalContext = context;\n}\n\nexport function getOrigin(): Optional {\n return globalContext?.origin;\n}\n\nexport function getCookie(): Optional {\n return globalContext?.cookie;\n}\n\nexport function getTenantId(): Optional {\n return globalContext?.tenantId;\n}\nexport function getUserId(): Optional {\n return globalContext?.userId;\n}\n\n// a special case where we have a `set-cookie` header\nexport function setCookie(headers?: Headers) {\n const getSet = headers?.getSetCookie?.();\n if (getSet?.length) {\n const updatedCookie: string[] = [];\n\n for (const cook of getSet) {\n const [c] = cook.split('; ');\n const [, val] = c.split('=');\n if (val) {\n updatedCookie.push(c);\n }\n }\n\n const cookie = mergeCookies(updatedCookie);\n globalContext = { ...globalContext, cookie };\n }\n}\n\nfunction mergeCookies(overrideArray: string[]): string {\n const cookieString = getCookie();\n const cookieMap: Record<string, string> = {};\n\n if (!cookieString) {\n return overrideArray.join('; ');\n }\n cookieString.split(';').forEach((cookie) => {\n const [rawKey, ...rawVal] = cookie.trim().split('=');\n const key = rawKey.trim();\n const value = rawVal.join('=').trim(); // in case value has `=`\n if (key) cookieMap[key] = value;\n });\n\n overrideArray.forEach((cookie) => {\n const [rawKey, ...rawVal] = cookie.trim().split('=');\n const key = rawKey.trim();\n const value = rawVal.join('=').trim();\n if (key) cookieMap[key] = value;\n });\n\n return Object.entries(cookieMap)\n .map(([k, v]) => `${k}=${v}`)\n .join('; ');\n}\n","import { setContext, setCookie } from '../../context/asyncStorage';\nimport {\n X_NILE_ORIGIN,\n X_NILE_SECURECOOKIES,\n X_NILE_TENANT,\n} from '../../utils/constants';\nimport { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { debug, info, error } = Logger(config, '[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers({});\n if (request.headers.get('cookie')) {\n updatedHeaders.set('cookie', String(request.headers.get('cookie')));\n }\n if (request.headers.get(X_NILE_TENANT)) {\n updatedHeaders.set(\n X_NILE_TENANT,\n String(request.headers.get(X_NILE_TENANT))\n );\n }\n if (config.api.secureCookies != null) {\n updatedHeaders.set(X_NILE_SECURECOOKIES, String(config.api.secureCookies));\n }\n\n updatedHeaders.set('host', requestUrl.host);\n if (config.api.callbackUrl) {\n const cbUrl = new URL(config.api.callbackUrl);\n debug(\n `Obtained origin from config.api.callbackUrl ${config.api.callbackUrl}`\n );\n updatedHeaders.set(X_NILE_ORIGIN, cbUrl.origin);\n } else if (config.api.origin) {\n debug(`Obtained origin from config.api.origin ${config.api.origin}`);\n updatedHeaders.set(X_NILE_ORIGIN, config.api.origin);\n } else {\n updatedHeaders.set(X_NILE_ORIGIN, requestUrl.origin);\n debug(`Obtained origin from request ${requestUrl.origin}`);\n }\n const params = { ...init, headers: updatedHeaders };\n if (\n params.method?.toLowerCase() === 'post' ||\n params.method?.toLowerCase() === 'put'\n ) {\n try {\n updatedHeaders.set('content-type', 'application/json');\n const initBody = await new Response(_init.request.clone().body).json();\n const requestBody = await new Response(request.clone().body).json();\n params.body = JSON.stringify(initBody ?? requestBody);\n } catch (e) {\n updatedHeaders.set('content-type', 'application/x-www-form-urlencoded');\n const initBody = await new Response(_init.request.clone().body).text();\n const requestBody = await new Response(request.clone().body).text();\n params.body = initBody ?? requestBody;\n }\n }\n\n const fullUrl = `${url}${requestUrl.search}`;\n try {\n setContext(updatedHeaders);\n // set the headers so they can be used on subsequent server side requests\n const res: Response | void = await fetch(fullUrl, { ...params }).catch(\n (e) => {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n );\n const loggingRes = typeof res?.clone === 'function' ? res?.clone() : null;\n info(`[${params.method ?? 'GET'}] ${fullUrl}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n // a special handler for a `set-cookie` header\n setCookie(res?.headers);\n return res;\n } catch (e) {\n if (e instanceof Error) {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n }\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport request from './request';\n\ntype ProviderName =\n | 'discord'\n | 'github'\n | 'google'\n | 'hubspot'\n | 'linkedin'\n | 'slack'\n | 'twitter'\n | 'email'\n | 'credentials'\n | 'azure';\n\nexport type Providers = {\n [providerName in ProviderName]: Provider;\n};\nexport type Provider = {\n id: string;\n name: string;\n type: string;\n signinUrl: string;\n callbackUr: string;\n};\n\nexport type JWT = {\n email: string;\n sub: string;\n id: string;\n iat: number;\n exp: number;\n jti: string;\n};\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: string;\n user?: {\n id: string;\n name: string;\n image: string;\n email: string;\n emailVerified: void | Date;\n };\n};\nexport default async function auth(\n req: Request,\n config: Config\n): Promise<null | undefined | ActiveSession> {\n const { info, error } = Logger(config, '[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.api.basePath}/auth/session`;\n info(`using session${sessionUrl}`);\n // handle the pass through with posts\n req.headers.delete('content-length');\n\n const res = await request(sessionUrl, { request: req }, config);\n if (!res) {\n info('no session found');\n return undefined;\n }\n info('session active');\n try {\n const session = await new Response(res.body).json();\n if (Object.keys(session).length === 0) {\n return undefined;\n }\n return session;\n } catch (e) {\n error(e);\n return undefined;\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 getCallbackUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(process.env.NILEDB_CALLBACK_URL)) {\n return process.env.NILEDB_CALLBACK_URL;\n }\n return config?.api?.callbackUrl;\n};\n\nexport const getSecureCookies = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(process.env.NILEDB_SECURECOOKIES)) {\n return Boolean(process.env.NILEDB_SECURECOOKIES);\n }\n return config?.api?.secureCookies;\n};\n\nexport const getDatabaseId = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[databaseId]');\n if (stringCheck(config?.databaseId)) {\n logger && info(`${logger}[config] ${config?.databaseId}`);\n return String(config?.databaseId);\n }\n const dbFromEnv = stringCheck(process.env.NILEDB_ID);\n\n if (dbFromEnv) {\n logger && info(`${logger}[NILEDB_ID] ${dbFromEnv}`);\n return dbFromEnv;\n }\n\n const dbId = stringCheck(process.env.NILEDB_API_URL);\n if (dbId) {\n try {\n const pgUrl = new URL(dbId);\n return pgUrl.pathname.split('/')[3];\n } catch (e) {\n // ok to fail\n }\n }\n return null;\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 const user = stringCheck(process.env.NILEDB_USER);\n if (user) {\n logger && info(`${logger}[NILEDB_USER] ${user}`);\n return user;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.username) {\n return url.username;\n }\n } catch (e) {\n //ok to fail\n }\n }\n return undefined;\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 (stringCheck(config?.password)) {\n log && info(`${logger}[config] ${config?.password}`);\n return String(config?.password);\n }\n\n const pass = stringCheck(process.env.NILEDB_PASSWORD);\n if (pass) {\n logger && info(`${logger}[NILEDB_PASSWORD] ${pass}`);\n\n return pass;\n }\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.password) {\n return url.password;\n }\n } catch (e) {\n // ok to fail\n }\n }\n return undefined;\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 (stringCheck(config?.api?.token)) {\n logger && info(`${logger}[config] ${config?.api?.token}`);\n return String(config?.api?.token);\n }\n const token = stringCheck(process.env.NILEDB_TOKEN);\n if (token) {\n logger && info(`${logger}[NILEDB_TOKEN] ${token}`);\n return 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 (stringCheck(config?.databaseName)) {\n logger && info(`${logger}[config] ${config?.databaseName}`);\n return String(config?.databaseName);\n }\n const name = stringCheck(process.env.NILEDB_NAME);\n if (name) {\n logger && info(`${logger}[NILEDB_NAME] ${name}`);\n return name;\n }\n\n if (process.env.NILEDB_POSTGRES_URL) {\n try {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n } catch (e) {\n // ok to fail\n }\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 (stringCheck(config?.tenantId)) {\n logger && info(`${logger}[config] ${config?.tenantId}`);\n return String(config?.tenantId);\n }\n\n if (stringCheck(process.env.NILEDB_TENANT)) {\n logger && info(`${logger}[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return String(process.env.NILEDB_TENANT);\n }\n\n return null;\n};\n\nexport const getCookieKey = (cfg: EnvConfig): string => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[cookieKey]');\n if (stringCheck(config?.api?.cookieKey)) {\n logger && info(`${logger}[config] ${config?.api?.cookieKey}`);\n return String(config?.api?.cookieKey);\n }\n\n if (stringCheck(process.env.NILEDB_COOKIE_KEY)) {\n logger &&\n info(`${logger}[NILEDB_COOKIE_KEY] ${process.env.NILEDB_COOKIE_KEY}`);\n return String(process.env.NILEDB_COOKIE_KEY);\n }\n\n return 'token';\n};\n\n/**\n * @param cfg various overrides\n * @returns the url for REST to use\n */\nexport const getBasePath = (cfg: EnvConfig): undefined | string => {\n const { config, logger } = cfg;\n const { warn, info, error } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n if (stringCheck(basePath)) {\n logger && info(`${logger}[config] ${basePath}`);\n return basePath;\n }\n\n const envUrl = stringCheck(process.env.NILEDB_API_URL);\n if (envUrl) {\n logger && info(`${logger}[NILEDB_API_URL] ${process.env.NILEDB_API_URL}`);\n try {\n const apiUrl = new URL(envUrl);\n return apiUrl.href;\n } catch (e) {\n if (e instanceof Error) {\n error(e.stack);\n }\n }\n }\n\n warn('not set. Must run auto-configuration');\n return undefined;\n};\n\nexport const getControlPlane = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n\n if (stringCheck(config?.configureUrl)) {\n logger && info(`${logger}[config] ${config?.configureUrl}`);\n return String(config?.configureUrl);\n }\n\n const autoConfigUrl = stringCheck(process.env.NILEDB_CONFIGURE);\n if (autoConfigUrl) {\n logger &&\n info(`${logger}[NILEDB_CONFIGURE] ${process.env.NILEDB_CONFIGURE}`);\n // backwards compatible, but not really\n if (!autoConfigUrl.startsWith('http')) {\n return `https://${process.env.NILEDB_CONFIGURE}`;\n }\n return process.env.NILEDB_CONFIGURE;\n }\n\n logger && info(`${logger}[default] https://global.thenile.dev`);\n return 'https://global.thenile.dev';\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (stringCheck(config?.db && config.db.host)) {\n logger && info(`${logger}[config] ${config?.db?.host}`);\n return String(config?.db?.host);\n }\n\n if (stringCheck(process.env.NILEDB_HOST)) {\n logger && info(`${logger}[NILEDB_HOST] ${process.env.NILEDB_HOST}`);\n return process.env.NILEDB_HOST;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n logger && info(`${logger}[NILEDB_POSTGRES_URL] ${pgUrl.hostname}`);\n return pgUrl.hostname;\n } catch (e) {\n // ok to fail\n }\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 (stringCheck(process.env.NILEDB_PORT)) {\n logger && info(`${logger}[NILEDB_PORT] ${process.env.NILEDB_PORT}`);\n return Number(process.env.NILEDB_PORT);\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n if (pgUrl.port) {\n return Number(pgUrl.port);\n }\n } catch (e) {\n // ok to fail\n }\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\nconst stringCheck = (str: string | null | undefined) => {\n if (str && str !== '') {\n return str;\n }\n return;\n};\n","import { Routes } from '../../api/types';\nimport {\n Database,\n LoggerType,\n NilePoolConfig,\n ServerConfig,\n} from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getControlPlane,\n getDatabaseName,\n getDatabaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n getSecureCookies,\n getCallbackUrl,\n getCookieKey,\n} from './envVars';\n\nexport type ApiParams = {\n basePath?: string | undefined;\n cookieKey?: string;\n token?: string | undefined;\n callbackUrl?: string | undefined;\n routes?: Partial<Routes>;\n routePrefix?: string | undefined;\n secureCookies?: boolean;\n // the origin for the requests. Allows the setting of the callback origin to a random FE (eg FE localhost:3001 -> BE: localhost:5432 would set to localhost:3000)\n origin?: null | undefined | string;\n};\nexport class ApiConfig {\n public cookieKey?: string;\n public basePath?: string | undefined;\n public routes?: Partial<Routes>;\n public routePrefix?: string;\n public secureCookies?: boolean;\n public origin?: string | null;\n\n /**\n * The client side callback url. Defaults to nothing (so nile.origin will be it), but in the cases of x-origin, you want to set this explicitly to be sure nile-auth does the right thing\n * If this is set, any `callbackUrl` from the client will be ignored.\n */\n public callbackUrl?: string;\n\n #token?: string;\n\n constructor(config?: ServerConfig, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n\n this.cookieKey = getCookieKey(envVarConfig);\n this.#token = getToken(envVarConfig);\n this.callbackUrl = getCallbackUrl(envVarConfig);\n this.secureCookies = getSecureCookies(envVarConfig);\n this.basePath = getBasePath(envVarConfig);\n\n this.routes = config?.api?.routes;\n this.routePrefix = config?.api?.routePrefix;\n this.origin = config?.api?.origin;\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 logger?: LoggerType;\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, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n this.user = getUsername(envVarConfig) as string;\n this.logger = config?.logger;\n this.password = getPassword(envVarConfig) as string;\n if (process.env.NODE_ENV !== 'TEST') {\n if (!this.user) {\n throw new Error(\n 'User is required. Set NILEDB_USER as an environment variable or set `user` in the config options.'\n );\n }\n if (!this.password) {\n throw new Error(\n 'Password is required. Set NILEDB_PASSWORD as an environment variable or set `password` in the config options.'\n );\n }\n }\n\n this.databaseId = getDatabaseId(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 { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.api = new ApiConfig(config, logger);\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, debug } = 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 let basePath = getBasePath(envVarConfig);\n if (configuredHost && this.databaseName && this.databaseId && basePath) {\n info('Already configured, aborting fetch');\n this.api = new ApiConfig(config);\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]', { db: this.db, api: this.api });\n return this;\n } else {\n const msg = [];\n if (!configuredHost) {\n msg.push('Database host');\n }\n if (!this.databaseName) {\n msg.push('Database name');\n }\n if (!this.databaseId) {\n msg.push('Database id');\n }\n if (!basePath) {\n msg.push('API URL');\n }\n info(\n `[autoconfigure] ${msg.join(', ')} ${\n msg.length > 1 ? 'are' : 'is'\n } missing from the config. Autoconfiguration will run.`\n );\n }\n\n const cp = getControlPlane(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${cp}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info(`configuring from ${url.href}`);\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${getInfoBearer({ config })}`,\n },\n }).catch(() => {\n error(`Unable to auto-configure. is ${url} available?`);\n });\n if (!res) {\n return this;\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 debug('Unable to auto-configure');\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 occurred');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please remove NILEDB_NAME, NILEDB_API_URL, NILEDB_POSTGRES_URL, and/or NILEDB_HOST from your environment variables.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n basePath = basePath || apiHost;\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n configuredHost = dburl.hostname;\n }\n }\n this.api = new ApiConfig(config);\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]', { db: this.db, api: this.api });\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 private events: { [key: string]: EventFn[] } = {};\n\n // Publish event and notify all subscribers\n publish(eventName: string, value: BusValues) {\n const callbackList = this.events[eventName];\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n }\n\n // Unsubscribe from an event\n unsubscribe(eventName: string, callback: EventFn) {\n const callbackList = this.events[eventName];\n\n if (!callbackList) {\n return; // Early exit if no event exists\n }\n\n const index = callbackList.indexOf(callback);\n if (index !== -1) {\n callbackList.splice(index, 1); // Remove the callback\n }\n\n // If there are no more listeners, clean up the event\n if (callbackList.length === 0) {\n delete this.events[eventName];\n }\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);\n\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import pg 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: pg.Pool, config: Config): pg.Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<pg.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('query', ...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 pg.Pool;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pg 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: pg.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, debug } = 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 debug(`Connection pool config ${JSON.stringify(this.config.db)}`);\n\n this.pool = createProxyForPool(new pg.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 debug(`pool connected ${this.id}`);\n this.startTimeout();\n const afterCreate: AfterCreate = makeAfterCreate(\n config,\n `${this.id}-${this.timer}`\n );\n afterCreate(client, (err) => {\n const { error } = Logger(config, '[after create callback]');\n if (err) {\n clearTimeout(this.timer);\n error('after create failed', {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n }\n });\n });\n this.pool.on('error', (err) => {\n clearTimeout(this.timer);\n info(`pool ${this.id} failed`, {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n });\n this.pool.on('release', (destroy) => {\n if (destroy) {\n clearTimeout(this.timer);\n evictPool(this.id);\n debug(`destroying pool ${this.id}`);\n }\n });\n }\n\n startTimeout() {\n const { debug } = Logger(this.config, '[NileInstance]');\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n debug(\n `Pool reached idleTimeoutMillis. ${this.id} evicted after ${\n Number(this.config.db.idleTimeoutMillis) ?? 30000\n }ms`\n );\n this.pool.end(() => {\n clearTimeout(this.timer);\n evictPool(this.id);\n });\n }, Number(this.config.db.idleTimeoutMillis) ?? 30000);\n }\n shutdown() {\n const { debug } = Logger(this.config, '[NileInstance]');\n debug(`attempting to shut down ${this.id}`);\n clearTimeout(this.timer);\n this.pool.end(() => {\n debug(`${this.id} has been shut down`);\n });\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config, id: string): AfterCreate {\n const { error, warn, debug } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(e: Error) {\n error(`Connection ${id} was terminated by server`, {\n message: e.message,\n stack: e.stack,\n });\n done(e, 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 (err) {\n error('query connection failed', {\n cause: err.cause,\n stack: err.stack,\n message: err.message,\n name: err.name,\n id,\n });\n } else {\n if (query.length === 1) {\n debug(`connection context set: tenantId=${config.tenantId}`);\n }\n if (query.length === 2) {\n debug(\n `connection context set: tenantId=${config.tenantId} userId=${config.userId}`\n );\n }\n }\n\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import pg 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 cleared: boolean;\n private poolWatcherFn: (id: undefined | null | string) => void;\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 this.cleared = false;\n this.connections = new Map();\n this.poolWatcherFn = this.poolWatcher(config);\n watchEvictPool(this.poolWatcherFn);\n }\n poolWatcher = (config: ServerConfig) => (id: undefined | null | string) => {\n const { info, warn } = Logger(config, '[DBManager]');\n if (id && this.connections.has(id)) {\n info(`Removing ${id} from db connection pool.`);\n const connection = this.connections.get(id);\n connection?.shutdown();\n this.connections.delete(id);\n } else {\n warn(`missed eviction of ${id}`);\n }\n };\n\n getConnection = (config: ServerConfig): pg.Pool => {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n\n const existing = this.connections.get(id);\n info(`# of instances: ${this.connections.size}`);\n if (existing) {\n info(`returning existing ${id}`);\n existing.startTimeout();\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 if (this.cleared) {\n this.cleared = false;\n }\n return newOne.pool;\n };\n\n clear = (config: ServerConfig) => {\n const { info } = Logger(config, '[DBManager]');\n info(`Clearing all connections ${this.connections.size}`);\n this.cleared = true;\n this.connections.forEach((connection) => {\n connection.shutdown();\n });\n this.connections.clear();\n };\n}\n","import { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\n\nfunction filterNullUndefined(\n obj?: Record<string, string | null>\n): { [k: string]: string | null } | undefined {\n if (!obj) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value !== null && value !== undefined\n )\n );\n}\n\nexport function makeRestUrl(\n config: Config,\n path: string,\n qp?: Record<string, string | null>\n) {\n const url = config.api.basePath || NILEDB_API_URL;\n if (!url) {\n throw new Error(\n 'An API url is required. Set it via NILEDB_API_URL. Was auto configuration run?'\n );\n }\n const params = new URLSearchParams(\n filterNullUndefined(qp) as Record<string, string>\n );\n const strParams = params.toString();\n return `${[url, path.substring(1, path.length)].join('/')}${\n strParams ? `?${strParams}` : ''\n }`;\n}\n","import { Config } from '../../../utils/Config';\n\nimport { makeRestUrl } from './makeRestUrl';\n\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\nexport const apiRoutes = (config: Config) => ({\n ME: makeRestUrl(config, '/me'),\n USERS: (qp: { tenantId?: null | string; newTenantName?: null | string }) =>\n makeRestUrl(config, '/users', qp),\n USER: (userId: string) => makeRestUrl(config, `/users/${userId}`),\n TENANTS: makeRestUrl(config, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(config, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(config, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users`),\n TENANT_USER: (tenantId: string, userId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users/${userId}`),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(config, `/users/${userId}/tenants`),\n});\n","import { Routes } from '../../types';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\n\nconst key = 'ME';\n\n/**\n * @swagger\n * /api/me:\n * get:\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: me\n * responses:\n * \"200\":\n * description: Identified user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nasync function GET(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n const res = await request(url, init, config);\n return res;\n}\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config)[key];\n\n switch (request.method) {\n case 'GET':\n return await GET(url, { request }, config);\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\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 { getCookie, getOrigin } from '../context/asyncStorage';\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';\nimport {\n X_NILE_ORIGIN,\n X_NILE_SECURECOOKIES,\n X_NILE_TENANT,\n X_NILE_USER_ID,\n} from './constants';\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('; ') ?? getCookie()?.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, X_NILE_TENANT);\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 function makeBasicHeaders(\n config: Config,\n url: string,\n opts?: RequestInit\n) {\n const { warn, error } = Logger(config, '[headers]');\n const headers = new Headers(opts?.headers);\n headers.set('content-type', 'application/json; charset=utf-8');\n const cookieKey = config.api?.cookieKey;\n\n // the sdk server side calls use this\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n } else if (getToken({ config })) {\n headers.set('Authorization', `Bearer ${getToken({ config })}`);\n }\n }\n const cookie = headers.get('cookie');\n if (!cookie) {\n const contextCookie = getCookie();\n if (contextCookie) {\n headers.set('cookie', contextCookie);\n } else {\n // routes that do not require a cookie (non-auth)\n if (!url.endsWith('/users')) {\n error(\n 'Missing cookie header from request. Call nile.api.setContext(request) before making additional calls.'\n );\n }\n }\n }\n if (config && config.api.secureCookies != null) {\n headers.set(X_NILE_SECURECOOKIES, String(config.api.secureCookies));\n }\n\n const savedOrigin = getOrigin();\n\n if (config && config.api.origin) {\n headers.set(X_NILE_ORIGIN, config.api.origin);\n } else if (savedOrigin) {\n headers.set(X_NILE_ORIGIN, savedOrigin);\n } else {\n warn(\n 'nile.origin missing from header, which defaults to secure cookies only.'\n );\n }\n return headers;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const { debug, error } = Logger(config, '[server]');\n\n const url = `${config.api?.basePath}${path}`;\n const headers = new Headers(opts?.headers);\n const tenantId = getTenantFromHttp(headers, config);\n const basicHeaders = makeBasicHeaders(config, url, opts);\n updateTenantId(tenantId);\n const userId = getUserFromHttp(headers, config);\n updateUserId(userId);\n\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 debug(`[fetch] ${useableUrl}`);\n\n try {\n const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n error('[fetch][response]', {\n message: e.message,\n stack: e.stack,\n debug: 'Is nile-auth running?',\n });\n return new Error(e);\n });\n\n if (response instanceof Error) {\n return new ResponseError('Failed to connect to database', {\n status: 400,\n });\n }\n if (response && response.status >= 200 && response.status < 300) {\n if (typeof response.clone === 'function') {\n try {\n debug(\n `[fetch][response][${opts?.method ?? 'GET'}] ${\n response.status\n } ${useableUrl}`,\n {\n body: await response.clone().json(),\n }\n );\n } catch (e) {\n debug(\n `[fetch][response][${opts?.method ?? 'GET'}] ${\n response.status\n } ${useableUrl}`,\n {\n body: await response.clone().text(),\n }\n );\n }\n }\n return response;\n }\n if (response?.status === 404) {\n return new ResponseError('Not found', { status: 404 });\n }\n\n if (response?.status === 401) {\n return new ResponseError('Unauthorized', { status: 401 });\n }\n if (response?.status === 405) {\n return new ResponseError('Method not allowed', { status: 405 });\n }\n const errorHandler =\n typeof response?.clone === 'function' ? response.clone() : null;\n let msg = '';\n const res = await (response as Response)?.json().catch(async (e) => {\n if (errorHandler) {\n msg = await errorHandler.text();\n if (msg) {\n error(`[fetch][response][status: ${errorHandler.status}]`, {\n message: msg,\n });\n }\n return e as ResponseError;\n }\n if (!msg) {\n error('[fetch][response]', { e });\n }\n return 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(`[fetch][response][status: ${errorHandler?.status}] ${message}`);\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n error(`[fetch][response] [status: ${errorHandler?.status}] ${message}`);\n return new ResponseError(message, { status: 400 });\n }\n error(\n `[fetch][response][status: ${errorHandler?.status}] UNHANDLED ERROR`,\n {\n response,\n message: await response.text(),\n }\n );\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n } catch (e) {\n return new ResponseError('an unexpected error has occurred', {\n status: 500,\n });\n }\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport { Config } from '../../../utils/Config';\n/**\n * @swagger\n * /api/users:\n * post:\n * tags:\n * - users\n * summary: Creates a user\n * description: Creates a user in the database\n * operationId: createUser\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const newTenantName = yurl.searchParams.get('newTenantName');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes(config).USERS({ tenantId: tenant, newTenantName });\n\n return await request(url, init, config);\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport { Config } from '../../../utils/Config';\n\n/**\n * @swagger\n * /api/users:\n * get:\n * tags:\n * - users\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided. You can also pass the a `nile.tenant_id` in the header or in a cookie.\n * operationId: listUsers\n * parameters:\n * - name: tenantId\n * in: query\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/TenantUser'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n const url = apiRoutes(config).TENANT_USERS(tenant);\n init.method = 'GET';\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes/apiRoutes';\nimport fetch from '../../../utils/request';\nimport { ActiveSession } from '../../../utils/auth';\nimport { Config } from '../../../../utils/Config';\n\n/**\n * @swagger\n * /api/users/{userid}:\n * put:\n * tags:\n * - users\n * summary: update a user\n * description: updates a user within the tenant\n * operationId: updateUser\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * Update a user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/UpdateUserRequest'\n * responses:\n * \"200\":\n * description: An updated user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n config: Config,\n session: null | undefined | ActiveSession,\n init: RequestInit & { request: Request }\n) {\n if (!session) {\n return new Response(null, { status: 401 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n\n // update the user\n\n const [userId] = new URL(init.request.url).pathname.split('/').reverse();\n\n const url = apiRoutes(config).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport auth from '../../utils/auth';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nimport { POST } from './POST';\nimport { GET } from './GET';\nimport { PUT } from './[userId]/PUT';\n\nconst key = 'USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request }, info);\n case 'POST':\n return await POST(config, { request });\n case 'PUT':\n return await PUT(config, session, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * get:\n * tags:\n * - users\n * summary: List tenant users\n * description: Lists users that are associated with the specified tenant.\n * operationId: listTenantUsers\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: Users found\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/User'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import { ActiveSession } from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport { Config } from '../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * post:\n * tags:\n * - users\n * summary: Create a user in a tenant\n * description: Creates a new user and associates that user with the specified\n * tenant.\n * operationId: createTenantUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n */\nexport async function POST(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n init.body = JSON.stringify({ email: session.email });\n init.method = 'PUT';\n const url = apiRoutes(config).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{email}:\n * delete:\n * tags:\n * - tenants\n * summary: removes a user from a tenant\n * description: removes an associated user from a specified\n * tenant.\n * operationId: unlinkUser \n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: email \n * in: path\n * required: true\n * schema:\n * type: string\n \n * responses:\n * \"204\":\n * description: User removed\n */\n\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [userId, _, tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'DELETE';\n init.body = JSON.stringify({ email: userId });\n const url = `${apiRoutes(config).TENANT_USER(tenantId, userId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../utils/request';\nimport { Config } from '../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * put:\n * tags:\n * - tenants\n * summary: associates an existing user with the tenant\n * operationId: linkUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email of the user you want to add to a tenant.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/AssociateUserRequest'\n * responses:\n * \"201\":\n * description: add user to tenant\n */\n\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport urlMatches from '../../../../utils/routes/urlMatches';\nimport { Routes } from '../../../../types';\nimport auth from '../../../../utils/auth';\nimport Logger from '../../../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\nimport { DELETE } from './[userId]/DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n if (!tenantId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\n case 'POST':\n return await POST(config, session, { request });\n case 'PUT':\n return await PUT(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * get:\n * tags:\n * - tenants\n * summary: list tenants by user\n * description: Creates a user in the database\n * operationId: listTenants\n * responses:\n * \"200\":\n * description: a list of tenants\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: \"#/components/schemas/Tenant\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n let url = `${apiRoutes(config).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config).USER_TENANTS(session.user.id)}`;\n }\n\n const res = await request(url, init, config);\n return res;\n}\n","import { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * get:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: getTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: the desired tenant\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n\n init.method = 'GET';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes a tenant.\n * operationId: deleteTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * put:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: updateTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: update an existing tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * post:\n * tags:\n * - tenants\n * summary: Create a tenant\n * description: Creates a new tenant in a database.\n * operationId: createTenant\n * requestBody:\n * description: A wrapper for the tenant name.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateTenantRequest'\n * examples:\n * Create Tenant Request:\n * summary: Creates a named tenant\n * description: Create Tenant Request\n * value:\n * name: My Sandbox\n * responses:\n * \"201\":\n * description: Tenant created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Database not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport Logger from '../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { GET as TENANT_GET } from './[tenantId]/GET';\nimport { DELETE } from './[tenantId]/DELETE';\nimport { PUT } from './[tenantId]/PUT';\nimport { POST } from './POST';\n\nfunction isUUID(value: string | null | undefined) {\n if (!value) {\n return false;\n }\n // is any UUID\n const regex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5|7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\n return regex.test(value);\n}\n\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const [possibleTenantId] = request.url.split('/').reverse();\n\n switch (request.method) {\n case 'GET':\n if (isUUID(possibleTenantId)) {\n return await TENANT_GET(config, { request }, info);\n }\n return await GET(config, session, { request });\n case 'POST':\n return await POST(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n case 'PUT':\n return await PUT(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Config } from '../../../utils/Config';\n\nimport { makeRestUrl } from './makeRestUrl';\n\nexport const proxyRoutes = (config: Config) => ({\n SIGNIN: makeRestUrl(config, '/auth/signin'),\n PROVIDERS: makeRestUrl(config, '/auth/providers'),\n SESSION: makeRestUrl(config, '/auth/session'),\n CSRF: makeRestUrl(config, '/auth/csrf'),\n CALLBACK: makeRestUrl(config, '/auth/callback'),\n SIGNOUT: makeRestUrl(config, '/auth/signout'),\n ERROR: makeRestUrl(config, '/auth/error'),\n VERIFY_REQUEST: makeRestUrl(config, '/auth/verify-request'),\n PASSWORD_RESET: makeRestUrl(config, '/auth/reset-password'),\n});\n\ntype ProxyKeys = keyof typeof proxyRoutes;\n\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n","/**\n * @swagger\n * /api/auth/signin:\n * get:\n * tags:\n * - authentication\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided\n * operationId: signin\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config)[key]}/${provider}`;\n }\n\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n\n url = `${url}${params.toString() !== '' ? `?${params.toString()}` : ''}`;\n\n const res = await request(url, { ...init, request: req }, config);\n\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).SESSION,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.SESSION);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).PROVIDERS,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PROVIDERS);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).CSRF,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CSRF);\n}\n","import { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nconst key = 'CALLBACK';\n\nexport default async function route(req: Request, config: Config) {\n const { error } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n try {\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config)[key]}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await request(\n url,\n {\n request: req,\n method: req.method,\n },\n config\n ).catch((e) => {\n error('an error as occurred', e);\n });\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n } catch (e) {\n error(e);\n }\n return new Response('An unexpected error has occurred.', { status: 400 });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport fetch from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: request.method,\n };\n if (request.method === 'POST') {\n init.body = request.body;\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n url = `${proxyRoutes(config)[key]}${\n provider !== 'signout' ? `/${provider}` : ''\n }`;\n }\n\n const res = await fetch(url, { ...init, request }, config);\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_REQUEST';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'PASSWORD_RESET';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PASSWORD_RESET);\n}\n","import Logger from '../../utils/Logger';\nimport me, { matches as matchesMe } from '../routes/me';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[GET MATCHER]');\n return async function GET(req: Request) {\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n if (authRoutes.matchesVerifyRequest(configRoutes, req)) {\n info('matches verify-request');\n return authRoutes.handleVerifyRequest(req, config);\n }\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn('No GET routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/signup:\n * post:\n * tags:\n * - users\n * summary: signs a user up\n * description: signs a user up and logs them in. Expects a email and password combo\n * operationId: signUp\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User and session created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).SIGNUP}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\n\nimport { POST } from './POST';\n\nconst key = 'SIGNUP';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'POST':\n return await POST(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import Logger, { matchesLog } from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport signup, { matches as matchesSignup } from '../routes/signup';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport * as authRoutes from '../routes/auth';\n\nexport default function POSTER(configRoutes: Routes, config: Config) {\n const { info, warn, error } = Logger(config, '[POST MATCHER]');\n return async function POST(req: Request) {\n // special case for logging client errors\n if (matchesLog(configRoutes, req)) {\n if (req.body) {\n try {\n const text = await req.text();\n error(text);\n return new Response(null, {\n status: 200,\n });\n } catch (e) {\n //noop\n }\n }\n }\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesSignup(configRoutes, req)) {\n info('matches signup');\n return signup(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n warn('No POST routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantsUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[DELETE MATCHER]');\n return async function DELETE(req: Request) {\n if (matchesTenantsUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { handlePasswordReset, matchesPasswordReset } from '../routes/auth';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[PUT MATCHER]');\n return async function PUT(req: Request) {\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesPasswordReset(configRoutes, req)) {\n info('matches reset password');\n return handlePasswordReset(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../utils/Config';\nimport { Routes } from '../types';\n\nimport getter from './GET';\nimport poster from './POST';\nimport deleter from './DELETE';\nimport puter from './PUT';\n\nexport default function Handlers(configRoutes: Routes, config: Config) {\n const GET = getter(configRoutes, config);\n const POST = poster(configRoutes, config);\n const DELETE = deleter(configRoutes, config);\n const PUT = puter(configRoutes, config);\n return {\n GET,\n POST,\n DELETE,\n PUT,\n };\n}\n","import { Routes } from '../../types';\n\nexport const appRoutes = (prefix = '/api'): Routes => ({\n SIGNIN: `${prefix}/auth/signin`,\n PROVIDERS: `${prefix}/auth/providers`,\n SESSION: `${prefix}/auth/session`,\n CSRF: `${prefix}/auth/csrf`,\n CALLBACK: `${prefix}/auth/callback`,\n SIGNOUT: `${prefix}/auth/signout`,\n ERROR: `${prefix}/auth/error`,\n VERIFY_REQUEST: `${prefix}/auth/verify-request`,\n PASSWORD_RESET: `${prefix}/auth/reset-password`,\n ME: `${prefix}/me`,\n USERS: `${prefix}/users`,\n TENANTS: `${prefix}/tenants`,\n TENANT: `${prefix}/tenants/{tenantId}`,\n TENANT_USER: `${prefix}/tenants/{tenantId}/users/{userId}`,\n TENANT_USERS: `${prefix}/tenants/{tenantId}/users`,\n SIGNUP: `${prefix}/signup`,\n LOG: `${prefix}/_log`,\n});\n","import { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT } from '../constants';\nimport { _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'DELETE' | '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 body,\n method,\n ...init,\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 options 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 async post<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('POST', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n const cloned = response.clone();\n try {\n return await cloned.json();\n } catch (e) {\n // give back the response\n }\n }\n return response;\n }\n\n async get<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit,\n raw = false\n ): Promise<Response | R> {\n const response = await this.request('GET', url, req, init);\n if (raw) {\n return response;\n }\n if (response && response.status >= 200 && response.status < 300) {\n const cloned = response.clone();\n try {\n return await cloned.json();\n } catch (e) {\n // give back the response\n }\n }\n return response;\n }\n\n async put<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('PUT', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n const cloned = response.clone();\n try {\n return await cloned.json();\n } catch (e) {\n // give back the response\n }\n }\n return response;\n }\n\n async delete(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> {\n const response = await this.request('DELETE', url, req, init);\n return response;\n }\n}\n","import { ActiveSession, JWT, Provider } from '../api/utils/auth';\nimport { appRoutes } from '../api/utils/routes/defaultRoutes';\nimport { Config } from '../utils/Config';\nimport { X_NILE_ORIGIN } from '../utils/constants';\nimport Logger from '../utils/Logger';\nimport Requester, { NileRequest } from '../utils/Requester';\n\n/**\n * a helper function to log in server side.\n */\nexport function serverLogin(\n config: Config,\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n }\n) {\n const ORIGIN = config.api.origin ?? 'http://localhost:3000';\n const { info, error, debug } = Logger(config, '[server side login]');\n const routes = appRoutes(config.api.routePrefix);\n return async function login<T extends [Headers, Response]>({\n email,\n password,\n }: {\n email: string;\n password: string;\n }) {\n if (!email || !password) {\n throw new Error('Server side login requires a user email and password.');\n }\n\n const sessionUrl = new URL(`${ORIGIN}${routes.PROVIDERS}`);\n const baseHeaders = {\n host: sessionUrl.host,\n [X_NILE_ORIGIN]: ORIGIN,\n };\n info(`Obtaining providers for ${email}`);\n const sessionReq = new Request(sessionUrl, {\n method: 'GET',\n ...baseHeaders,\n });\n const sessionRes = await handlers.POST(sessionReq);\n\n if (sessionRes?.status === 404) {\n throw new Error('Unable to login, cannot find region api.');\n }\n\n let providers;\n try {\n providers = await sessionRes?.json();\n } catch (e) {\n info(sessionUrl, { sessionRes });\n error(e);\n }\n\n info('Obtaining csrf');\n const csrf = new URL(`${ORIGIN}${routes.CSRF}`);\n const csrfReq = new Request(csrf, {\n method: 'GET',\n headers: new Headers({\n ...baseHeaders,\n }),\n });\n const csrfRes = await handlers.POST(csrfReq);\n let csrfToken;\n try {\n const json = (await csrfRes?.json()) ?? {};\n csrfToken = json?.csrfToken;\n } catch (e) {\n info(sessionUrl, { csrfRes });\n error(e, { csrfRes });\n }\n\n const { credentials } = providers ?? {};\n\n const csrfCookie = csrfRes?.headers.get('set-cookie');\n\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side login.'\n );\n }\n const signInUrl = new URL(credentials.callbackUrl);\n\n if (!csrfCookie) {\n debug('CSRF failed', { headers: csrfRes?.headers });\n throw new Error('Unable to authenticate REST, CSRF missing.');\n }\n info(`Attempting sign in with email ${email} ${signInUrl.href}`);\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n const postReq = new Request(signInUrl, {\n method: 'POST',\n headers: new Headers({\n ...baseHeaders,\n 'content-type': 'application/json',\n cookie: csrfCookie.split(',').join('; '),\n }),\n body,\n });\n\n const loginRes = await handlers.POST(postReq);\n const authCookie = loginRes?.headers.get('set-cookie');\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n\n const token = parseToken(loginRes?.headers);\n if (!token) {\n error('Unable to obtain auth token', { authCookie });\n throw new Error('Server login failed');\n }\n info('Server login successful', { authCookie, csrfCookie });\n const headers = new Headers({\n ...baseHeaders,\n cookie: [token, csrfCookie].join('; '),\n });\n return [headers, loginRes] as T;\n };\n}\n\nexport function parseToken(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.session-token=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\nexport default class Auth extends Config {\n headers?: Headers;\n resetHeaders?: (headers?: Headers) => void;\n constructor(\n config: Config,\n headers?: Headers,\n params?: { resetHeaders: () => void }\n ) {\n super(config);\n this.logger = Logger(config, '[auth]');\n this.headers = headers;\n this.logger = Logger(config, '[auth]');\n this.resetHeaders = params?.resetHeaders;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n const cburl = getCallbackUrl(this.headers);\n if (cburl) {\n try {\n this.headers.set(X_NILE_ORIGIN, new URL(cburl).origin);\n } catch (e) {\n if (this.logger?.debug) {\n this.logger.debug('Invalid URL supplied by cookie header');\n }\n }\n }\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n\n get sessionUrl() {\n return '/auth/session';\n }\n\n getSession = async <T = JWT | ActiveSession | Response | undefined>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n const session = await _requester.get(req, this.sessionUrl, _init);\n if (Object.keys(session).length === 0) {\n return undefined as T;\n }\n return session as T;\n };\n\n get getCsrfUrl() {\n return '/auth/csrf';\n }\n\n async getCsrf<T = Response | JSON>(\n req: NileRequest<void> | Headers,\n init?: RequestInit,\n raw = false\n ) {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.getCsrfUrl, _init, raw)) as T;\n }\n get listProvidersUrl() {\n return '/auth/providers';\n }\n\n listProviders = async <T = Response | { [key: string]: Provider }>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.listProvidersUrl, _init)) as T;\n };\n\n get signOutUrl() {\n return '/auth/signout';\n }\n\n signOut = async <T = Response | { url: string }>(\n req: NileRequest<void | { callbackUrl?: string }> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n\n const csrf = await this.getCsrf<Response>(\n req as NileRequest<void>,\n undefined,\n true\n );\n const csrfHeader = getCsrfToken(csrf.headers, this.headers);\n const callbackUrl =\n req && 'callbackUrl' in req ? String(req.callbackUrl) : '/';\n\n if (!csrfHeader) {\n this.logger?.debug &&\n this.logger.debug('Request blocked from invalid csrf header');\n return new Response('Request blocked', { status: 400 }) as T;\n }\n\n const headers = new Headers(_init?.headers);\n const { csrfToken } = (await csrf.json()) ?? {};\n const cooks = getCookies(headers);\n if (csrfHeader) {\n if (cooks['__Secure-nile.csrf-token']) {\n cooks['__Secure-nile.csrf-token'] = encodeURIComponent(csrfHeader);\n }\n if (cooks['nile.csrf-token']) {\n cooks['nile.csrf-token'] = encodeURIComponent(csrfHeader);\n }\n }\n\n headers.set(\n 'cookie',\n Object.keys(cooks)\n .map((key) => `${key}=${cooks[key]}`)\n .join('; ')\n );\n\n const res = await _requester.post(req, this.signOutUrl, {\n method: 'post',\n body: JSON.stringify({\n csrfToken,\n callbackUrl,\n json: String(true),\n }),\n ..._init,\n headers,\n });\n\n this.resetHeaders && this.resetHeaders();\n\n return res as T;\n };\n}\nfunction getCallbackUrl(headers: Headers | void): string | void {\n if (headers) {\n const cookies = getCookies(headers);\n if (cookies) {\n return (\n cookies['__Secure-nile.callback-url'] || cookies['nile.callback-url']\n );\n }\n }\n}\n\nfunction getCsrfToken(\n headers: Headers | void,\n initHeaders: Headers | void\n): string | void {\n if (headers) {\n const cookies = getCookies(headers);\n let validCookie = '';\n if (cookies) {\n validCookie =\n cookies['__Secure-nile.csrf-token'] || cookies['nile.csrf-token'];\n }\n if (validCookie) {\n return validCookie;\n }\n }\n if (initHeaders) {\n const cookies = getCookies(initHeaders);\n if (cookies) {\n return cookies['__Secure-nile.csrf-token'] || cookies['nile.csrf-token'];\n }\n }\n}\n\nconst getCookies = (headers: Headers | void): Record<string, string> => {\n if (!headers) return {};\n\n // Get 'cookie' and 'set-cookie' headers\n const cookieHeader = headers.get('cookie') || '';\n const setCookieHeaders = headers.get('set-cookie') || '';\n\n // Merge both headers into an array\n const allCookies = [\n ...cookieHeader.split('; '), // Regular 'cookie' header (semicolon-separated)\n ...setCookieHeaders.split(/,\\s*(?=[^;, ]+=)/), // Smart split for 'set-cookie'\n ].filter(Boolean); // Remove empty entries\n\n // Convert cookies into an object\n return Object.fromEntries(\n allCookies.map((cookie) => {\n const [key, ...val] = cookie.split('=');\n return [\n decodeURIComponent(key.trim()),\n decodeURIComponent(val.join('=').trim()),\n ];\n })\n );\n};\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest } from '../utils/Requester';\n\nimport { Tenant } from './types';\n\nexport default class Tenants extends Config {\n headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n get tenantsUrl() {\n return '/tenants';\n }\n get tenantUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}`;\n }\n\n createTenant = async <T = Tenant | Response>(\n req: NileRequest<{ name: string }> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n let _req;\n if (typeof req === 'string') {\n _req = new Request(`${this.api.basePath}${this.tenantsUrl}`, {\n body: JSON.stringify({ name: req }),\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n });\n } else {\n _req = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.post(_req, this.tenantsUrl, _init) as T;\n };\n\n getTenant = async <T = Tenant | Response>(\n req: NileRequest<{ id: string }> | Headers | string | void,\n init?: RequestInit\n ): Promise<T> => {\n if (typeof req === 'string') {\n this.tenantId = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.get<Tenant>(req, this.tenantUrl, _init) as T;\n };\n\n get tenantListUrl() {\n return `/users/${this.userId ?? '{userId}'}/tenants`;\n }\n\n listTenants = async <T = Tenant[] | Response>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.get<Tenant[]>(req, this.tenantListUrl, _init) as T;\n };\n\n deleteTenant = async <T = Response>(\n req: NileRequest<void> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n if (typeof req === 'string') {\n this.tenantId = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.delete(req, this.tenantUrl, _init) as T;\n };\n updateTenant = async <T = Tenant | Response>(\n req: NileRequest<void> | Headers | { name: string },\n init?: RequestInit\n ): Promise<T> => {\n let _req;\n if (req && 'name' in req) {\n _req = new Request(`${this.api.basePath}${this.tenantUrl}`, {\n body: JSON.stringify(req),\n method: 'PUT',\n });\n } else {\n _req = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.put<Tenant>(_req, this.tenantUrl, _init) as T;\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest } from '../utils/Requester';\n\nimport { CreateBasicUserRequest, CreateTenantUserRequest, User } from './types';\n\nexport default class Users extends Config {\n headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n\n usersUrl(user: CreateBasicUserRequest) {\n const params = new URLSearchParams();\n if (user.newTenantName) {\n params.set('newTenantName', user.newTenantName);\n }\n if (user.tenantId) {\n params.set('tenantId', user.tenantId);\n }\n return `/users?${params.size > 0 ? params : ''}`;\n }\n\n get tenantUsersUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n get linkUsersUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users/${\n this.userId ?? '{userId}'\n }/link`;\n }\n\n get tenantUserUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users/${\n this.userId ?? '{userId}'\n }`;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n\n createUser = async <T = User | Response>(\n user: CreateBasicUserRequest,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n\n const _init = this.handleHeaders(init);\n return (await _requester.post(user, this.usersUrl(user), _init)) as T;\n };\n\n createTenantUser = async <T = User | Response>(\n req: NileRequest<CreateTenantUserRequest>,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n\n const _init = this.handleHeaders(init);\n return (await _requester.post(req, this.tenantUsersUrl, _init)) as T;\n };\n\n updateUser = async <T = User[] | Response>(\n req: NileRequest<\n Partial<Omit<User, 'email' | 'tenants' | 'created' | 'updated'>>\n >,\n init?: RequestInit\n ): Promise<T> => {\n let _req;\n if (req && 'id' in req) {\n _req = new Request(`${this.api.basePath}${this.tenantUserUrl}`, {\n body: JSON.stringify(req),\n method: 'PUT',\n });\n this.userId = String(req.id);\n } else {\n _req = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.put(_req, this.tenantUserUrl, _init)) as T;\n };\n\n listUsers = async <T = User[] | Response>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.tenantUsersUrl, _init)) as T;\n };\n\n linkUser = async <T = User | Response>(\n req: NileRequest<{ id: string; tenantId?: string }> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n if (typeof req === 'string') {\n this.userId = req;\n } else {\n if ('id' in req) {\n this.userId = req.id;\n }\n if ('tenantId' in req) {\n this.tenantId = req.tenantId;\n }\n }\n\n const _init = this.handleHeaders(init);\n return (await _requester.put(req, this.linkUsersUrl, _init)) as T;\n };\n\n unlinkUser = async <T = Response>(\n req: NileRequest<{ id: string; tenantId?: string }> | Headers | string,\n init?: RequestInit\n ): Promise<T> => {\n if (typeof req === 'string') {\n this.userId = req;\n } else {\n if ('id' in req) {\n this.userId = req.id;\n }\n if ('tenantId' in req) {\n this.tenantId = req.tenantId;\n }\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.delete(req, this.linkUsersUrl, _init)) as T;\n };\n\n get meUrl() {\n return '/me';\n }\n\n me = async <T = User | Response>(\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.get(req, this.meUrl, _init)) as T;\n };\n updateMe = async <T = User | Response>(\n req:\n | NileRequest<\n Partial<\n Omit<User, 'email' | 'id' | 'tenants' | 'created' | 'updated'>\n >\n >\n | Headers,\n init?: RequestInit\n ): Promise<T> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return (await _requester.put(req, this.meUrl, _init)) as T;\n };\n}\n","import Handlers from './api/handlers';\nimport { Routes } from './api/types';\nimport auth from './api/utils/auth';\nimport { appRoutes } from './api/utils/routes/defaultRoutes';\nimport Auth, { parseToken, serverLogin } from './auth';\nimport Tenants from './tenants';\nimport Users from './users';\nimport { Config } from './utils/Config';\nimport Logger from './utils/Logger';\nimport { setContext as asyncSetContext } from './context/asyncStorage';\n\nexport class Api {\n config: Config;\n users: Users;\n auth: Auth;\n tenants: Tenants;\n routes: Routes;\n #headers: undefined | Headers;\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n };\n paths: {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n };\n constructor(config: Config) {\n this.config = config;\n this.auth = new Auth(config, undefined, {\n resetHeaders: this.resetHeaders,\n });\n this.users = new Users(config);\n this.tenants = new Tenants(config);\n this.routes = {\n ...appRoutes(config?.api.routePrefix),\n ...config?.api.routes,\n };\n\n this.handlers = Handlers(this.routes, config);\n this.paths = {\n get: [\n this.routes.ME,\n this.routes.TENANT_USERS,\n this.routes.TENANTS,\n this.routes.TENANT,\n this.routes.SESSION,\n this.routes.SIGNIN,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n this.routes.PASSWORD_RESET,\n this.routes.CALLBACK,\n this.routes.SIGNOUT,\n this.routes.VERIFY_REQUEST,\n this.routes.ERROR,\n ],\n post: [\n this.routes.TENANT_USERS,\n this.routes.SIGNUP,\n this.routes.USERS,\n this.routes.TENANTS,\n this.routes.SESSION,\n `${this.routes.SIGNIN}/{provider}`,\n this.routes.PASSWORD_RESET,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n `${this.routes.CALLBACK}/{provider}`,\n this.routes.SIGNOUT,\n ],\n put: [\n this.routes.TENANT_USERS,\n this.routes.USERS,\n this.routes.TENANT,\n this.routes.PASSWORD_RESET,\n ],\n delete: [this.routes.TENANT_USER, this.routes.TENANT],\n };\n }\n\n reset = () => {\n this.users = new Users(this.config, this.#headers);\n this.tenants = new Tenants(this.config, this.#headers);\n this.auth = new Auth(this.config, this.#headers, {\n resetHeaders: this.resetHeaders,\n });\n };\n\n updateConfig = (config: Config) => {\n this.config = config;\n this.handlers = Handlers(this.routes, config);\n };\n\n resetHeaders = (headers?: Headers) => {\n this.#headers = new Headers(headers ?? {});\n asyncSetContext(new Headers());\n this.reset();\n };\n\n set headers(headers: Headers | Record<string, string>) {\n const updates: [string, string][] = [];\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n updates.push([key.toLowerCase(), value]);\n });\n } else {\n for (const [key, value] of Object.entries(headers)) {\n updates.push([key.toLowerCase(), value]);\n }\n }\n\n const merged: Record<string, string> = {};\n this.#headers?.forEach((value, key) => {\n merged[key.toLowerCase()] = value;\n });\n\n for (const [key, value] of updates) {\n merged[key] = value;\n }\n\n this.#headers = new Headers();\n for (const [key, value] of Object.entries(merged)) {\n this.#headers.set(key, value);\n }\n\n this.reset();\n }\n\n get headers(): Headers | undefined {\n return this.#headers;\n }\n\n getCookie(req?: Request | Headers) {\n if (req instanceof Headers) {\n return parseToken(req);\n } else if (req instanceof Request) {\n return parseToken(req.headers);\n }\n return null;\n }\n\n login = async (\n payload: { email: string; password: string },\n config?: { returnResponse?: boolean }\n ) => {\n const [headers, loginRes] = await serverLogin(\n this.config,\n this.handlers\n )(payload);\n this.headers = headers;\n this.setContext(headers);\n if (config?.returnResponse) {\n return loginRes;\n }\n return undefined; // preserve existing behavior where login returns undefined\n };\n\n session = async (req?: Request | Headers | null | undefined) => {\n if (req instanceof Headers) {\n return this.auth.getSession(req);\n } else if (req instanceof Request) {\n return auth(req, this.config);\n }\n return this.auth.getSession(this.#headers);\n };\n setContext = (req: Request | Headers) => {\n if (req instanceof Headers) {\n asyncSetContext(req);\n } else if (req instanceof Request) {\n asyncSetContext(req.headers);\n }\n\n const { warn } = Logger(this.config, '[API]');\n\n if (warn) {\n warn('Set context expects a Request or Header object');\n }\n };\n}\n","import pg from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport { Api } from './Api';\n\nexport class Server {\n config: Config;\n api: Api;\n private manager!: DbManager;\n\n constructor(config?: ServerConfig) {\n this.config = new Config(config as ServerConfig, '[initial config]');\n this.api = new Api(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 this.api.updateConfig(this.config);\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\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.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.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.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.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): pg.Pool {\n return this.manager.getConnection(this.config);\n }\n\n clearConnections() {\n this.manager.clear(this.config);\n }\n\n /**\n * A convenience function that applies a config and ensures whatever was passed is set properly\n */\n\n getInstance(config: ServerConfig): Server {\n const _config = { ...this.config, ...config };\n\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n this.setConfig(updatedConfig);\n // propagate special config items\n this.tenantId = updatedConfig.tenantId;\n this.userId = updatedConfig.userId;\n // if we have a token, update it, else use the one that was there\n if (updatedConfig.api.token) {\n this.token = updatedConfig.api.token;\n }\n this.databaseId = updatedConfig.databaseId;\n\n return this;\n }\n}\n\nlet server: Server;\nexport async function create(config?: ServerConfig): Promise<Server> {\n if (!server) {\n server = new Server(config);\n }\n if (config) {\n return await server.init(new Config(config));\n }\n return await server.init();\n}\n"]}