@holydeck/cli 2026.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/BrowserWebSocketTransport-H3D6MINS.js +12 -0
  4. package/dist/BrowserWebSocketTransport-H3D6MINS.js.map +1 -0
  5. package/dist/LaunchOptions-42ZS55HH.js +12 -0
  6. package/dist/LaunchOptions-42ZS55HH.js.map +1 -0
  7. package/dist/NodeWebSocketTransport-BXHQGXRM.js +15 -0
  8. package/dist/NodeWebSocketTransport-BXHQGXRM.js.map +1 -0
  9. package/dist/bidi-25S23FWJ.js +18358 -0
  10. package/dist/bidi-25S23FWJ.js.map +1 -0
  11. package/dist/chunk-2BLOYUSF.js +795 -0
  12. package/dist/chunk-2BLOYUSF.js.map +1 -0
  13. package/dist/chunk-43CZTS57.js +38 -0
  14. package/dist/chunk-43CZTS57.js.map +1 -0
  15. package/dist/chunk-DIBLSFAG.js +34 -0
  16. package/dist/chunk-DIBLSFAG.js.map +1 -0
  17. package/dist/chunk-IEJ3OX3N.js +52 -0
  18. package/dist/chunk-IEJ3OX3N.js.map +1 -0
  19. package/dist/chunk-JM4YIWBN.js +3796 -0
  20. package/dist/chunk-JM4YIWBN.js.map +1 -0
  21. package/dist/chunk-NP3DTWF7.js +23282 -0
  22. package/dist/chunk-NP3DTWF7.js.map +1 -0
  23. package/dist/chunk-SWG4X375.js +51 -0
  24. package/dist/chunk-SWG4X375.js.map +1 -0
  25. package/dist/chunk-UC6TFXMD.js +2821 -0
  26. package/dist/chunk-UC6TFXMD.js.map +1 -0
  27. package/dist/chunk-V4BIHFVZ.js +2287 -0
  28. package/dist/chunk-V4BIHFVZ.js.map +1 -0
  29. package/dist/chunk-V77AQPDK.js +20 -0
  30. package/dist/chunk-V77AQPDK.js.map +1 -0
  31. package/dist/chunk-XAENXL52.js +101 -0
  32. package/dist/chunk-XAENXL52.js.map +1 -0
  33. package/dist/cli.js +64101 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/dist-3ZE2HBJQ.js +20447 -0
  36. package/dist/dist-3ZE2HBJQ.js.map +1 -0
  37. package/dist/dist-575AQY5L.js +1161 -0
  38. package/dist/dist-575AQY5L.js.map +1 -0
  39. package/dist/dist-DL5M2SDJ.js +117 -0
  40. package/dist/dist-DL5M2SDJ.js.map +1 -0
  41. package/dist/dist-OMWR53J4.js +4713 -0
  42. package/dist/dist-OMWR53J4.js.map +1 -0
  43. package/dist/dist-UT6HKKCD.js +281 -0
  44. package/dist/dist-UT6HKKCD.js.map +1 -0
  45. package/dist/fs-P6GYHPGZ.js +1685 -0
  46. package/dist/fs-P6GYHPGZ.js.map +1 -0
  47. package/dist/helpers-64DWIL6C.js +21 -0
  48. package/dist/helpers-64DWIL6C.js.map +1 -0
  49. package/dist/main-IQ64YDOJ.js +61 -0
  50. package/dist/main-IQ64YDOJ.js.map +1 -0
  51. package/dist/puppeteer-RDWY6FSG.js +2386 -0
  52. package/dist/puppeteer-RDWY6FSG.js.map +1 -0
  53. package/dist/yargs-KMQWKLG6.js +3264 -0
  54. package/dist/yargs-KMQWKLG6.js.map +1 -0
  55. package/dist/yauzl-7KG7KPPF.js +1355 -0
  56. package/dist/yauzl-7KG7KPPF.js.map +1 -0
  57. package/package.json +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/launch.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/browser-data/chrome-headless-shell.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/browser-data/chrome.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/httpUtil.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/browser-data/types.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/browser-data/chromedriver.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/browser-data/chromium.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/browser-data/firefox.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/browser-data/browser-data.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/Cache.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/debug.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/detectPlatform.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/install.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/DefaultProvider.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/fileUtil.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/ProgressBar.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/CLI.ts","../../../node_modules/.pnpm/@puppeteer+browsers@3.2.2_proxy-agent@8.0.2_yauzl@3.4.0/node_modules/@puppeteer/browsers/src/provider.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport childProcess from 'node:child_process';\nimport {EventEmitter} from 'node:events';\nimport {accessSync} from 'node:fs';\nimport os from 'node:os';\nimport readline from 'node:readline';\nimport type Stream from 'node:stream';\n\nimport {\n type Browser,\n type BrowserPlatform,\n type ChromeReleaseChannel,\n executablePathByBrowser,\n resolveSystemExecutablePaths,\n} from './browser-data/browser-data.js';\nimport {Cache} from './Cache.js';\nimport type {LoggerFunction} from './debug.js';\nimport {debug, DEBUG_PREFIXES, type Logger} from './debug.js';\nimport {detectBrowserPlatform} from './detectPlatform.js';\n\n/**\n * @public\n */\nexport interface ComputeExecutablePathOptions {\n /**\n * Root path to the storage directory.\n *\n * Can be set to `null` if the executable path should be relative\n * to the extracted download location. E.g. `./chrome-linux64/chrome`.\n */\n cacheDir: string | null;\n /**\n * Determines which platform the browser will be suited for.\n *\n * @defaultValue **Auto-detected.**\n */\n platform?: BrowserPlatform;\n /**\n * Determines which browser to launch.\n */\n browser: Browser;\n /**\n * Determines which buildId to download. BuildId should uniquely identify\n * binaries and they are used for caching.\n */\n buildId: string;\n}\n\n/**\n * @public\n */\nexport function computeExecutablePath(\n options: ComputeExecutablePathOptions,\n): string {\n if (options.cacheDir === null) {\n options.platform ??= detectBrowserPlatform();\n if (options.platform === undefined) {\n throw new Error(\n `No platform specified. Couldn't auto-detect browser platform.`,\n );\n }\n return executablePathByBrowser[options.browser](\n options.platform,\n options.buildId,\n );\n }\n\n return new Cache(options.cacheDir).computeExecutablePath(options);\n}\n\n/**\n * @public\n */\nexport interface SystemOptions {\n /**\n * Determines which platform the browser will be suited for.\n *\n * @defaultValue **Auto-detected.**\n */\n platform?: BrowserPlatform;\n /**\n * Determines which browser to launch.\n */\n browser: Browser;\n /**\n * Release channel to look for on the system.\n */\n channel: ChromeReleaseChannel;\n}\n\n/**\n * Returns a path to a system-wide Chrome installation given a release channel\n * name by checking known installation locations (using\n * {@link https://pptr.dev/browsers-api/browsers.computesystemexecutablepath}).\n * If Chrome instance is not found at the expected path, an error is thrown.\n *\n * @public\n */\nexport function computeSystemExecutablePath(\n options: SystemOptions,\n validatePath = true,\n): string {\n options.platform ??= detectBrowserPlatform();\n if (!options.platform) {\n throw new Error(\n `Cannot download a binary for the provided platform: ${os.platform()} (${os.arch()})`,\n );\n }\n const paths = resolveSystemExecutablePaths(\n options.browser,\n options.platform,\n options.channel,\n );\n\n for (const path of paths) {\n try {\n accessSync(path);\n return path;\n } catch {}\n }\n\n if (!validatePath) {\n return paths[0];\n }\n throw new Error(\n `Could not find Google Chrome executable for channel '${options.channel}' at:${paths.map(\n path => {\n return `\\n - ${path}`;\n },\n )}.`,\n );\n}\n\n/**\n * @public\n */\nexport interface LaunchOptions {\n /**\n * Absolute path to the browser's executable.\n */\n executablePath: string;\n /**\n * Configures stdio streams to open two additional streams for automation over\n * those streams instead of WebSocket.\n *\n * @defaultValue `false`.\n */\n pipe?: boolean;\n /**\n * If true, forwards the browser's process stdout and stderr to the Node's\n * process stdout and stderr.\n *\n * @defaultValue `false`.\n */\n dumpio?: boolean;\n /**\n * Additional arguments to pass to the executable when launching.\n */\n args?: string[];\n /**\n * Environment variables to set for the browser process.\n */\n env?: Record<string, string | undefined>;\n /**\n * Handles SIGINT in the Node process and tries to kill the browser process.\n *\n * @defaultValue `true`.\n */\n handleSIGINT?: boolean;\n /**\n * Handles SIGTERM in the Node process and tries to gracefully close the browser\n * process.\n *\n * @defaultValue `true`.\n */\n handleSIGTERM?: boolean;\n /**\n * Handles SIGHUP in the Node process and tries to gracefully close the browser process.\n *\n * @defaultValue `true`.\n */\n handleSIGHUP?: boolean;\n /**\n * Whether to spawn process in the {@link https://nodejs.org/api/child_process.html#optionsdetached | detached}\n * mode.\n *\n * @defaultValue `true` except on Windows.\n */\n detached?: boolean;\n /**\n * A callback to run after the browser process exits or before the process\n * will be closed via the {@link Process.close} call (including when handling\n * signals). The callback is only run once.\n */\n onExit?: () => Promise<void>;\n /**\n * If provided, the process will be killed when the signal is aborted.\n */\n signal?: AbortSignal;\n /**\n * Replace the default internal logger with a custom one.\n */\n logger?: Logger;\n}\n\n/**\n * Launches a browser process according to {@link LaunchOptions}.\n *\n * @public\n */\nexport function launch(opts: LaunchOptions): Process {\n return new Process({\n ...opts,\n logger: opts.logger ?? debug,\n });\n}\n\n/**\n * @public\n */\nexport const CDP_WEBSOCKET_ENDPOINT_REGEX =\n /^DevTools listening on (ws:\\/\\/.*)$/;\n\n/**\n * @public\n */\nexport const WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX =\n /^WebDriver BiDi listening on (ws:\\/\\/.*)$/;\n\ntype EventHandler = (...args: any[]) => void;\nconst processListeners = new Map<string, EventHandler[]>();\nconst dispatchers = {\n exit: (...args: any[]) => {\n processListeners.get('exit')?.forEach(handler => {\n return handler(...args);\n });\n },\n SIGINT: (...args: any[]) => {\n processListeners.get('SIGINT')?.forEach(handler => {\n return handler(...args);\n });\n },\n SIGHUP: (...args: any[]) => {\n processListeners.get('SIGHUP')?.forEach(handler => {\n return handler(...args);\n });\n },\n SIGTERM: (...args: any[]) => {\n processListeners.get('SIGTERM')?.forEach(handler => {\n return handler(...args);\n });\n },\n};\n\nfunction subscribeToProcessEvent(\n event: 'exit' | 'SIGINT' | 'SIGHUP' | 'SIGTERM',\n handler: EventHandler,\n): void {\n const listeners = processListeners.get(event) || [];\n if (listeners.length === 0) {\n process.on(event, dispatchers[event]);\n }\n listeners.push(handler);\n processListeners.set(event, listeners);\n}\n\nfunction unsubscribeFromProcessEvent(\n event: 'exit' | 'SIGINT' | 'SIGHUP' | 'SIGTERM',\n handler: EventHandler,\n): void {\n const listeners = processListeners.get(event) || [];\n const existingListenerIdx = listeners.indexOf(handler);\n if (existingListenerIdx === -1) {\n return;\n }\n listeners.splice(existingListenerIdx, 1);\n processListeners.set(event, listeners);\n if (listeners.length === 0) {\n process.off(event, dispatchers[event]);\n }\n}\n\n/**\n * @public\n */\nexport class Process {\n #executablePath;\n #args: string[];\n #logger?: LoggerFunction;\n #browserProcess: childProcess.ChildProcess;\n #exited = false;\n // The browser process can be closed externally or from the driver process. We\n // need to invoke the hooks only once though but we don't know how many times\n // we will be invoked.\n #hooksRan = false;\n #onExitHook = async () => {};\n #browserProcessExiting: Promise<void>;\n #logs: string[] = [];\n #maxLogLinesSize = 1000;\n #lineEmitter = new EventEmitter();\n #onAbort = (): void => {\n this.kill();\n };\n #signal?: AbortSignal;\n\n constructor(opts: LaunchOptions) {\n this.#executablePath = opts.executablePath;\n this.#args = opts.args ?? [];\n this.#logger = opts.logger?.(DEBUG_PREFIXES.launcher);\n\n this.#signal = opts.signal;\n if (this.#signal?.aborted) {\n throw new Error(\n this.#signal.reason ? this.#signal.reason : 'Launch aborted',\n );\n }\n this.#signal?.addEventListener('abort', this.#onAbort, {once: true});\n\n opts.pipe ??= false;\n opts.dumpio ??= false;\n opts.handleSIGINT ??= true;\n opts.handleSIGTERM ??= true;\n opts.handleSIGHUP ??= true;\n // On non-windows platforms, `detached: true` makes child process a\n // leader of a new process group, making it possible to kill child\n // process tree with `.kill(-pid)` command. @see\n // https://nodejs.org/api/child_process.html#child_process_options_detached\n opts.detached ??= process.platform !== 'win32';\n const stdio = this.#configureStdio({\n pipe: opts.pipe,\n });\n\n const env = opts.env || {};\n\n this.#logger?.(\n `Launching ${this.#executablePath} ${this.#args.join(' ')}`,\n {\n detached: opts.detached,\n env: Object.keys(env).reduce<Record<string, string | undefined>>(\n (res, key) => {\n if (key.toLowerCase().startsWith('puppeteer_')) {\n res[key] = env[key];\n }\n return res;\n },\n {},\n ),\n stdio,\n },\n );\n\n this.#browserProcess = childProcess.spawn(\n this.#executablePath,\n this.#args,\n {\n detached: opts.detached,\n windowsHide: true,\n env,\n stdio,\n },\n );\n this.#recordStream(this.#browserProcess.stderr!);\n this.#recordStream(this.#browserProcess.stdout!);\n\n this.#logger?.(`Launched ${this.#browserProcess.pid}`);\n if (opts.dumpio) {\n this.#browserProcess.stderr?.pipe(process.stderr);\n this.#browserProcess.stdout?.pipe(process.stdout);\n }\n subscribeToProcessEvent('exit', this.#onDriverProcessExit);\n if (opts.handleSIGINT) {\n subscribeToProcessEvent('SIGINT', this.#onDriverProcessSignal);\n }\n if (opts.handleSIGTERM) {\n subscribeToProcessEvent('SIGTERM', this.#onDriverProcessSignal);\n }\n if (opts.handleSIGHUP) {\n subscribeToProcessEvent('SIGHUP', this.#onDriverProcessSignal);\n }\n if (opts.onExit) {\n this.#onExitHook = opts.onExit;\n }\n this.#browserProcessExiting = new Promise((resolve, reject) => {\n this.#browserProcess.once('exit', async () => {\n this.#logger?.(`Browser process ${this.#browserProcess.pid} onExit`);\n this.#clearListeners();\n this.#exited = true;\n try {\n await this.#runHooks();\n } catch (err) {\n reject(err);\n return;\n }\n resolve();\n });\n });\n }\n\n async #runHooks() {\n if (this.#hooksRan) {\n return;\n }\n this.#hooksRan = true;\n await this.#onExitHook();\n }\n\n get nodeProcess(): childProcess.ChildProcess {\n return this.#browserProcess;\n }\n\n #configureStdio(opts: {pipe: boolean}): Array<'ignore' | 'pipe'> {\n if (opts.pipe) {\n return ['pipe', 'pipe', 'pipe', 'pipe', 'pipe'];\n } else {\n return ['pipe', 'pipe', 'pipe'];\n }\n }\n\n #clearListeners(): void {\n unsubscribeFromProcessEvent('exit', this.#onDriverProcessExit);\n unsubscribeFromProcessEvent('SIGINT', this.#onDriverProcessSignal);\n unsubscribeFromProcessEvent('SIGTERM', this.#onDriverProcessSignal);\n unsubscribeFromProcessEvent('SIGHUP', this.#onDriverProcessSignal);\n this.#signal?.removeEventListener('abort', this.#onAbort);\n }\n\n #onDriverProcessExit = (_code: number) => {\n this.kill();\n };\n\n #onDriverProcessSignal = (signal: string): void => {\n switch (signal) {\n case 'SIGINT':\n this.kill();\n process.exit(130);\n case 'SIGTERM':\n case 'SIGHUP':\n void this.close();\n break;\n }\n };\n\n async close(): Promise<void> {\n await this.#runHooks();\n if (!this.#exited) {\n this.kill();\n }\n return await this.#browserProcessExiting;\n }\n\n hasClosed(): Promise<void> {\n return this.#browserProcessExiting;\n }\n\n kill(): void {\n this.#logger?.(`Trying to kill ${this.#browserProcess.pid}`);\n // If the process failed to launch (for example if the browser executable path\n // is invalid), then the process does not get a pid assigned. A call to\n // `proc.kill` would error, as the `pid` to-be-killed can not be found.\n if (\n this.#browserProcess &&\n this.#browserProcess.pid &&\n pidExists(this.#browserProcess.pid)\n ) {\n try {\n this.#logger?.(`Browser process ${this.#browserProcess.pid} exists`);\n if (process.platform === 'win32') {\n try {\n childProcess.execSync(\n `taskkill /pid ${this.#browserProcess.pid} /T /F`,\n );\n } catch (error) {\n this.#logger?.(\n `Killing ${this.#browserProcess.pid} using taskkill failed`,\n error,\n );\n // taskkill can fail to kill the process e.g. due to missing permissions.\n // Let's kill the process via Node API. This delays killing of all child\n // processes of `this.proc` until the main Node.js process dies.\n this.#browserProcess.kill();\n }\n } else {\n // on linux the process group can be killed with the group id prefixed with\n // a minus sign. The process group id is the group leader's pid.\n const processGroupId = -this.#browserProcess.pid;\n\n try {\n process.kill(processGroupId, 'SIGKILL');\n } catch (error) {\n this.#logger?.(\n `Killing ${this.#browserProcess.pid} using process.kill failed`,\n error,\n );\n // Killing the process group can fail due e.g. to missing permissions.\n // Let's kill the process via Node API. This delays killing of all child\n // processes of `this.proc` until the main Node.js process dies.\n this.#browserProcess.kill('SIGKILL');\n }\n }\n } catch (error) {\n throw new Error(\n `${PROCESS_ERROR_EXPLANATION}\\nError cause: ${\n isErrorLike(error) ? error.stack : error\n }`,\n );\n }\n }\n this.#clearListeners();\n }\n\n #recordStream(stream: Stream.Readable): void {\n const rl = readline.createInterface(stream);\n const cleanup = (): void => {\n rl.off('line', onLine);\n rl.off('close', onClose);\n try {\n rl.close();\n } catch {}\n };\n const onLine = (line: string) => {\n if (line.trim() === '') {\n return;\n }\n this.#logs.push(line);\n const delta = this.#logs.length - this.#maxLogLinesSize;\n if (delta) {\n this.#logs.splice(0, delta);\n }\n this.#lineEmitter.emit('line', line);\n };\n const onClose = (): void => {\n cleanup();\n };\n rl.on('line', onLine);\n rl.on('close', onClose);\n }\n\n /**\n * Get recent logs (stderr + stdout) emitted by the browser.\n *\n * @public\n */\n getRecentLogs(): string[] {\n return [...this.#logs];\n }\n\n waitForLineOutput(regex: RegExp, timeout = 0): Promise<string> {\n return new Promise((resolve, reject) => {\n const onClose = (errorOrCode?: Error | number): void => {\n cleanup();\n reject(\n new Error(\n [\n `Failed to launch the browser process: ${\n errorOrCode instanceof Error\n ? ` ${errorOrCode.message}`\n : ` Code: ${errorOrCode}`\n }`,\n '',\n `stderr:`,\n this.getRecentLogs().join('\\n'),\n '',\n 'TROUBLESHOOTING: https://pptr.dev/troubleshooting',\n '',\n ].join('\\n'),\n ),\n );\n };\n\n this.#browserProcess.on('exit', onClose);\n this.#browserProcess.on('error', onClose);\n const timeoutId =\n timeout > 0 ? setTimeout(onTimeout, timeout) : undefined;\n\n this.#lineEmitter.on('line', onLine);\n const cleanup = (): void => {\n clearTimeout(timeoutId);\n this.#lineEmitter.off('line', onLine);\n this.#browserProcess.off('exit', onClose);\n this.#browserProcess.off('error', onClose);\n };\n\n function onTimeout(): void {\n cleanup();\n reject(\n new TimeoutError(\n `Timed out after ${timeout} ms while waiting for the WS endpoint URL to appear in stdout!`,\n ),\n );\n }\n\n for (const line of this.#logs) {\n onLine(line);\n }\n\n function onLine(line: string): void {\n const match = line.match(regex);\n if (!match) {\n return;\n }\n cleanup();\n // The RegExp matches, so this will obviously exist.\n resolve(match[1]!);\n }\n });\n }\n}\n\nconst PROCESS_ERROR_EXPLANATION = `Puppeteer was unable to kill the process which ran the browser binary.\nThis means that, on future Puppeteer launches, Puppeteer might not be able to launch the browser.\nPlease check your open processes and ensure that the browser processes that Puppeteer launched have been killed.\nIf you think this is a bug, please report it on the Puppeteer issue tracker.`;\n\n/**\n * @internal\n */\nfunction pidExists(pid: number): boolean {\n try {\n return process.kill(pid, 0);\n } catch (error) {\n if (isErrnoException(error)) {\n if (error.code && error.code === 'ESRCH') {\n return false;\n }\n }\n throw error;\n }\n}\n\n/**\n * @internal\n */\nexport interface ErrorLike extends Error {\n name: string;\n message: string;\n}\n\n/**\n * @internal\n */\nexport function isErrorLike(obj: unknown): obj is ErrorLike {\n return (\n typeof obj === 'object' && obj !== null && 'name' in obj && 'message' in obj\n );\n}\n/**\n * @internal\n */\nexport function isErrnoException(obj: unknown): obj is NodeJS.ErrnoException {\n return (\n isErrorLike(obj) &&\n ('errno' in obj || 'code' in obj || 'path' in obj || 'syscall' in obj)\n );\n}\n\n/**\n * @public\n */\nexport class TimeoutError extends Error {\n /**\n * @internal\n */\n constructor(message?: string) {\n super(message);\n this.name = this.constructor.name;\n Error.captureStackTrace(this, this.constructor);\n }\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport path from 'node:path';\n\nimport {compareVersions} from './chrome.js';\nimport {BrowserPlatform} from './types.js';\n\nfunction folder(platform: BrowserPlatform, buildId?: string): string {\n switch (platform) {\n case BrowserPlatform.LINUX_ARM:\n if (buildId && compareVersions(buildId, '153.0.8001.0') < 0) {\n return 'linux64';\n }\n return 'linux-arm64';\n case BrowserPlatform.LINUX:\n return 'linux64';\n case BrowserPlatform.MAC_ARM:\n return 'mac-arm64';\n case BrowserPlatform.MAC:\n return 'mac-x64';\n case BrowserPlatform.WIN32:\n return 'win32';\n case BrowserPlatform.WIN64:\n return 'win64';\n }\n}\n\nexport function resolveDownloadUrl(\n platform: BrowserPlatform,\n buildId: string,\n baseUrl = 'https://storage.googleapis.com/chrome-for-testing-public',\n): string {\n return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;\n}\n\nexport function resolveDownloadPath(\n platform: BrowserPlatform,\n buildId: string,\n): string[] {\n return [\n buildId,\n folder(platform, buildId),\n `chrome-headless-shell-${folder(platform, buildId)}.zip`,\n ];\n}\n\nexport function relativeExecutablePath(\n platform: BrowserPlatform,\n buildId: string,\n): string {\n switch (platform) {\n case BrowserPlatform.MAC:\n case BrowserPlatform.MAC_ARM:\n return path.join(\n 'chrome-headless-shell-' + folder(platform, buildId),\n 'chrome-headless-shell',\n );\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return path.join(\n 'chrome-headless-shell-' + folder(platform, buildId),\n 'chrome-headless-shell',\n );\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return path.join(\n 'chrome-headless-shell-' + folder(platform, buildId),\n 'chrome-headless-shell.exe',\n );\n }\n}\n\nexport {resolveBuildId, compareVersions} from './chrome.js';\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {execSync} from 'node:child_process';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport {getJSON} from '../httpUtil.js';\n\nimport {BrowserPlatform, ChromeReleaseChannel} from './types.js';\n\nfunction folder(platform: BrowserPlatform, buildId?: string): string {\n switch (platform) {\n case BrowserPlatform.LINUX_ARM:\n if (buildId && compareVersions(buildId, '153.0.8001.0') < 0) {\n return 'linux64';\n }\n return 'linux-arm64';\n case BrowserPlatform.LINUX:\n return 'linux64';\n case BrowserPlatform.MAC_ARM:\n return 'mac-arm64';\n case BrowserPlatform.MAC:\n return 'mac-x64';\n case BrowserPlatform.WIN32:\n return 'win32';\n case BrowserPlatform.WIN64:\n return 'win64';\n }\n}\n\nexport function resolveDownloadUrl(\n platform: BrowserPlatform,\n buildId: string,\n baseUrl = 'https://storage.googleapis.com/chrome-for-testing-public',\n): string {\n return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;\n}\n\nexport function resolveDownloadPath(\n platform: BrowserPlatform,\n buildId: string,\n): string[] {\n return [\n buildId,\n folder(platform, buildId),\n `chrome-${folder(platform, buildId)}.zip`,\n ];\n}\n\nexport function relativeExecutablePath(\n platform: BrowserPlatform,\n buildId: string,\n): string {\n switch (platform) {\n case BrowserPlatform.MAC:\n case BrowserPlatform.MAC_ARM:\n return path.join(\n 'chrome-' + folder(platform, buildId),\n 'Google Chrome for Testing.app',\n 'Contents',\n 'MacOS',\n 'Google Chrome for Testing',\n );\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return path.join('chrome-' + folder(platform, buildId), 'chrome');\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return path.join('chrome-' + folder(platform, buildId), 'chrome.exe');\n }\n}\n\nlet baseVersionUrl = 'https://googlechromelabs.github.io/chrome-for-testing';\n\nexport function changeBaseVersionUrlForTesting(url: string): void {\n baseVersionUrl = url;\n}\nexport function resetBaseVersionUrlForTesting(): void {\n baseVersionUrl = 'https://googlechromelabs.github.io/chrome-for-testing';\n}\n\nexport async function getLastKnownGoodReleaseForChannel(\n channel: ChromeReleaseChannel,\n): Promise<{version: string; revision: string}> {\n const data = (await getJSON(\n new URL(`${baseVersionUrl}/last-known-good-versions.json`),\n )) as {\n channels: Record<string, {version: string}>;\n };\n\n for (const channel of Object.keys(data.channels)) {\n data.channels[channel.toLowerCase()] = data.channels[channel]!;\n delete data.channels[channel];\n }\n\n return (\n data as {\n channels: Record<\n ChromeReleaseChannel,\n {version: string; revision: string}\n >;\n }\n ).channels[channel];\n}\n\nexport async function getLastKnownGoodReleaseForMilestone(\n milestone: string,\n): Promise<{version: string; revision: string} | undefined> {\n const data = (await getJSON(\n new URL(`${baseVersionUrl}/latest-versions-per-milestone.json`),\n )) as {\n milestones: Record<string, {version: string; revision: string}>;\n };\n return data.milestones[milestone] as\n {version: string; revision: string} | undefined;\n}\n\nexport async function getLastKnownGoodReleaseForBuild(\n /**\n * @example `112.0.23`,\n */\n buildPrefix: string,\n): Promise<{version: string; revision: string} | undefined> {\n const data = (await getJSON(\n new URL(`${baseVersionUrl}/latest-patch-versions-per-build.json`),\n )) as {\n builds: Record<string, {version: string; revision: string}>;\n };\n return data.builds[buildPrefix] as\n {version: string; revision: string} | undefined;\n}\n\nexport async function resolveBuildId(\n channel: ChromeReleaseChannel,\n): Promise<string>;\nexport async function resolveBuildId(\n channel: string,\n): Promise<string | undefined>;\nexport async function resolveBuildId(\n channel: ChromeReleaseChannel | string,\n): Promise<string | undefined> {\n if (\n Object.values(ChromeReleaseChannel).includes(\n channel as ChromeReleaseChannel,\n )\n ) {\n return (\n await getLastKnownGoodReleaseForChannel(channel as ChromeReleaseChannel)\n ).version;\n }\n if (channel.match(/^\\d+$/)) {\n // Potentially a milestone.\n return (await getLastKnownGoodReleaseForMilestone(channel))?.version;\n }\n if (channel.match(/^\\d+\\.\\d+\\.\\d+$/)) {\n // Potentially a build prefix without the patch version.\n return (await getLastKnownGoodReleaseForBuild(channel))?.version;\n }\n return;\n}\nconst WINDOWS_ENV_PARAM_NAMES = [\n 'PROGRAMFILES',\n 'ProgramW6432',\n 'ProgramFiles(x86)',\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/installer/mini_installer/README.md\n 'LOCALAPPDATA',\n];\n\nfunction getChromeWindowsLocation(\n channel: ChromeReleaseChannel,\n locationsPrefixes: Set<string>,\n): [string, ...string[]] {\n if (locationsPrefixes.size === 0) {\n throw new Error('Non of the common Windows Env variables were set');\n }\n\n let suffix: string;\n switch (channel) {\n case ChromeReleaseChannel.STABLE:\n suffix = 'Google\\\\Chrome\\\\Application\\\\chrome.exe';\n break;\n case ChromeReleaseChannel.BETA:\n suffix = 'Google\\\\Chrome Beta\\\\Application\\\\chrome.exe';\n break;\n case ChromeReleaseChannel.CANARY:\n suffix = 'Google\\\\Chrome SxS\\\\Application\\\\chrome.exe';\n break;\n case ChromeReleaseChannel.DEV:\n suffix = 'Google\\\\Chrome Dev\\\\Application\\\\chrome.exe';\n break;\n }\n\n return [...locationsPrefixes.values()].map(l => {\n return path.win32.join(l, suffix);\n }) as [string, ...string[]];\n}\n\nfunction getWslVariable(variable: string): string | undefined {\n try {\n // The Windows env for the paths are not passed down\n // to WSL, so we evoke `cmd.exe` which is usually on the PATH\n // from which the env can be access with all uppercase names.\n // The return value is a Windows Path - `C:\\Program Files`.\n\n const result = execSync(\n `cmd.exe /c echo %${variable.toLocaleUpperCase()}%`,\n {\n // We need to ignore the stderr as cmd.exe\n // prints a message about wrong UNC path not supported.\n stdio: ['ignore', 'pipe', 'ignore'],\n encoding: 'utf-8',\n },\n ).trim();\n if (result) {\n return result;\n }\n } catch {}\n return;\n}\n\nfunction getWslLocation(channel: ChromeReleaseChannel): [string, ...string[]] {\n const wslVersion = execSync('wslinfo --version', {\n stdio: ['ignore', 'pipe', 'ignore'],\n encoding: 'utf-8',\n }).trim();\n if (!wslVersion) {\n throw new Error('Not in WSL or unsupported version of WSL.');\n }\n const wslPrefixes = new Set<string>();\n for (const name of WINDOWS_ENV_PARAM_NAMES) {\n const wslPrefix = getWslVariable(name);\n if (wslPrefix) {\n wslPrefixes.add(wslPrefix);\n }\n }\n const windowsPath = getChromeWindowsLocation(channel, wslPrefixes);\n\n return windowsPath.map(path => {\n // The above command returned the Windows paths `C:\\Program Files\\...\\chrome.exe`\n // Use the `wslpath` utility tool to transform into the mounted disk\n return execSync(`wslpath \"${path}\"`).toString().trim();\n }) as [string, ...string[]];\n}\n\nfunction getChromeLinuxOrWslLocation(\n channel: ChromeReleaseChannel,\n): [string, ...string[]] {\n const locations: string[] = [];\n\n switch (channel) {\n case ChromeReleaseChannel.STABLE:\n locations.push('/opt/google/chrome/chrome');\n break;\n case ChromeReleaseChannel.BETA:\n locations.push('/opt/google/chrome-beta/chrome');\n break;\n case ChromeReleaseChannel.CANARY:\n locations.push('/opt/google/chrome-canary/chrome');\n break;\n case ChromeReleaseChannel.DEV:\n locations.push('/opt/google/chrome-unstable/chrome');\n break;\n }\n\n try {\n const wslPath = getWslLocation(channel);\n if (wslPath) {\n locations.push(...wslPath);\n }\n } catch {\n // Ignore WSL errors\n }\n\n return locations as [string, ...string[]];\n}\n\nexport function resolveSystemExecutablePaths(\n platform: BrowserPlatform,\n channel: ChromeReleaseChannel,\n): [string, ...string[]] {\n switch (platform) {\n case BrowserPlatform.WIN64:\n case BrowserPlatform.WIN32:\n const prefixLocation = new Set<string>(\n WINDOWS_ENV_PARAM_NAMES.map(name => {\n return process.env[name];\n }).filter((l): l is string => {\n return !!l;\n }),\n );\n // Fallbacks in case env vars are misconfigured.\n prefixLocation.add('C:\\\\Program Files');\n prefixLocation.add('C:\\\\Program Files (x86)');\n prefixLocation.add('D:\\\\Program Files');\n prefixLocation.add('D:\\\\Program Files (x86)');\n return getChromeWindowsLocation(channel, prefixLocation);\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n switch (channel) {\n case ChromeReleaseChannel.STABLE:\n return [\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n ];\n case ChromeReleaseChannel.BETA:\n return [\n '/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta',\n ];\n case ChromeReleaseChannel.CANARY:\n return [\n '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',\n ];\n case ChromeReleaseChannel.DEV:\n return [\n '/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev',\n ];\n }\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return getChromeLinuxOrWslLocation(channel);\n }\n}\n\nexport function resolveDefaultUserDataDir(\n platform: BrowserPlatform,\n channel: ChromeReleaseChannel,\n): string {\n switch (platform) {\n case BrowserPlatform.WIN64:\n case BrowserPlatform.WIN32:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/chrome_paths_win.cc;l=42;drc=4c86c7940a47c36b8bf52c134483ef2da86caa62\n switch (channel) {\n case ChromeReleaseChannel.STABLE:\n return path.join(\n getLocalAppDataWin(),\n 'Google',\n 'Chrome',\n 'User Data',\n );\n case ChromeReleaseChannel.BETA:\n return path.join(\n getLocalAppDataWin(),\n 'Google',\n 'Chrome Beta',\n 'User Data',\n );\n case ChromeReleaseChannel.CANARY:\n return path.join(\n getLocalAppDataWin(),\n 'Google',\n 'Chrome SxS',\n 'User Data',\n );\n case ChromeReleaseChannel.DEV:\n return path.join(\n getLocalAppDataWin(),\n 'Google',\n 'Chrome Dev',\n 'User Data',\n );\n }\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/chrome_paths_mac.mm;l=86;drc=4c86c7940a47c36b8bf52c134483ef2da86caa62\n switch (channel) {\n case ChromeReleaseChannel.STABLE:\n return path.join(getBaseUserDataDirPathMac(), 'Chrome');\n case ChromeReleaseChannel.BETA:\n return path.join(getBaseUserDataDirPathMac(), 'Chrome Beta');\n case ChromeReleaseChannel.DEV:\n return path.join(getBaseUserDataDirPathMac(), 'Chrome Dev');\n case ChromeReleaseChannel.CANARY:\n return path.join(getBaseUserDataDirPathMac(), 'Chrome Canary');\n }\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/chrome_paths_linux.cc;l=80;drc=4c86c7940a47c36b8bf52c134483ef2da86caa62\n switch (channel) {\n case ChromeReleaseChannel.STABLE:\n return path.join(getConfigHomeLinux(), 'google-chrome');\n case ChromeReleaseChannel.BETA:\n return path.join(getConfigHomeLinux(), 'google-chrome-beta');\n case ChromeReleaseChannel.CANARY:\n return path.join(getConfigHomeLinux(), 'google-chrome-canary');\n case ChromeReleaseChannel.DEV:\n return path.join(getConfigHomeLinux(), 'google-chrome-unstable');\n }\n }\n}\n\nfunction getLocalAppDataWin() {\n return (\n process.env['LOCALAPPDATA'] || path.join(os.homedir(), 'AppData', 'Local')\n );\n}\n\nfunction getConfigHomeLinux() {\n return (\n process.env['CHROME_CONFIG_HOME'] ||\n process.env['XDG_CONFIG_HOME'] ||\n path.join(os.homedir(), '.config')\n );\n}\n\nfunction getBaseUserDataDirPathMac() {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Google');\n}\n\nexport function compareVersions(a: string, b: string): number {\n const cleanA = a.trim();\n const cleanB = b.trim();\n\n const versionRegex = /^\\d+(?:\\.\\d+){0,3}$/;\n if (!versionRegex.test(cleanA)) {\n throw new Error(`Version ${a} is not a valid Chrome version`);\n }\n if (!versionRegex.test(cleanB)) {\n throw new Error(`Version ${b} is not a valid Chrome version`);\n }\n\n const aParts = cleanA.split('.').map(Number);\n const bParts = cleanB.split('.').map(Number);\n\n for (let i = 0; i < 4; i++) {\n const aPart = aParts[i] ?? 0;\n const bPart = bParts[i] ?? 0;\n\n if (aPart > bPart) {\n return 1;\n }\n if (aPart < bPart) {\n return -1;\n }\n }\n\n return 0;\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {createHash} from 'node:crypto';\nimport {createWriteStream, unlinkSync} from 'node:fs';\nimport * as http from 'node:http';\nimport * as https from 'node:https';\nimport {URL, urlToHttpOptions} from 'node:url';\n\nexport async function headHttpRequest(url: URL): Promise<boolean> {\n return await new Promise(resolve => {\n httpRequest(\n url,\n 'HEAD',\n response => {\n // consume response data free node process\n response.resume();\n resolve(response.statusCode === 200);\n },\n false,\n )\n .then(request => {\n request.on('error', () => {\n resolve(false);\n });\n })\n .catch(() => {\n resolve(false);\n });\n });\n}\n\nexport async function httpRequest(\n url: URL,\n method: string,\n response: (x: http.IncomingMessage) => void,\n keepAlive = true,\n): Promise<http.ClientRequest> {\n let agent: http.Agent | undefined;\n try {\n const {ProxyAgent} = await import('proxy-agent');\n agent = new ProxyAgent();\n } catch {\n // Standard Node.js agents will be used.\n }\n\n const options: http.RequestOptions = {\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port,\n path: url.pathname + url.search,\n method,\n headers: keepAlive ? {Connection: 'keep-alive'} : undefined,\n auth: urlToHttpOptions(url).auth,\n agent,\n };\n\n const requestCallback = (res: http.IncomingMessage): void => {\n if (\n res.statusCode &&\n res.statusCode >= 300 &&\n res.statusCode < 400 &&\n res.headers.location\n ) {\n void httpRequest(new URL(res.headers.location), method, response);\n // consume response data to free up memory\n // And prevents the connection from being kept alive\n res.resume();\n } else {\n response(res);\n }\n };\n const request =\n options.protocol === 'https:'\n ? https.request(options, requestCallback)\n : http.request(options, requestCallback);\n request.end();\n return request;\n}\n\nclass HashVerifier {\n readonly #hash = createHash('sha256');\n\n update(chunk: Buffer): void {\n this.#hash.update(chunk);\n }\n\n verify(url: URL, destinationPath: string, expectedHash: string): void {\n const actualHash = this.#hash.digest('hex');\n if (actualHash !== expectedHash.toLowerCase()) {\n try {\n unlinkSync(destinationPath);\n } catch {}\n throw new Error(\n `Integrity check failed for downloaded browser archive.\\n` +\n ` URL: ${url}\\n` +\n ` Expected: ${expectedHash.toLowerCase()}\\n` +\n ` Actual: ${actualHash}`,\n );\n }\n }\n}\n\n/**\n * @internal\n */\nexport function downloadFile(\n url: URL,\n destinationPath: string,\n progressCallback?: (downloadedBytes: number, totalBytes: number) => void,\n expectedHash?: string,\n): Promise<void> {\n return new Promise<void>(async (resolve, reject) => {\n let downloadedBytes = 0;\n let totalBytes = 0;\n const verifier = expectedHash ? new HashVerifier() : null;\n\n try {\n const request = await httpRequest(url, 'GET', response => {\n if (response.statusCode !== 200) {\n const error = new Error(\n `Download failed: server returned code ${response.statusCode}. URL: ${url}`,\n );\n // consume response data to free up memory\n response.resume();\n reject(error);\n return;\n }\n const file = createWriteStream(destinationPath);\n file.on('close', () => {\n if (verifier && expectedHash) {\n try {\n verifier.verify(url, destinationPath, expectedHash);\n } catch (err) {\n reject(err);\n return;\n }\n }\n return resolve();\n });\n file.on('error', error => {\n return reject(error);\n });\n totalBytes = parseInt(response.headers['content-length']!, 10);\n response.on('data', (chunk: Buffer) => {\n downloadedBytes += chunk.length;\n verifier?.update(chunk);\n if (progressCallback) {\n progressCallback(downloadedBytes, totalBytes);\n }\n });\n response.pipe(file);\n });\n request.on('error', error => {\n return reject(error);\n });\n } catch (error) {\n reject(error);\n }\n });\n}\n\nexport async function getJSON(url: URL): Promise<unknown> {\n const text = await getText(url);\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('Could not parse JSON from ' + url.toString());\n }\n}\n\nexport function getText(url: URL): Promise<string> {\n return new Promise(async (resolve, reject) => {\n try {\n const request = await httpRequest(\n url,\n 'GET',\n response => {\n let data = '';\n if (response.statusCode && response.statusCode >= 400) {\n return reject(new Error(`Got status code ${response.statusCode}`));\n }\n response.on('data', chunk => {\n data += chunk;\n });\n response.on('end', () => {\n try {\n return resolve(String(data));\n } catch {\n return reject(\n new Error(`Failed to read text response from ${url}`),\n );\n }\n });\n },\n false,\n );\n request.on('error', err => {\n reject(err);\n });\n } catch (err) {\n reject(err);\n }\n });\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Supported browsers.\n *\n * @public\n */\nexport enum Browser {\n CHROME = 'chrome',\n CHROMEHEADLESSSHELL = 'chrome-headless-shell',\n CHROMIUM = 'chromium',\n FIREFOX = 'firefox',\n CHROMEDRIVER = 'chromedriver',\n}\n\n/**\n * Platform names used to identify a OS platform x architecture combination in the way\n * that is relevant for the browser download.\n *\n * @public\n */\nexport enum BrowserPlatform {\n LINUX = 'linux',\n LINUX_ARM = 'linux_arm',\n MAC = 'mac',\n MAC_ARM = 'mac_arm',\n WIN32 = 'win32',\n WIN64 = 'win64',\n}\n\n/**\n * Enum describing a release channel for a browser.\n *\n * You can use this in combination with {@link resolveBuildId} to resolve\n * a build ID based on a release channel.\n *\n * @public\n */\nexport enum BrowserTag {\n CANARY = 'canary',\n NIGHTLY = 'nightly',\n BETA = 'beta',\n DEV = 'dev',\n DEVEDITION = 'devedition',\n STABLE = 'stable',\n ESR = 'esr',\n LATEST = 'latest',\n}\n\n/**\n * @public\n */\nexport interface ProfileOptions {\n preferences: Record<string, unknown>;\n path: string;\n}\n\n/**\n * @public\n */\nexport enum ChromeReleaseChannel {\n STABLE = 'stable',\n DEV = 'dev',\n CANARY = 'canary',\n BETA = 'beta',\n}\n\n/**\n * @internal\n */\nexport function verifyChromeReleaseChannel(\n value: unknown,\n): ChromeReleaseChannel {\n if (Object.values(ChromeReleaseChannel).includes(value as any)) {\n return value as ChromeReleaseChannel;\n }\n throw new Error(`Invalid Chrome channel: ${value}`);\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport path from 'node:path';\n\nimport {compareVersions} from './chrome.js';\nimport {BrowserPlatform} from './types.js';\n\nfunction folder(platform: BrowserPlatform, buildId?: string): string {\n switch (platform) {\n case BrowserPlatform.LINUX_ARM:\n if (buildId && compareVersions(buildId, '153.0.8001.0') < 0) {\n return 'linux64';\n }\n return 'linux-arm64';\n case BrowserPlatform.LINUX:\n return 'linux64';\n case BrowserPlatform.MAC_ARM:\n return 'mac-arm64';\n case BrowserPlatform.MAC:\n return 'mac-x64';\n case BrowserPlatform.WIN32:\n return 'win32';\n case BrowserPlatform.WIN64:\n return 'win64';\n }\n}\n\nexport function resolveDownloadUrl(\n platform: BrowserPlatform,\n buildId: string,\n baseUrl = 'https://storage.googleapis.com/chrome-for-testing-public',\n): string {\n return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;\n}\n\nexport function resolveDownloadPath(\n platform: BrowserPlatform,\n buildId: string,\n): string[] {\n return [\n buildId,\n folder(platform, buildId),\n `chromedriver-${folder(platform, buildId)}.zip`,\n ];\n}\n\nexport function relativeExecutablePath(\n platform: BrowserPlatform,\n buildId: string,\n): string {\n switch (platform) {\n case BrowserPlatform.MAC:\n case BrowserPlatform.MAC_ARM:\n return path.join(\n 'chromedriver-' + folder(platform, buildId),\n 'chromedriver',\n );\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return path.join(\n 'chromedriver-' + folder(platform, buildId),\n 'chromedriver',\n );\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return path.join(\n 'chromedriver-' + folder(platform, buildId),\n 'chromedriver.exe',\n );\n }\n}\n\nexport {resolveBuildId, compareVersions} from './chrome.js';\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport path from 'node:path';\n\nimport {getText} from '../httpUtil.js';\n\nimport {BrowserPlatform} from './types.js';\n\nfunction archive(platform: BrowserPlatform, buildId: string): string {\n switch (platform) {\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return 'chrome-linux';\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n return 'chrome-mac';\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n // Windows archive name changed at r591479.\n return parseInt(buildId, 10) > 591479 ? 'chrome-win' : 'chrome-win32';\n }\n}\n\nfunction folder(platform: BrowserPlatform): string {\n switch (platform) {\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return 'Linux_x64';\n case BrowserPlatform.MAC_ARM:\n return 'Mac_Arm';\n case BrowserPlatform.MAC:\n return 'Mac';\n case BrowserPlatform.WIN32:\n return 'Win';\n case BrowserPlatform.WIN64:\n return 'Win_x64';\n }\n}\n\nexport function resolveDownloadUrl(\n platform: BrowserPlatform,\n buildId: string,\n baseUrl = 'https://storage.googleapis.com/chromium-browser-snapshots',\n): string {\n return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;\n}\n\nexport function resolveDownloadPath(\n platform: BrowserPlatform,\n buildId: string,\n): string[] {\n return [folder(platform), buildId, `${archive(platform, buildId)}.zip`];\n}\n\nexport function relativeExecutablePath(\n platform: BrowserPlatform,\n _buildId: string,\n): string {\n switch (platform) {\n case BrowserPlatform.MAC:\n case BrowserPlatform.MAC_ARM:\n return path.join(\n 'chrome-mac',\n 'Chromium.app',\n 'Contents',\n 'MacOS',\n 'Chromium',\n );\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return path.join('chrome-linux', 'chrome');\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return path.join('chrome-win', 'chrome.exe');\n }\n}\nexport async function resolveBuildId(\n platform: BrowserPlatform,\n): Promise<string> {\n return await getText(\n new URL(\n `https://storage.googleapis.com/chromium-browser-snapshots/${folder(\n platform,\n )}/LAST_CHANGE`,\n ),\n );\n}\n\nexport function compareVersions(a: string, b: string): number {\n return Number(a) - Number(b);\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport {getJSON} from '../httpUtil.js';\n\nimport {BrowserPlatform, type ProfileOptions} from './types.js';\n\nfunction getFormat(buildId: string): string {\n const majorVersion = Number(buildId.split('.').shift()!);\n return majorVersion >= 135 ? 'xz' : 'bz2';\n}\n\nfunction archiveNightly(platform: BrowserPlatform, buildId: string): string {\n switch (platform) {\n case BrowserPlatform.LINUX:\n return `firefox-${buildId}.en-US.linux-x86_64.tar.${getFormat(buildId)}`;\n case BrowserPlatform.LINUX_ARM:\n return `firefox-${buildId}.en-US.linux-aarch64.tar.${getFormat(buildId)}`;\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n return `firefox-${buildId}.en-US.mac.dmg`;\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return `firefox-${buildId}.en-US.${platform}.zip`;\n }\n}\n\nfunction archive(platform: BrowserPlatform, buildId: string): string {\n switch (platform) {\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return `firefox-${buildId}.tar.${getFormat(buildId)}`;\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n return `Firefox ${buildId}.dmg`;\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return `Firefox Setup ${buildId}.exe`;\n }\n}\n\nfunction platformName(platform: BrowserPlatform): string {\n switch (platform) {\n case BrowserPlatform.LINUX:\n return `linux-x86_64`;\n case BrowserPlatform.LINUX_ARM:\n return `linux-aarch64`;\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n return `mac`;\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return platform;\n }\n}\n\nfunction parseBuildId(buildId: string): [FirefoxChannel, string] {\n for (const value of Object.values(FirefoxChannel)) {\n if (buildId.startsWith(value + '_')) {\n buildId = buildId.substring(value.length + 1);\n return [value, buildId];\n }\n }\n // Older versions do not have channel as the prefix.«\n return [FirefoxChannel.NIGHTLY, buildId];\n}\n\nexport function resolveDownloadUrl(\n platform: BrowserPlatform,\n buildId: string,\n baseUrl?: string,\n): string {\n const [channel] = parseBuildId(buildId);\n switch (channel) {\n case FirefoxChannel.NIGHTLY:\n baseUrl ??=\n 'https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central';\n break;\n case FirefoxChannel.DEVEDITION:\n baseUrl ??= 'https://archive.mozilla.org/pub/devedition/releases';\n break;\n case FirefoxChannel.BETA:\n case FirefoxChannel.STABLE:\n case FirefoxChannel.ESR:\n baseUrl ??= 'https://archive.mozilla.org/pub/firefox/releases';\n break;\n }\n return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;\n}\n\nexport function resolveDownloadPath(\n platform: BrowserPlatform,\n buildId: string,\n): string[] {\n const [channel, resolvedBuildId] = parseBuildId(buildId);\n switch (channel) {\n case FirefoxChannel.NIGHTLY:\n return [archiveNightly(platform, resolvedBuildId)];\n case FirefoxChannel.DEVEDITION:\n case FirefoxChannel.BETA:\n case FirefoxChannel.STABLE:\n case FirefoxChannel.ESR:\n return [\n resolvedBuildId,\n platformName(platform),\n 'en-US',\n archive(platform, resolvedBuildId),\n ];\n }\n}\n\nexport function relativeExecutablePath(\n platform: BrowserPlatform,\n buildId: string,\n): string {\n const [channel] = parseBuildId(buildId);\n switch (channel) {\n case FirefoxChannel.NIGHTLY:\n switch (platform) {\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n return path.join(\n 'Firefox Nightly.app',\n 'Contents',\n 'MacOS',\n 'firefox',\n );\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return path.join('firefox', 'firefox');\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return path.join('firefox', 'firefox.exe');\n }\n case FirefoxChannel.BETA:\n case FirefoxChannel.DEVEDITION:\n case FirefoxChannel.ESR:\n case FirefoxChannel.STABLE:\n switch (platform) {\n case BrowserPlatform.MAC_ARM:\n case BrowserPlatform.MAC:\n return path.join('Firefox.app', 'Contents', 'MacOS', 'firefox');\n case BrowserPlatform.LINUX_ARM:\n case BrowserPlatform.LINUX:\n return path.join('firefox', 'firefox');\n case BrowserPlatform.WIN32:\n case BrowserPlatform.WIN64:\n return path.join('core', 'firefox.exe');\n }\n }\n}\n\nexport enum FirefoxChannel {\n STABLE = 'stable',\n ESR = 'esr',\n DEVEDITION = 'devedition',\n BETA = 'beta',\n NIGHTLY = 'nightly',\n}\n\nlet baseVersionUrl = 'https://product-details.mozilla.org/1.0';\n\nexport function changeBaseVersionUrlForTesting(url: string): void {\n baseVersionUrl = url;\n}\n\nexport function resetBaseVersionUrlForTesting(): void {\n baseVersionUrl = 'https://product-details.mozilla.org/1.0';\n}\n\nexport async function resolveBuildId(\n channel: FirefoxChannel = FirefoxChannel.NIGHTLY,\n): Promise<string> {\n const channelToVersionKey = {\n [FirefoxChannel.ESR]: 'FIREFOX_ESR',\n [FirefoxChannel.STABLE]: 'LATEST_FIREFOX_VERSION',\n [FirefoxChannel.DEVEDITION]: 'FIREFOX_DEVEDITION',\n [FirefoxChannel.BETA]: 'FIREFOX_DEVEDITION',\n [FirefoxChannel.NIGHTLY]: 'FIREFOX_NIGHTLY',\n };\n const versions = (await getJSON(\n new URL(`${baseVersionUrl}/firefox_versions.json`),\n )) as Record<string, string>;\n const version = versions[channelToVersionKey[channel]];\n if (!version) {\n throw new Error(`Channel ${channel} is not found.`);\n }\n return channel + '_' + version;\n}\n\nexport async function createProfile(options: ProfileOptions): Promise<void> {\n if (!fs.existsSync(options.path)) {\n await fs.promises.mkdir(options.path, {\n recursive: true,\n });\n }\n await syncPreferences({\n preferences: {\n ...defaultProfilePreferences(options.preferences),\n ...options.preferences,\n },\n path: options.path,\n });\n}\n\nfunction defaultProfilePreferences(\n extraPrefs: Record<string, unknown>,\n): Record<string, unknown> {\n const server = 'dummy.test';\n\n const defaultPrefs = {\n // Make sure Shield doesn't hit the network.\n 'app.normandy.api_url': '',\n // Disable Firefox old build background check\n 'app.update.checkInstallTime': false,\n // Disable automatically upgrading Firefox\n 'app.update.disabledForTesting': true,\n\n // Increase the APZ content response timeout to 1 minute\n 'apz.content_response_timeout': 60000,\n\n // Prevent various error message on the console\n // jest-puppeteer asserts that no error message is emitted by the console\n 'browser.contentblocking.features.standard':\n '-tp,tpPrivate,cookieBehavior0,-cryptoTP,-fp',\n\n // Enable the dump function: which sends messages to the system\n // console\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1543115\n 'browser.dom.window.dump.enabled': true,\n // Disable topstories\n 'browser.newtabpage.activity-stream.feeds.system.topstories': false,\n // Always display a blank page\n 'browser.newtabpage.enabled': false,\n // Background thumbnails in particular cause grief: and disabling\n // thumbnails in general cannot hurt\n 'browser.pagethumbnails.capturing_disabled': true,\n\n // Disable safebrowsing components.\n 'browser.safebrowsing.blockedURIs.enabled': false,\n 'browser.safebrowsing.downloads.enabled': false,\n 'browser.safebrowsing.malware.enabled': false,\n 'browser.safebrowsing.phishing.enabled': false,\n\n // Disable updates to search engines.\n 'browser.search.update': false,\n // Do not restore the last open set of tabs if the browser has crashed\n 'browser.sessionstore.resume_from_crash': false,\n // Skip check for default browser on startup\n 'browser.shell.checkDefaultBrowser': false,\n\n // Disable newtabpage\n 'browser.startup.homepage': 'about:blank',\n // Do not redirect user when a milstone upgrade of Firefox is detected\n 'browser.startup.homepage_override.mstone': 'ignore',\n // Start with a blank page about:blank\n 'browser.startup.page': 0,\n\n // Do not allow background tabs to be zombified on Android: otherwise for\n // tests that open additional tabs: the test harness tab itself might get\n // unloaded\n 'browser.tabs.disableBackgroundZombification': false,\n // Do not warn when closing all other open tabs\n 'browser.tabs.warnOnCloseOtherTabs': false,\n // Do not warn when multiple tabs will be opened\n 'browser.tabs.warnOnOpen': false,\n\n // Do not automatically offer translations, as tests do not expect this.\n 'browser.translations.automaticallyPopup': false,\n\n // Disable the UI tour.\n 'browser.uitour.enabled': false,\n // Turn off search suggestions in the location bar so as not to trigger\n // network connections.\n 'browser.urlbar.suggest.searches': false,\n // Disable first run splash page on Windows 10\n 'browser.usedOnWindows10.introURL': '',\n // Do not warn on quitting Firefox\n 'browser.warnOnQuit': false,\n\n // Defensively disable data reporting systems\n 'datareporting.healthreport.documentServerURI': `http://${server}/dummy/healthreport/`,\n 'datareporting.healthreport.logging.consoleEnabled': false,\n 'datareporting.healthreport.service.enabled': false,\n 'datareporting.healthreport.service.firstRun': false,\n 'datareporting.healthreport.uploadEnabled': false,\n\n // Do not show datareporting policy notifications which can interfere with tests\n 'datareporting.policy.dataSubmissionEnabled': false,\n 'datareporting.policy.dataSubmissionPolicyBypassNotification': true,\n\n // DevTools JSONViewer sometimes fails to load dependencies with its require.js.\n // This doesn't affect Puppeteer but spams console (Bug 1424372)\n 'devtools.jsonview.enabled': false,\n\n // Disable popup-blocker\n 'dom.disable_open_during_load': false,\n\n // Enable the support for File object creation in the content process\n // Required for |Page.setFileInputFiles| protocol method.\n 'dom.file.createInChild': true,\n\n // Disable the ProcessHangMonitor\n 'dom.ipc.reportProcessHangs': false,\n\n // Disable slow script dialogues\n 'dom.max_chrome_script_run_time': 0,\n 'dom.max_script_run_time': 0,\n\n // Only load extensions from the application and user profile\n // AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION\n 'extensions.autoDisableScopes': 0,\n 'extensions.enabledScopes': 5,\n\n // Disable metadata caching for installed add-ons by default\n 'extensions.getAddons.cache.enabled': false,\n\n // Disable installing any distribution extensions or add-ons.\n 'extensions.installDistroAddons': false,\n\n // Turn off extension updates so they do not bother tests\n 'extensions.update.enabled': false,\n\n // Turn off extension updates so they do not bother tests\n 'extensions.update.notifyUser': false,\n\n // Make sure opening about:addons will not hit the network\n 'extensions.webservice.discoverURL': `http://${server}/dummy/discoveryURL`,\n\n // Allow the application to have focus even it runs in the background\n 'focusmanager.testmode': true,\n\n // Disable useragent updates\n 'general.useragent.updates.enabled': false,\n\n // Always use network provider for geolocation tests so we bypass the\n // macOS dialog raised by the corelocation provider\n 'geo.provider.testing': true,\n\n // Do not scan Wifi\n 'geo.wifi.scan': false,\n\n // No hang monitor\n 'hangmonitor.timeout': 0,\n\n // Show chrome errors and warnings in the error console\n 'javascript.options.showInConsole': true,\n\n // Disable download and usage of OpenH264: and Widevine plugins\n 'media.gmp-manager.updateEnabled': false,\n\n // Disable the GFX sanity window\n 'media.sanity-test.disabled': true,\n\n // Disable experimental feature that is only available in Nightly\n 'network.cookie.sameSite.laxByDefault': false,\n\n // Do not prompt for temporary redirects\n 'network.http.prompt-temp-redirect': false,\n\n // Disable speculative connections so they are not reported as leaking\n // when they are hanging around\n 'network.http.speculative-parallel-limit': 0,\n\n // Do not automatically switch between offline and online\n 'network.manage-offline-status': false,\n\n // Make sure SNTP requests do not hit the network\n 'network.sntp.pools': server,\n\n // Disable Flash.\n 'plugin.state.flash': 0,\n\n 'privacy.trackingprotection.enabled': false,\n\n // Until Bug 1999693 is resolved, this preference needs to be set to allow\n // Webdriver BiDi to automatically dismiss file pickers.\n 'remote.bidi.dismiss_file_pickers.enabled': true,\n\n // Disabled screenshots component\n 'screenshots.browser.component.enabled': false,\n\n // Don't do network connections for mitm priming\n 'security.certerrors.mitm.priming.enabled': false,\n\n // Local documents have access to all other local documents,\n // including directory listings\n 'security.fileuri.strict_origin_policy': false,\n\n // Do not wait for the notification button security delay\n 'security.notification_enable_delay': 0,\n\n // Ensure remote settings do not hit the network\n 'services.settings.server': 'data:,#remote-settings-dummy/v1',\n\n // Do not automatically fill sign-in forms with known usernames and\n // passwords\n 'signon.autofillForms': false,\n\n // Disable password capture, so that tests that include forms are not\n // influenced by the presence of the persistent doorhanger notification\n 'signon.rememberSignons': false,\n\n // Disable first-run welcome page\n 'startup.homepage_welcome_url': 'about:blank',\n\n // Disable first-run welcome page\n 'startup.homepage_welcome_url.additional': '',\n\n // Disable browser animations (tabs, fullscreen, sliding alerts)\n 'toolkit.cosmeticAnimations.enabled': false,\n\n // Prevent starting into safe mode after application crashes\n 'toolkit.startup.max_resumed_crashes': -1,\n };\n\n return Object.assign(defaultPrefs, extraPrefs);\n}\n\nasync function backupFile(input: string): Promise<void> {\n if (!fs.existsSync(input)) {\n return;\n }\n await fs.promises.copyFile(input, input + '.puppeteer');\n}\n\n/**\n * Populates the user.js file with custom preferences as needed to allow\n * Firefox's support to properly function. These preferences will be\n * automatically copied over to prefs.js during startup of Firefox. To be\n * able to restore the original values of preferences a backup of prefs.js\n * will be created.\n */\nasync function syncPreferences(options: ProfileOptions): Promise<void> {\n const prefsPath = path.join(options.path, 'prefs.js');\n const userPath = path.join(options.path, 'user.js');\n\n const lines = Object.entries(options.preferences).map(([key, value]) => {\n return `user_pref(${JSON.stringify(key)}, ${JSON.stringify(value)});`;\n });\n\n // Use allSettled to prevent corruption.\n const result = await Promise.allSettled([\n backupFile(userPath).then(async () => {\n await fs.promises.writeFile(userPath, lines.join('\\n'));\n }),\n backupFile(prefsPath),\n ]);\n for (const command of result) {\n if (command.status === 'rejected') {\n throw command.reason;\n }\n }\n}\n\nexport function compareVersions(a: string, b: string): number {\n // TODO: this is a not very reliable check.\n return parseInt(a.replace('.', ''), 16) - parseInt(b.replace('.', ''), 16);\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as chromeHeadlessShell from './chrome-headless-shell.js';\nimport * as chrome from './chrome.js';\nimport * as chromedriver from './chromedriver.js';\nimport * as chromium from './chromium.js';\nimport * as firefox from './firefox.js';\nimport {\n Browser,\n BrowserPlatform,\n BrowserTag,\n ChromeReleaseChannel,\n verifyChromeReleaseChannel,\n type ProfileOptions,\n} from './types.js';\n\nexport type {ProfileOptions};\n\nexport const downloadUrls = {\n [Browser.CHROMEDRIVER]: chromedriver.resolveDownloadUrl,\n [Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.resolveDownloadUrl,\n [Browser.CHROME]: chrome.resolveDownloadUrl,\n [Browser.CHROMIUM]: chromium.resolveDownloadUrl,\n [Browser.FIREFOX]: firefox.resolveDownloadUrl,\n};\n\nexport const downloadPaths = {\n [Browser.CHROMEDRIVER]: chromedriver.resolveDownloadPath,\n [Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.resolveDownloadPath,\n [Browser.CHROME]: chrome.resolveDownloadPath,\n [Browser.CHROMIUM]: chromium.resolveDownloadPath,\n [Browser.FIREFOX]: firefox.resolveDownloadPath,\n};\n\nexport const executablePathByBrowser = {\n [Browser.CHROMEDRIVER]: chromedriver.relativeExecutablePath,\n [Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.relativeExecutablePath,\n [Browser.CHROME]: chrome.relativeExecutablePath,\n [Browser.CHROMIUM]: chromium.relativeExecutablePath,\n [Browser.FIREFOX]: firefox.relativeExecutablePath,\n};\n\nexport const versionComparators = {\n [Browser.CHROMEDRIVER]: chromedriver.compareVersions,\n [Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.compareVersions,\n [Browser.CHROME]: chrome.compareVersions,\n [Browser.CHROMIUM]: chromium.compareVersions,\n [Browser.FIREFOX]: firefox.compareVersions,\n};\n\nexport {\n Browser,\n BrowserPlatform,\n ChromeReleaseChannel,\n verifyChromeReleaseChannel,\n};\n\n/**\n * @internal\n */\nasync function resolveBuildIdForBrowserTag(\n browser: Browser,\n platform: BrowserPlatform,\n tag: BrowserTag,\n): Promise<string> {\n switch (browser) {\n case Browser.FIREFOX:\n switch (tag) {\n case BrowserTag.LATEST:\n return await firefox.resolveBuildId(firefox.FirefoxChannel.NIGHTLY);\n case BrowserTag.BETA:\n return await firefox.resolveBuildId(firefox.FirefoxChannel.BETA);\n case BrowserTag.NIGHTLY:\n return await firefox.resolveBuildId(firefox.FirefoxChannel.NIGHTLY);\n case BrowserTag.DEVEDITION:\n return await firefox.resolveBuildId(\n firefox.FirefoxChannel.DEVEDITION,\n );\n case BrowserTag.STABLE:\n return await firefox.resolveBuildId(firefox.FirefoxChannel.STABLE);\n case BrowserTag.ESR:\n return await firefox.resolveBuildId(firefox.FirefoxChannel.ESR);\n case BrowserTag.CANARY:\n case BrowserTag.DEV:\n throw new Error(`${tag.toUpperCase()} is not available for Firefox`);\n }\n case Browser.CHROME: {\n switch (tag) {\n case BrowserTag.LATEST:\n return await chrome.resolveBuildId(ChromeReleaseChannel.CANARY);\n case BrowserTag.BETA:\n return await chrome.resolveBuildId(ChromeReleaseChannel.BETA);\n case BrowserTag.CANARY:\n return await chrome.resolveBuildId(ChromeReleaseChannel.CANARY);\n case BrowserTag.DEV:\n return await chrome.resolveBuildId(ChromeReleaseChannel.DEV);\n case BrowserTag.STABLE:\n return await chrome.resolveBuildId(ChromeReleaseChannel.STABLE);\n case BrowserTag.NIGHTLY:\n case BrowserTag.DEVEDITION:\n case BrowserTag.ESR:\n throw new Error(`${tag.toUpperCase()} is not available for Chrome`);\n }\n }\n case Browser.CHROMEDRIVER: {\n switch (tag) {\n case BrowserTag.LATEST:\n case BrowserTag.CANARY:\n return await chromedriver.resolveBuildId(ChromeReleaseChannel.CANARY);\n case BrowserTag.BETA:\n return await chromedriver.resolveBuildId(ChromeReleaseChannel.BETA);\n case BrowserTag.DEV:\n return await chromedriver.resolveBuildId(ChromeReleaseChannel.DEV);\n case BrowserTag.STABLE:\n return await chromedriver.resolveBuildId(ChromeReleaseChannel.STABLE);\n case BrowserTag.NIGHTLY:\n case BrowserTag.DEVEDITION:\n case BrowserTag.ESR:\n throw new Error(\n `${tag.toUpperCase()} is not available for ChromeDriver`,\n );\n }\n }\n case Browser.CHROMEHEADLESSSHELL: {\n switch (tag) {\n case BrowserTag.LATEST:\n case BrowserTag.CANARY:\n return await chromeHeadlessShell.resolveBuildId(\n ChromeReleaseChannel.CANARY,\n );\n case BrowserTag.BETA:\n return await chromeHeadlessShell.resolveBuildId(\n ChromeReleaseChannel.BETA,\n );\n case BrowserTag.DEV:\n return await chromeHeadlessShell.resolveBuildId(\n ChromeReleaseChannel.DEV,\n );\n case BrowserTag.STABLE:\n return await chromeHeadlessShell.resolveBuildId(\n ChromeReleaseChannel.STABLE,\n );\n case BrowserTag.NIGHTLY:\n case BrowserTag.DEVEDITION:\n case BrowserTag.ESR:\n throw new Error(`${tag} is not available for chrome-headless-shell`);\n }\n }\n case Browser.CHROMIUM:\n switch (tag) {\n case BrowserTag.LATEST:\n return await chromium.resolveBuildId(platform);\n case BrowserTag.NIGHTLY:\n case BrowserTag.CANARY:\n case BrowserTag.DEV:\n case BrowserTag.DEVEDITION:\n case BrowserTag.BETA:\n case BrowserTag.STABLE:\n case BrowserTag.ESR:\n throw new Error(\n `${tag} is not supported for Chromium. Use 'latest' instead.`,\n );\n }\n }\n}\n\n/**\n * @public\n */\nexport async function resolveBuildId(\n browser: Browser,\n platform: BrowserPlatform,\n tag: string | BrowserTag,\n): Promise<string> {\n const browserTag = tag as BrowserTag;\n if (Object.values(BrowserTag).includes(browserTag)) {\n return await resolveBuildIdForBrowserTag(browser, platform, browserTag);\n }\n\n switch (browser) {\n case Browser.FIREFOX:\n return tag;\n case Browser.CHROME:\n const chromeResult = await chrome.resolveBuildId(tag);\n if (chromeResult) {\n return chromeResult;\n }\n return tag;\n case Browser.CHROMEDRIVER:\n const chromeDriverResult = await chromedriver.resolveBuildId(tag);\n if (chromeDriverResult) {\n return chromeDriverResult;\n }\n return tag;\n case Browser.CHROMEHEADLESSSHELL:\n const chromeHeadlessShellResult =\n await chromeHeadlessShell.resolveBuildId(tag);\n if (chromeHeadlessShellResult) {\n return chromeHeadlessShellResult;\n }\n return tag;\n case Browser.CHROMIUM:\n return tag;\n }\n}\n\n/**\n * @public\n */\nexport async function createProfile(\n browser: Browser,\n opts: ProfileOptions,\n): Promise<void> {\n switch (browser) {\n case Browser.FIREFOX:\n return await firefox.createProfile(opts);\n case Browser.CHROME:\n case Browser.CHROMIUM:\n throw new Error(`Profile creation is not support for ${browser} yet`);\n }\n}\n\n/**\n * @public\n *\n * Gets the first resolved system path\n */\nexport function resolveSystemExecutablePath(\n browser: Browser,\n platform: BrowserPlatform,\n channel: ChromeReleaseChannel,\n): string {\n switch (browser) {\n case Browser.CHROMEDRIVER:\n case Browser.CHROMEHEADLESSSHELL:\n case Browser.FIREFOX:\n case Browser.CHROMIUM:\n throw new Error(\n `System browser detection is not supported for ${browser} yet.`,\n );\n case Browser.CHROME:\n return chrome.resolveSystemExecutablePaths(platform, channel)[0];\n }\n}\n\n/**\n * Returns the expected default user data dir for the given channel. It does not\n * check if the dir actually exists.\n *\n * @public\n */\nexport function resolveDefaultUserDataDir(\n browser: Browser,\n platform: BrowserPlatform,\n channel: ChromeReleaseChannel,\n): string {\n switch (browser) {\n case Browser.CHROMEDRIVER:\n case Browser.CHROMEHEADLESSSHELL:\n case Browser.FIREFOX:\n case Browser.CHROMIUM:\n throw new Error(\n `Default user dir detection is not supported for ${browser} yet.`,\n );\n case Browser.CHROME:\n return chrome.resolveDefaultUserDataDir(platform, channel);\n }\n}\n\n/**\n * @internal\n *\n * Returns multiple paths where the executable may be located at on the current system\n * ordered by likelihood (based on heuristics).\n */\nexport function resolveSystemExecutablePaths(\n browser: Browser,\n platform: BrowserPlatform,\n channel: ChromeReleaseChannel,\n): [string, ...string[]] {\n switch (browser) {\n case Browser.CHROMEDRIVER:\n case Browser.CHROMEHEADLESSSHELL:\n case Browser.FIREFOX:\n case Browser.CHROMIUM:\n throw new Error(\n `System browser detection is not supported for ${browser} yet.`,\n );\n case Browser.CHROME:\n return chrome.resolveSystemExecutablePaths(platform, channel);\n }\n}\n\n/**\n * Returns a version comparator for the given browser that can be used to sort\n * browser versions.\n *\n * @public\n */\nexport function getVersionComparator(\n browser: Browser,\n): (a: string, b: string) => number {\n return versionComparators[browser];\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport {\n Browser,\n type BrowserPlatform,\n executablePathByBrowser,\n getVersionComparator,\n} from './browser-data/browser-data.js';\nimport {DEBUG_PREFIXES, type Logger} from './debug.js';\nimport {detectBrowserPlatform} from './detectPlatform.js';\n\n/**\n * @public\n */\nexport class InstalledBrowser {\n browser: Browser;\n buildId: string;\n platform: BrowserPlatform;\n readonly executablePath: string;\n\n #cache: Cache;\n\n /**\n * @internal\n */\n constructor(\n cache: Cache,\n browser: Browser,\n buildId: string,\n platform: BrowserPlatform,\n ) {\n this.#cache = cache;\n this.browser = browser;\n this.buildId = buildId;\n this.platform = platform;\n this.executablePath = cache.computeExecutablePath({\n browser,\n buildId,\n platform,\n });\n }\n\n /**\n * Path to the root of the installation folder. Use\n * {@link computeExecutablePath} to get the path to the executable binary.\n */\n get path(): string {\n return this.#cache.installationDir(\n this.browser,\n this.platform,\n this.buildId,\n );\n }\n\n readMetadata(): Metadata {\n return this.#cache.readMetadata(this.browser);\n }\n\n writeMetadata(metadata: Metadata): void {\n this.#cache.writeMetadata(this.browser, metadata);\n }\n}\n\n/**\n * @internal\n */\nexport interface ComputeExecutablePathOptions {\n /**\n * Determines which platform the browser will be suited for.\n *\n * @defaultValue **Auto-detected.**\n */\n platform?: BrowserPlatform;\n /**\n * Determines which browser to launch.\n */\n browser: Browser;\n /**\n * Determines which buildId to download. BuildId should uniquely identify\n * binaries and they are used for caching.\n */\n buildId: string;\n}\n\n/**\n * @public\n */\nexport interface Metadata {\n // Maps an alias (canary/latest/dev/etc.) to a buildId.\n aliases: Record<string, string>;\n // Maps installation key (platform-buildId) to executable path.\n executablePaths?: Record<string, string>;\n}\n\n/**\n * The cache used by Puppeteer relies on the following structure:\n *\n * - rootDir\n * -- <browser1> | browserRoot(browser1)\n * ---- <platform>-<buildId> | installationDir()\n * ------ the browser-platform-buildId\n * ------ specific structure.\n * -- <browser2> | browserRoot(browser2)\n * ---- <platform>-<buildId> | installationDir()\n * ------ the browser-platform-buildId\n * ------ specific structure.\n * @internal\n */\nexport class Cache {\n #rootDir: string;\n #logger?: (message: string, ...args: unknown[]) => void;\n\n constructor(rootDir: string, logger?: Logger) {\n this.#rootDir = rootDir;\n this.#logger = logger?.(DEBUG_PREFIXES.cache);\n }\n\n /**\n * @internal\n */\n get rootDir(): string {\n return this.#rootDir;\n }\n\n browserRoot(browser: Browser): string {\n return path.join(this.#rootDir, browser);\n }\n\n metadataFile(browser: Browser): string {\n return path.join(this.browserRoot(browser), '.metadata');\n }\n\n readMetadata(browser: Browser): Metadata {\n const metatadaPath = this.metadataFile(browser);\n if (!fs.existsSync(metatadaPath)) {\n return {aliases: {}};\n }\n // TODO: add type-safe parsing.\n const data = JSON.parse(fs.readFileSync(metatadaPath, 'utf8'));\n if (typeof data !== 'object') {\n throw new Error('.metadata is not an object');\n }\n return data;\n }\n\n writeMetadata(browser: Browser, metadata: Metadata): void {\n const metatadaPath = this.metadataFile(browser);\n fs.mkdirSync(path.dirname(metatadaPath), {recursive: true});\n fs.writeFileSync(metatadaPath, JSON.stringify(metadata, null, 2));\n }\n\n readExecutablePath(\n browser: Browser,\n platform: BrowserPlatform,\n buildId: string,\n ): string | null {\n const metadata = this.readMetadata(browser);\n const key = `${platform}-${buildId}`;\n return metadata.executablePaths?.[key] ?? null;\n }\n\n writeExecutablePath(\n browser: Browser,\n platform: BrowserPlatform,\n buildId: string,\n executablePath: string,\n ): void {\n const metadata = this.readMetadata(browser);\n if (!metadata.executablePaths) {\n metadata.executablePaths = {};\n }\n const key = `${platform}-${buildId}`;\n metadata.executablePaths[key] = executablePath;\n this.writeMetadata(browser, metadata);\n }\n\n resolveAlias(browser: Browser, alias: string): string | undefined {\n const metadata = this.readMetadata(browser);\n if (alias === 'latest') {\n return Object.values(metadata.aliases || {})\n .sort(getVersionComparator(browser))\n .at(-1);\n }\n return metadata.aliases[alias];\n }\n\n installationDir(\n browser: Browser,\n platform: BrowserPlatform,\n buildId: string,\n ): string {\n return path.join(this.browserRoot(browser), `${platform}-${buildId}`);\n }\n\n clear(): void {\n fs.rmSync(this.#rootDir, {\n force: true,\n recursive: true,\n maxRetries: 10,\n retryDelay: 500,\n });\n }\n\n uninstall(\n browser: Browser,\n platform: BrowserPlatform,\n buildId: string,\n ): void {\n const metadata = this.readMetadata(browser);\n for (const alias of Object.keys(metadata.aliases)) {\n if (metadata.aliases[alias] === buildId) {\n delete metadata.aliases[alias];\n }\n }\n // Clean up executable path entry\n const key = `${platform}-${buildId}`;\n if (metadata.executablePaths?.[key]) {\n delete metadata.executablePaths[key];\n this.writeMetadata(browser, metadata);\n }\n fs.rmSync(this.installationDir(browser, platform, buildId), {\n force: true,\n recursive: true,\n maxRetries: 10,\n retryDelay: 500,\n });\n }\n\n getInstalledBrowsers(): InstalledBrowser[] {\n if (!fs.existsSync(this.#rootDir)) {\n return [];\n }\n const types = fs.readdirSync(this.#rootDir);\n const browsers = types.filter((t): t is Browser => {\n return (Object.values(Browser) as string[]).includes(t);\n });\n return browsers.flatMap(browser => {\n const files = fs.readdirSync(this.browserRoot(browser));\n return files\n .map(file => {\n const result = parseFolderPath(\n path.join(this.browserRoot(browser), file),\n );\n if (!result) {\n return null;\n }\n return new InstalledBrowser(\n this,\n browser,\n result.buildId,\n result.platform as BrowserPlatform,\n );\n })\n .filter((item: InstalledBrowser | null): item is InstalledBrowser => {\n return item !== null;\n });\n });\n }\n\n computeExecutablePath(options: ComputeExecutablePathOptions): string {\n options.platform ??= detectBrowserPlatform();\n if (!options.platform) {\n throw new Error(\n `Cannot download a binary for the provided platform: ${os.platform()} (${os.arch()})`,\n );\n }\n try {\n options.buildId =\n this.resolveAlias(options.browser, options.buildId) ?? options.buildId;\n } catch {\n this.#logger?.('could not read .metadata file for the browser');\n }\n const installationDir = this.installationDir(\n options.browser,\n options.platform,\n options.buildId,\n );\n\n const storedExecutablePath = this.readExecutablePath(\n options.browser,\n options.platform,\n options.buildId,\n );\n if (storedExecutablePath) {\n // The metadata contains a resolved relative path from the installation dir\n return path.join(installationDir, storedExecutablePath);\n }\n\n return path.join(\n installationDir,\n executablePathByBrowser[options.browser](\n options.platform,\n options.buildId,\n ),\n );\n }\n}\n\nfunction parseFolderPath(\n folderPath: string,\n): {platform: string; buildId: string} | undefined {\n const name = path.basename(folderPath);\n const splits = name.split('-');\n if (splits.length !== 2) {\n return;\n }\n const [platform, buildId] = splits;\n if (!buildId || !platform) {\n return;\n }\n return {platform, buildId};\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {debuglog} from 'node:util';\n\nexport const DEBUG_PREFIXES = {\n cache: 'puppeteer:browsers:cache',\n fileUtil: 'puppeteer:browsers:fileUtil',\n install: 'puppeteer:browsers:install',\n launcher: 'puppeteer:browsers:launcher',\n} as const;\n\nexport type LoggerFunction = (...args: unknown[]) => void;\nexport type Logger = (prefix: string) => LoggerFunction | undefined;\n\nexport const debug = (prefix: string): LoggerFunction | undefined => {\n const log = debuglog(prefix);\n return log.enabled ? (log as unknown as LoggerFunction) : undefined;\n};\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport os from 'node:os';\n\nimport {BrowserPlatform} from './browser-data/browser-data.js';\n\n/**\n * @public\n */\nexport function detectBrowserPlatform(): BrowserPlatform | undefined {\n const platform = os.platform();\n const arch = os.arch();\n switch (platform) {\n case 'darwin':\n return arch === 'arm64' ? BrowserPlatform.MAC_ARM : BrowserPlatform.MAC;\n case 'linux':\n return arch === 'arm64'\n ? BrowserPlatform.LINUX_ARM\n : BrowserPlatform.LINUX;\n case 'win32':\n return arch === 'x64' ||\n // Windows 11 for ARM supports x64 emulation\n (arch === 'arm64' && isWindows11(os.release()))\n ? BrowserPlatform.WIN64\n : BrowserPlatform.WIN32;\n default:\n return undefined;\n }\n}\n\n/**\n * Windows 11 is identified by the version 10.0.22000 or greater\n * @internal\n */\nfunction isWindows11(version: string): boolean {\n const parts = version.split('.');\n if (parts.length > 2) {\n const major = parseInt(parts[0] as string, 10);\n const minor = parseInt(parts[1] as string, 10);\n const patch = parseInt(parts[2] as string, 10);\n return (\n major > 10 ||\n (major === 10 && minor > 0) ||\n (major === 10 && minor === 0 && patch >= 22000)\n );\n }\n return false;\n}\n","/**\n * @license\n * Copyright 2017 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport assert from 'node:assert';\nimport {spawnSync} from 'node:child_process';\nimport {existsSync, readFileSync} from 'node:fs';\nimport {mkdir, unlink} from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport {\n Browser,\n BrowserPlatform,\n downloadUrls,\n} from './browser-data/browser-data.js';\nimport {Cache, InstalledBrowser} from './Cache.js';\nimport {debug, DEBUG_PREFIXES, type Logger} from './debug.js';\nimport {DefaultProvider} from './DefaultProvider.js';\nimport {detectBrowserPlatform} from './detectPlatform.js';\nimport {unpackArchive} from './fileUtil.js';\nimport {downloadFile, headHttpRequest} from './httpUtil.js';\nimport {ProgressBar} from './ProgressBar.js';\nimport type {BrowserProvider} from './provider.js';\n\nconst times = new Map<string, [number, number]>();\nfunction debugTime(label: string) {\n times.set(label, process.hrtime());\n}\n\nfunction debugTimeEnd(label: string, logger?: Logger) {\n const end = process.hrtime();\n const start = times.get(label);\n if (!start) {\n return;\n }\n const duration =\n end[0] * 1000 + end[1] / 1e6 - (start[0] * 1000 + start[1] / 1e6); // calculate duration in milliseconds\n logger?.(DEBUG_PREFIXES.install)?.(`Duration for ${label}: ${duration}ms`);\n}\n\n/**\n * @public\n */\nexport interface InstallOptions {\n /**\n * Determines the path to download browsers to.\n */\n cacheDir: string;\n /**\n * Determines which platform the browser will be suited for.\n *\n * @defaultValue **Auto-detected.**\n */\n platform?: BrowserPlatform;\n /**\n * Determines which browser to install.\n */\n browser: Browser;\n /**\n * Determines which buildId to download. BuildId should uniquely identify\n * binaries and they are used for caching.\n */\n buildId: string;\n /**\n * An alias for the provided `buildId`. It will be used to maintain local\n * metadata to support aliases in the `launch` command.\n *\n * @example 'canary'\n */\n buildIdAlias?: string;\n /**\n * Provides information about the progress of the download. If set to\n * 'default', the default callback implementing a progress bar will be\n * used.\n */\n downloadProgressCallback?:\n 'default' | ((downloadedBytes: number, totalBytes: number) => void);\n /**\n * Determines the host that will be used for downloading.\n *\n * @defaultValue Either\n *\n * - https://storage.googleapis.com/chrome-for-testing-public or\n * - https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central\n *\n */\n baseUrl?: string;\n /**\n * Whether to unpack and install browser archives.\n *\n * @defaultValue `true`\n */\n unpack?: boolean;\n /**\n * @internal\n * @defaultValue `false`\n */\n forceFallbackForTesting?: boolean;\n\n /**\n * Whether to attempt to install system-level dependencies required\n * for the browser.\n *\n * Only supported for Chrome on Debian or Ubuntu.\n * Requires system-level privileges to run `apt-get`.\n *\n * @defaultValue `false`\n */\n installDeps?: boolean;\n /**\n * Expected SHA-256 checksum (lowercase hex) of the downloaded browser archive.\n * If provided, installation will fail when the downloaded file does not match.\n * If omitted, the download proceeds without integrity verification.\n */\n expectedHash?: string;\n\n /**\n * Custom provider implementation for alternative download sources.\n *\n * If not provided, uses the default provider.\n * Multiple providers can be chained - they will be tried in order.\n * The default provider is automatically added as the final fallback.\n *\n * ⚠️ **IMPORTANT**: Custom providers are NOT officially supported by\n * Puppeteer.\n *\n * By using custom providers, you accept full responsibility for:\n *\n * - **Version compatibility**: Different platforms may receive different\n * binary versions\n * - **Archive compatibility**: Binary structure must match Puppeteer's expectations\n * - **Feature integration**: Browser launch and other Puppeteer features may not work\n * - **Testing**: You must validate that downloaded binaries work with Puppeteer\n *\n * **Puppeteer only tests and guarantees compatibility with default binaries.**\n *\n * @example\n *\n * ```typescript\n * import {ElectronProvider} from './puppeteer-browser-provider-electron.js';\n *\n * await install({\n * browser: Browser.CHROMEDRIVER,\n * buildId: '142.0.7444.175',\n * cacheDir: './cache',\n * providers: [\n * new ElectronProvider(), // Try Electron releases first\n * // Falls back to Chrome for Testing automatically\n * ],\n * });\n * ```\n */\n providers?: BrowserProvider[];\n logger?: Logger;\n}\n\n/**\n * Thrown when an installation folder is present but does not hold a browser\n * that can be launched.\n *\n * @internal\n */\nexport class IncompleteInstallationError extends Error {}\n\n/**\n * Install using custom provider plugins.\n * Tries each provider in order until one succeeds.\n * Falls back to default provider if all custom providers fail.\n *\n * @internal\n */\nasync function installWithProviders(\n options: InstallOptions,\n): Promise<InstalledBrowser | string> {\n if (!options.platform) {\n throw new Error('Platform must be defined');\n }\n\n const logger = options.logger;\n const cache = new Cache(options.cacheDir, options.logger);\n const browserRoot = cache.browserRoot(options.browser);\n\n // Build provider list with proper fallback behavior\n const providers = [...(options.providers || [])];\n\n // If custom baseUrl is provided, add it as a provider\n if (options.baseUrl) {\n providers.push(new DefaultProvider(options.baseUrl));\n }\n\n // Always add default provider as final fallback\n // (unless custom baseUrl is provided and forceFallbackForTesting is false)\n if (!options.baseUrl || options.forceFallbackForTesting) {\n providers.push(new DefaultProvider());\n }\n\n const downloadOptions = {\n browser: options.browser,\n platform: options.platform,\n buildId: options.buildId,\n progressCallback:\n options.downloadProgressCallback === 'default'\n ? await makeProgressCallback(\n options.browser,\n options.buildIdAlias ?? options.buildId,\n )\n : options.downloadProgressCallback,\n };\n\n interface ProviderError {\n providerName: string;\n error: Error;\n }\n\n const errors: ProviderError[] = [];\n\n for (const provider of providers) {\n try {\n // Check: does this provider support this browser/platform?\n if (!(await provider.supports(downloadOptions))) {\n logger?.(DEBUG_PREFIXES.install)?.(\n `Provider ${provider.getName()} does not support ${options.browser} on ${options.platform}`,\n );\n continue;\n }\n\n // Warn if using non-default provider\n if (!(provider instanceof DefaultProvider)) {\n logger?.(DEBUG_PREFIXES.install)?.(\n `⚠️ Using custom downloader: ${provider.getName()}`,\n );\n logger?.(DEBUG_PREFIXES.install)?.(\n `⚠️ Puppeteer does not guarantee compatibility with non-default providers`,\n );\n }\n\n logger?.(DEBUG_PREFIXES.install)?.(\n `Trying provider: ${provider.getName()} for ${options.browser} ${options.buildId}`,\n );\n\n // Get download URL from provider\n const url = await provider.getDownloadUrl(downloadOptions);\n if (!url) {\n logger?.(DEBUG_PREFIXES.install)?.(\n `Provider ${provider.getName()} returned no URL for ${options.browser} ${options.buildId}`,\n );\n continue;\n }\n\n logger?.(DEBUG_PREFIXES.install)?.(\n `Successfully got URL from ${provider.getName()}: ${url}`,\n );\n\n if (!existsSync(browserRoot)) {\n await mkdir(browserRoot, {recursive: true});\n }\n\n // Download and install using the URL from the provider\n return await installUrl(url, options, provider, logger);\n } catch (err) {\n logger?.(DEBUG_PREFIXES.install)?.(\n `Provider ${provider.getName()} failed: ${(err as Error).message}`,\n );\n errors.push({\n providerName: provider.getName(),\n error: err as Error,\n });\n // Continue to next provider\n }\n }\n\n // All providers failed\n const errorDetails = errors\n .map(e => {\n return ` - ${e.providerName}: ${e.error.message}`;\n })\n .join('\\n');\n const message = `All providers failed for ${options.browser} ${options.buildId}:\\n${errorDetails}`;\n if (\n errors.length > 0 &&\n errors.every(e => {\n return e.error instanceof IncompleteInstallationError;\n })\n ) {\n throw new IncompleteInstallationError(message);\n }\n throw new Error(message);\n}\n\n/**\n * Downloads and unpacks the browser archive according to the\n * {@link InstallOptions}.\n *\n * @returns a {@link InstalledBrowser} instance.\n *\n * @public\n */\nexport function install(\n options: InstallOptions & {unpack?: true},\n): Promise<InstalledBrowser>;\n/**\n * Downloads the browser archive according to the {@link InstallOptions} without\n * unpacking.\n *\n * @returns the absolute path to the archive.\n *\n * @public\n */\nexport function install(\n options: InstallOptions & {unpack: false},\n): Promise<string>;\nexport async function install(\n options: InstallOptions,\n): Promise<InstalledBrowser | string> {\n options.platform ??= detectBrowserPlatform();\n options.unpack ??= true;\n options.logger ??= debug;\n if (!options.platform) {\n throw new Error(\n `Cannot download a binary for the provided platform: ${os.platform()} (${os.arch()})`,\n );\n }\n\n // Always use plugin architecture (uses default provider if none specified)\n options.providers ??= [];\n return await installWithProviders(options);\n}\n\nasync function installDeps(\n installedBrowser: InstalledBrowser,\n logger?: Logger,\n) {\n if (\n process.platform !== 'linux' ||\n (installedBrowser.platform !== BrowserPlatform.LINUX &&\n installedBrowser.platform !== BrowserPlatform.LINUX_ARM)\n ) {\n return;\n }\n // Currently, only Debian-like deps are supported.\n const depsPath = path.join(\n path.dirname(installedBrowser.executablePath),\n 'deb.deps',\n );\n if (!existsSync(depsPath)) {\n logger?.(DEBUG_PREFIXES.install)?.(\n `deb.deps file was not found at ${depsPath}`,\n );\n return;\n }\n const data = readFileSync(depsPath, 'utf-8').split('\\n').join(',');\n if (process.getuid?.() !== 0) {\n throw new Error('Installing system dependencies requires root privileges');\n }\n let result = spawnSync('apt-get', ['-v']);\n if (result.status !== 0) {\n throw new Error(\n 'Failed to install system dependencies: apt-get does not seem to be available',\n );\n }\n logger?.(DEBUG_PREFIXES.install)?.(`Trying to install dependencies: ${data}`);\n result = spawnSync('apt-get', [\n 'satisfy',\n '-y',\n data,\n '--no-install-recommends',\n ]);\n if (result.status !== 0) {\n throw new Error(\n `Failed to install system dependencies: status=${result.status},error=${result.error},stdout=${result.stdout.toString('utf8')},stderr=${result.stderr.toString('utf8')}`,\n );\n }\n logger?.(DEBUG_PREFIXES.install)?.(`Installed system dependencies ${data}`);\n}\n\nasync function installUrl(\n url: URL,\n options: InstallOptions,\n provider: BrowserProvider,\n logger?: Logger,\n): Promise<InstalledBrowser | string> {\n if (!provider) {\n throw new Error('Provider is required for installation');\n }\n options.platform ??= detectBrowserPlatform();\n if (!options.platform) {\n throw new Error(\n `Cannot download a binary for the provided platform: ${os.platform()} (${os.arch()})`,\n );\n }\n let downloadProgressCallback = options.downloadProgressCallback;\n if (downloadProgressCallback === 'default') {\n downloadProgressCallback = await makeProgressCallback(\n options.browser,\n options.buildIdAlias ?? options.buildId,\n );\n }\n const fileName = decodeURIComponent(url.toString()).split('/').pop();\n assert(fileName, `A malformed download URL was found: ${url}.`);\n const cache = new Cache(options.cacheDir, options.logger);\n const browserRoot = cache.browserRoot(options.browser);\n const archivePath = path.join(browserRoot, `${options.buildId}-${fileName}`);\n if (!existsSync(browserRoot)) {\n await mkdir(browserRoot, {recursive: true});\n }\n\n if (options.expectedHash) {\n logger?.(DEBUG_PREFIXES.install)?.(\n `Using provided checksum for ${fileName}: ${options.expectedHash}`,\n );\n }\n\n if (!options.unpack) {\n if (existsSync(archivePath)) {\n return archivePath;\n }\n logger?.(DEBUG_PREFIXES.install)?.(`Downloading binary from ${url}`);\n debugTime('download');\n await downloadFile(\n url,\n archivePath,\n downloadProgressCallback,\n options.expectedHash,\n );\n debugTimeEnd('download', logger);\n return archivePath;\n }\n\n const outputPath = cache.installationDir(\n options.browser,\n options.platform,\n options.buildId,\n );\n\n // Get executable path from provider once (used for both cached and new installations)\n const relativeExecutablePath = await provider.getExecutablePath({\n browser: options.browser,\n buildId: options.buildId,\n platform: options.platform,\n });\n logger?.(DEBUG_PREFIXES.install)?.(\n `Using executable path from provider: ${relativeExecutablePath}`,\n );\n\n const installedBrowser = new InstalledBrowser(\n cache,\n options.browser,\n options.buildId,\n options.platform,\n );\n\n // Write metadata for the installation (only for non-default providers)\n if (!(provider instanceof DefaultProvider)) {\n cache.writeExecutablePath(\n options.browser,\n options.platform,\n options.buildId,\n relativeExecutablePath,\n );\n }\n\n try {\n if (existsSync(outputPath)) {\n if (!existsSync(installedBrowser.executablePath)) {\n throw new IncompleteInstallationError(\n `The browser folder (${outputPath}) exists but the executable (${installedBrowser.executablePath}) is missing. ` +\n `An earlier install of this build probably did not finish. ` +\n `Delete ${outputPath} and install the browser again.`,\n );\n }\n await runSetup(installedBrowser, logger);\n if (options.installDeps) {\n await installDeps(installedBrowser, logger);\n }\n return installedBrowser;\n }\n\n // Check if archive already exists (e.g., from a custom provider)\n if (!existsSync(archivePath)) {\n logger?.(DEBUG_PREFIXES.install)?.(`Downloading binary from ${url}`);\n try {\n debugTime('download');\n await downloadFile(\n url,\n archivePath,\n downloadProgressCallback,\n options.expectedHash,\n );\n } finally {\n debugTimeEnd('download', logger);\n }\n } else {\n logger?.(DEBUG_PREFIXES.install)?.(\n `Using existing archive at ${archivePath}`,\n );\n }\n\n logger?.(DEBUG_PREFIXES.install)?.(\n `Installing ${archivePath} to ${outputPath}`,\n );\n try {\n debugTime('extract');\n await unpackArchive(archivePath, outputPath, options.logger);\n } finally {\n debugTimeEnd('extract', logger);\n }\n\n if (options.buildIdAlias) {\n const metadata = installedBrowser.readMetadata();\n metadata.aliases[options.buildIdAlias] = options.buildId;\n installedBrowser.writeMetadata(metadata);\n }\n\n await runSetup(installedBrowser, logger);\n if (options.installDeps) {\n await installDeps(installedBrowser, logger);\n }\n return installedBrowser;\n } finally {\n if (existsSync(archivePath)) {\n await unlink(archivePath);\n }\n }\n}\n\nasync function runSetup(\n installedBrowser: InstalledBrowser,\n logger?: Logger,\n): Promise<void> {\n // On Windows for Chrome invoke setup.exe to configure sandboxes.\n if (\n (installedBrowser.platform === BrowserPlatform.WIN32 ||\n installedBrowser.platform === BrowserPlatform.WIN64) &&\n installedBrowser.browser === Browser.CHROME &&\n installedBrowser.platform === detectBrowserPlatform()\n ) {\n try {\n debugTime('permissions');\n const browserDir = path.dirname(installedBrowser.executablePath);\n const setupExePath = path.join(browserDir, 'setup.exe');\n if (!existsSync(setupExePath)) {\n return;\n }\n spawnSync(\n path.join(browserDir, 'setup.exe'),\n [`--configure-browser-in-directory=` + browserDir],\n {\n shell: false,\n },\n );\n // TODO: Handle error here. Currently the setup.exe sometimes\n // errors although it sets the permissions correctly.\n } finally {\n debugTimeEnd('permissions', logger);\n }\n }\n}\n\n/**\n * @public\n */\nexport interface UninstallOptions {\n /**\n * Determines the platform for the browser binary.\n *\n * @defaultValue **Auto-detected.**\n */\n platform?: BrowserPlatform;\n /**\n * The path to the root of the cache directory.\n */\n cacheDir: string;\n /**\n * Determines which browser to uninstall.\n */\n browser: Browser;\n /**\n * The browser build to uninstall\n */\n buildId: string;\n}\n\n/**\n *\n * @public\n */\nexport async function uninstall(options: UninstallOptions): Promise<void> {\n options.platform ??= detectBrowserPlatform();\n if (!options.platform) {\n throw new Error(\n `Cannot detect the browser platform for: ${os.platform()} (${os.arch()})`,\n );\n }\n\n new Cache(options.cacheDir).uninstall(\n options.browser,\n options.platform,\n options.buildId,\n );\n}\n\n/**\n * @public\n */\nexport interface GetInstalledBrowsersOptions {\n /**\n * The path to the root of the cache directory.\n */\n cacheDir: string;\n}\n\n/**\n * Returns metadata about browsers installed in the cache directory.\n *\n * @public\n */\nexport async function getInstalledBrowsers(\n options: GetInstalledBrowsersOptions,\n): Promise<InstalledBrowser[]> {\n return new Cache(options.cacheDir).getInstalledBrowsers();\n}\n\n/**\n * @public\n */\nexport async function canDownload(options: InstallOptions): Promise<boolean> {\n options.platform ??= detectBrowserPlatform();\n if (!options.platform) {\n throw new Error(\n `Cannot download a binary for the provided platform: ${os.platform()} (${os.arch()})`,\n );\n }\n\n // Always use plugin architecture (uses default provider if none specified)\n const providers = [\n ...(options.providers || []),\n new DefaultProvider(options.baseUrl),\n ];\n\n const downloadOptions = {\n browser: options.browser,\n platform: options.platform,\n buildId: options.buildId,\n };\n\n // Check if any provider can provide a valid, downloadable URL\n for (const provider of providers) {\n if (!(await provider.supports(downloadOptions))) {\n continue;\n }\n const url = await provider.getDownloadUrl(downloadOptions);\n if (url && (await headHttpRequest(url))) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Retrieves a URL for downloading the binary archive of a given browser.\n *\n * The archive is bound to the specific platform and build ID specified.\n *\n * @public\n */\nexport function getDownloadUrl(\n browser: Browser,\n platform: BrowserPlatform,\n buildId: string,\n baseUrl?: string,\n): URL {\n return new URL(downloadUrls[browser](platform, buildId, baseUrl));\n}\n/**\n * @internal\n */\nexport async function makeProgressCallback(\n browser: Browser,\n buildId: string,\n): Promise<(downloadedBytes: number, totalBytes: number) => void> {\n let ticker: ((delta: number) => void) | undefined;\n let lastDownloadedBytes = 0;\n\n return (downloadedBytes: number, totalBytes: number) => {\n if (!ticker) {\n ticker = ProgressBar.createBarTicker(\n `Downloading ${browser} ${buildId} - ${toMegabytes(totalBytes)}`,\n totalBytes,\n );\n }\n const delta = downloadedBytes - lastDownloadedBytes;\n lastDownloadedBytes = downloadedBytes;\n ticker(delta);\n };\n}\n\nfunction toMegabytes(bytes: number) {\n const mb = bytes / 1000 / 1000;\n return `${Math.round(mb * 10) / 10} MB`;\n}\n","/**\n * @license\n * Copyright 2026 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {Browser, BrowserPlatform} from './browser-data/browser-data.js';\nimport {\n downloadUrls,\n executablePathByBrowser,\n} from './browser-data/browser-data.js';\nimport type {BrowserProvider, DownloadOptions} from './provider.js';\n\n/**\n * Default provider implementation that uses default sources.\n * This is the standard provider used by Puppeteer.\n *\n * @public\n */\nexport class DefaultProvider implements BrowserProvider {\n #baseUrl?: string;\n\n constructor(baseUrl?: string) {\n this.#baseUrl = baseUrl;\n }\n\n supports(_options: DownloadOptions): boolean {\n // Default provider supports all browsers\n return true;\n }\n\n getDownloadUrl(options: DownloadOptions): URL {\n return this.#getDownloadUrl(\n options.browser,\n options.platform,\n options.buildId,\n );\n }\n\n #getDownloadUrl(\n browser: Browser,\n platform: BrowserPlatform,\n buildId: string,\n ): URL {\n return new URL(downloadUrls[browser](platform, buildId, this.#baseUrl));\n }\n\n getExecutablePath(options: {\n browser: Browser;\n buildId: string;\n platform: BrowserPlatform;\n }): string {\n return executablePathByBrowser[options.browser](\n options.platform,\n options.buildId,\n );\n }\n\n getName(): string {\n return 'DefaultProvider';\n }\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {ChildProcessByStdio} from 'node:child_process';\nimport {spawnSync, spawn, execFile} from 'node:child_process';\nimport {constants, createReadStream, createWriteStream} from 'node:fs';\nimport {mkdir, readdir, symlink} from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {Readable, Transform} from 'node:stream';\nimport {Stream, Writable} from 'node:stream';\nimport {pipeline} from 'node:stream/promises';\nimport {promisify} from 'node:util';\n\nimport type {Entry, Options, ZipFile} from 'yauzl';\n\nimport {DEBUG_PREFIXES, type Logger} from './debug.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * @internal\n */\nexport async function unpackArchive(\n archivePath: string,\n folderPath: string,\n logger?: Logger,\n): Promise<void> {\n if (!path.isAbsolute(folderPath)) {\n folderPath = path.resolve(process.cwd(), folderPath);\n }\n if (archivePath.endsWith('.zip')) {\n await mkdir(folderPath, {recursive: true});\n await extractZip(archivePath, folderPath, logger);\n } else if (archivePath.endsWith('.tar.bz2')) {\n await extractTar(archivePath, folderPath, 'bzip2', logger);\n } else if (archivePath.endsWith('.dmg')) {\n await mkdir(folderPath);\n await installDMG(archivePath, folderPath);\n } else if (archivePath.endsWith('.exe')) {\n // Firefox on Windows.\n const result = spawnSync(archivePath, [`/ExtractDir=${folderPath}`], {\n env: {\n __compat_layer: 'RunAsInvoker',\n },\n });\n if (result.status !== 0) {\n throw new Error(\n `Failed to extract ${archivePath} to ${folderPath}: ${result.output}`,\n );\n }\n } else if (archivePath.endsWith('.tar.xz')) {\n await extractTar(archivePath, folderPath, 'xz');\n } else {\n throw new Error(`Unsupported archive format: ${archivePath}`);\n }\n}\n\nfunction createTransformStream(\n child: ChildProcessByStdio<Writable, Readable, null>,\n): Transform {\n const stream = new Stream.Transform({\n transform(chunk, encoding, callback) {\n if (!child.stdin.write(chunk, encoding)) {\n child.stdin.once('drain', callback);\n } else {\n callback();\n }\n },\n\n flush(callback) {\n if (child.stdout.destroyed) {\n callback();\n } else {\n child.stdin.end();\n child.stdout.on('close', callback);\n }\n },\n });\n\n child.stdin.on('error', e => {\n if ('code' in e && e.code === 'EPIPE') {\n // finished before reading the file finished (i.e. head)\n stream.emit('end');\n } else {\n stream.destroy(e);\n }\n });\n\n child.stdout\n .on('data', data => {\n return stream.push(data);\n })\n .on('error', e => {\n return stream.destroy(e);\n });\n\n child.once('close', () => {\n return stream.end();\n });\n\n return stream;\n}\n\n/**\n * @internal\n */\nexport const internalConstantsForTesting = {\n xz: 'xz',\n bzip2: 'bzip2',\n};\n\n/**\n * @internal\n */\nasync function extractTar(\n tarPath: string,\n folderPath: string,\n decompressUtilityName: keyof typeof internalConstantsForTesting,\n logger?: Logger,\n): Promise<void> {\n const {unpackTar} = await import('modern-tar/fs');\n return await new Promise<void>((fulfill, reject) => {\n function handleError(utilityName: string) {\n return (error: Error) => {\n if ('code' in error && error.code === 'ENOENT') {\n error = new Error(\n `\\`${utilityName}\\` utility is required to unpack this archive`,\n {\n cause: error,\n },\n );\n }\n reject(error);\n };\n }\n const unpack = spawn(\n internalConstantsForTesting[decompressUtilityName],\n ['-d'],\n {\n stdio: ['pipe', 'pipe', 'inherit'],\n },\n )\n .once('error', handleError(decompressUtilityName))\n .once('exit', code => {\n logger?.(DEBUG_PREFIXES.fileUtil)?.(\n `${decompressUtilityName} exited, code=${code}`,\n );\n });\n\n const tar = unpackTar(folderPath);\n tar.once('error', handleError('tar'));\n tar.once('finish', fulfill);\n createReadStream(tarPath).pipe(createTransformStream(unpack)).pipe(tar);\n });\n}\n\n/**\n * @internal\n */\nasync function installDMG(dmgPath: string, folderPath: string): Promise<void> {\n const {stdout} = await execFileAsync('hdiutil', [\n 'attach',\n '-nobrowse',\n '-noautoopen',\n dmgPath,\n ]);\n\n const volumes = stdout.match(/\\/Volumes\\/(.*)/m);\n if (!volumes) {\n throw new Error(`Could not find volume path in ${stdout}`);\n }\n const mountPath = volumes[0]!;\n\n try {\n const fileNames = await readdir(mountPath);\n const appName = fileNames.find(item => {\n return typeof item === 'string' && item.endsWith('.app');\n });\n if (!appName) {\n throw new Error(`Cannot find app in ${mountPath}`);\n }\n const mountedPath = path.join(mountPath!, appName);\n\n await execFileAsync('cp', ['-R', mountedPath, folderPath]);\n } finally {\n await execFileAsync('hdiutil', ['detach', mountPath, '-quiet']);\n }\n}\n\n/**\n * @internal\n */\nclass ArchiverUnavailableError extends Error {}\n\n/**\n * @internal\n */\nasync function extractZip(\n archivePath: string,\n folderPath: string,\n logger?: Logger,\n): Promise<void> {\n for (const extract of [extractZipWithCli, extractZipWithYauzl]) {\n try {\n await extract(archivePath, folderPath, logger);\n return;\n } catch (error) {\n if (!(error instanceof ArchiverUnavailableError)) {\n throw error;\n }\n }\n }\n throw new Error(\n `Extraction failed: no zip archiver is available. Install \\`unzip\\` (or \\`tar.exe\\`/Powershell on Windows), or add the optional \\`yauzl\\` dependency.`,\n );\n}\n\n/**\n * @internal\n */\nexport async function extractZipWithYauzl(\n archivePath: string,\n folderPath: string,\n _logger?: Logger,\n): Promise<void> {\n const {default: yauzl} = await import(\n /* webpackIgnore: true */ 'yauzl'\n ).catch(() => {\n throw new ArchiverUnavailableError(\n 'Extraction failed: The optional `yauzl` dependency is not installed.',\n );\n });\n const open = promisify<string, Options, ZipFile>(yauzl.open);\n try {\n const zipFile = await open(archivePath, {lazyEntries: true});\n await new Promise((resolve, reject) => {\n zipFile\n .on('error', reject)\n .on('end', resolve)\n .on('entry', entry => {\n extractZipEntry(zipFile, entry, folderPath).then(() => {\n zipFile.readEntry();\n }, reject);\n })\n .readEntry();\n });\n } catch (error) {\n throw new Error(`Extraction failed: ${archivePath}`, {cause: error});\n }\n}\n\n/**\n * @internal\n */\nasync function extractZipWithCli(\n archivePath: string,\n folderPath: string,\n logger?: Logger,\n): Promise<void> {\n try {\n if (process.platform === 'win32') {\n const systemRoot =\n process.env['SystemRoot'] ?? process.env['SYSTEMROOT'] ?? 'C:\\\\Windows';\n try {\n const systemTar = `${systemRoot}\\\\System32\\\\tar.exe`;\n // -x: extract files\n // -f: specify the archive file\n // -C: extract to the specified directory\n await execFileAsync(systemTar, ['-xf', archivePath, '-C', folderPath]);\n return;\n } catch (tarError) {\n logger?.(DEBUG_PREFIXES.fileUtil)?.(\n `tar.exe extraction failed: ${tarError}`,\n );\n }\n try {\n await execFileAsync('powershell.exe', [\n '-NoProfile',\n '-NonInteractive',\n '-Command',\n '& { Expand-Archive -LiteralPath $args[0] -DestinationPath $args[1] -Force }',\n archivePath,\n folderPath,\n ]);\n return;\n } catch (powershellError) {\n logger?.(DEBUG_PREFIXES.fileUtil)?.(\n `powershell.exe extraction failed: ${powershellError}`,\n );\n }\n await execFileAsync('pwsh.exe', [\n '-NoProfile',\n '-NonInteractive',\n '-Command',\n '& { Expand-Archive -LiteralPath $args[0] -DestinationPath $args[1] -Force }',\n archivePath,\n folderPath,\n ]);\n } else {\n // -o: overwrite existing files without prompting\n // -d: extract files into the specified directory\n await execFileAsync('unzip', ['-o', archivePath, '-d', folderPath]);\n }\n } catch (error: any) {\n if (error?.code === 'ENOENT') {\n throw new ArchiverUnavailableError(\n `Extraction failed: Required native binary ('tar.exe', 'powershell.exe', 'pwsh.exe' or 'unzip') was not found in the system PATH.`,\n );\n }\n throw new Error(\n `Extraction failed: ${error?.stderr?.toString() || error?.message}`,\n );\n }\n}\n\n/**\n * @internal\n */\nfunction isInsideDirectory(directory: string, candidate: string): boolean {\n const resolvedDirectory = path.resolve(directory);\n const resolvedCandidate = path.resolve(candidate);\n return (\n resolvedCandidate === resolvedDirectory ||\n resolvedCandidate.startsWith(resolvedDirectory + path.sep)\n );\n}\n\n/**\n * @internal\n */\nasync function extractZipEntry(\n zipFile: ZipFile,\n entry: Entry,\n folderPath: string,\n): Promise<void> {\n const {S_IFMT, S_IFDIR, S_IFLNK} = constants;\n\n // see https://github.com/max-mapper/extract-zip/blob/v2.0.1/index.js#L90-L107\n const unixMode = entry.externalFileAttributes >>> 16;\n const isDirectory =\n (unixMode & S_IFMT) === S_IFDIR ||\n entry.fileName.endsWith('/') ||\n (entry.versionMadeBy >> 8 === 0 && entry.externalFileAttributes === 0x10);\n const isSymlink = (unixMode & S_IFMT) === S_IFLNK;\n // Fall back to sensible defaults for archives without Unix attributes.\n const mode =\n unixMode === 0 ? (isDirectory ? 0o755 : 0o644) : unixMode & 0o777;\n\n const destination = path.join(folderPath, entry.fileName);\n if (isDirectory) {\n await mkdir(destination, {recursive: true, mode});\n return;\n }\n await mkdir(path.dirname(destination), {recursive: true});\n\n const readStream = await promisify(zipFile.openReadStream.bind(zipFile))(\n entry,\n );\n if (isSymlink) {\n // Consume the symlink target in pipe semantics rather than via async\n // iteration (e.g. stream/consumers `text()`): yauzl <3.3.1 read streams\n // never emit \"close\", which hangs consumers (thejoshwolfe/yauzl#169)\n const chunks: Buffer[] = [];\n await pipeline(\n readStream,\n new Writable({\n write(chunk: unknown, _encoding, callback) {\n // yauzl opens entries in binary mode, so chunks are always Buffers.\n if (chunk instanceof Buffer) {\n chunks.push(chunk);\n }\n callback();\n },\n }),\n );\n const linkTarget = Buffer.concat(chunks).toString();\n // Verify that the link does not resolve outside of the target directory.\n const resolvedLinkTarget = path.resolve(\n path.dirname(destination),\n linkTarget,\n );\n if (!isInsideDirectory(folderPath, resolvedLinkTarget)) {\n throw new Error(\n `Zip symlink \"${entry.fileName}\" would point outside of the target directory.`,\n );\n }\n await symlink(linkTarget, destination);\n return;\n }\n await pipeline(readStream, createWriteStream(destination, {mode}));\n}\n","/**\n * @license\n * Copyright 2026 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Module-level active session. Concurrent bars share a session; a new session\n// starts whenever no bar is currently active (or the stream changes).\nlet activeBar: ProgressBar | null = null;\n\n/**\n * Manages one or more concurrent progress bars on separate terminal lines.\n * Use {@link ProgressBar.createBarTicker} to add a bar; concurrent calls\n * automatically share a session so bars don't overwrite each other.\n *\n * @internal\n */\nexport class ProgressBar {\n #stream: NodeJS.WriteStream;\n #totalRows = 0;\n #doneCount = 0;\n #bars: Array<{\n title: string;\n total: number;\n downloaded: number;\n startTime: number;\n lastRendered: string;\n }> = [];\n #renderScheduled = false;\n #lastRenderTime = 0;\n #allDone = false;\n\n private constructor(stream: NodeJS.WriteStream) {\n this.#stream = stream;\n }\n\n /**\n * Returns a `tick(delta)` function for a new progress bar. If another bar\n * is already active on the same stream, the new bar appears on the next line\n * and both update in place. The trailing newline is emitted automatically\n * once every bar in the session has reached 100%.\n */\n static createBarTicker(\n title: string,\n total: number,\n stream: NodeJS.WriteStream = process.stderr as NodeJS.WriteStream,\n ): (delta: number) => void {\n // Start a fresh session when none is active or the stream changed.\n if (!activeBar || activeBar.#stream !== stream) {\n activeBar = new ProgressBar(stream);\n }\n return activeBar.#addBar(title, total);\n }\n\n #claimRow(): number {\n const row = this.#totalRows++;\n if (row > 0 && this.#stream.isTTY) {\n // Cursor is parked at col 0 of the previous bottom row; \\n opens the\n // new line and moves the cursor there, establishing the new bottom row.\n this.#stream.write('\\n');\n }\n return row;\n }\n\n #addBar(title: string, total: number): (delta: number) => void {\n const row = this.#claimRow();\n this.#bars.push({\n title,\n total,\n downloaded: 0,\n startTime: 0,\n lastRendered: '',\n });\n let doneNotified = false;\n\n return (delta: number) => {\n const bar = this.#bars[row]!;\n if (bar.startTime === 0) {\n bar.startTime = Date.now();\n }\n bar.downloaded += delta;\n\n const isDone = bar.downloaded >= bar.total;\n if (isDone || Date.now() - this.#lastRenderTime >= 100) {\n this.#scheduleRender();\n }\n\n if (isDone && !doneNotified) {\n doneNotified = true;\n this.#onBarDone();\n }\n };\n }\n\n // Defers to a microtask so multiple ticks in the same turn share one render\n // pass and the cursor only moves once.\n #scheduleRender(): void {\n if (!this.#renderScheduled) {\n this.#renderScheduled = true;\n queueMicrotask(() => {\n this.#renderScheduled = false;\n this.#lastRenderTime = Date.now();\n this.#renderAll();\n });\n }\n }\n\n #computeRendered(row: number): string {\n const bar = this.#bars[row]!;\n const ratio = Math.min(1, Math.max(0, bar.downloaded / bar.total));\n const percent = Math.round(ratio * 100);\n const elapsedMs = bar.startTime > 0 ? Date.now() - bar.startTime : 0;\n const rate = elapsedMs > 0 ? bar.downloaded / elapsedMs : 0; // bytes/ms\n const etaSec = rate > 0 ? (bar.total - bar.downloaded) / rate / 1000 : 0;\n const width = 20;\n const completeCount = Math.round(width * ratio);\n const barStr =\n '='.repeat(completeCount) + ' '.repeat(width - completeCount);\n const status =\n ratio >= 1 ? 'unpacking' : `${percent}% ${etaSec.toFixed(1)}s`;\n return `${bar.title} [${barStr}] ${status} `;\n }\n\n // Invariant: cursor is at col 0 of the bottom row before and after this call.\n // Single top-down pass: go up to bar 0, render each bar, come back to bottom.\n #renderAll(): void {\n if (!this.#stream.isTTY) {\n return;\n }\n const N = this.#totalRows;\n if (N === 0) {\n return;\n }\n\n // Move cursor to top of bar area.\n if (N > 1) {\n this.#stream.moveCursor(0, -(N - 1));\n }\n\n for (let row = 0; row < N; row++) {\n const rendered = this.#computeRendered(row);\n if (rendered !== this.#bars[row]!.lastRendered) {\n this.#stream.cursorTo(0);\n this.#stream.write(rendered);\n this.#stream.clearLine(1);\n this.#bars[row]!.lastRendered = rendered;\n }\n if (row < N - 1) {\n this.#stream.moveCursor(0, 1);\n }\n }\n\n // Park cursor at col 0 of the bottom row.\n this.#stream.cursorTo(0);\n\n if (this.#allDone) {\n activeBar = null;\n this.#stream.write('\\n');\n }\n }\n\n #onBarDone(): void {\n this.#doneCount++;\n if (this.#doneCount >= this.#totalRows && this.#totalRows > 0) {\n this.#allDone = true;\n // Don't emit \\n here — the pending render microtask hasn't run yet.\n // #renderAll() will emit it after the final pass so the cursor is\n // already past the last bar line before the newline moves it.\n }\n }\n}\n","/**\n * @license\n * Copyright 2023 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {spawn} from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {stdin as input, stdout as output} from 'node:process';\nimport * as readline from 'node:readline';\n\nimport type * as Yargs from 'yargs';\n\nimport {\n Browser,\n resolveBuildId,\n BrowserPlatform,\n verifyChromeReleaseChannel,\n} from './browser-data/browser-data.js';\nimport {Cache} from './Cache.js';\nimport {detectBrowserPlatform} from './detectPlatform.js';\nimport {IncompleteInstallationError, install} from './install.js';\nimport {\n computeExecutablePath,\n computeSystemExecutablePath,\n launch,\n} from './launch.js';\n\ninterface InstallBrowser {\n name: Browser;\n buildId: string;\n}\ninterface InstallArgs {\n browser?: InstallBrowser;\n path?: string;\n platform?: BrowserPlatform;\n baseUrl?: string;\n installDeps?: boolean;\n format: string;\n}\n\nfunction isValidBrowser(browser: unknown): browser is Browser {\n return Object.values(Browser).includes(browser as Browser);\n}\n\nfunction isValidPlatform(platform: unknown): platform is BrowserPlatform {\n return Object.values(BrowserPlatform).includes(platform as BrowserPlatform);\n}\n\n// If moved update release-please config\n// x-release-please-start-version\nconst packageVersion = '3.2.2';\n// x-release-please-end\n\n/**\n * @public\n */\nexport class CLI {\n #cachePath: string;\n #rl?: readline.Interface;\n #scriptName: string;\n #version: string;\n #allowCachePathOverride: boolean;\n #pinnedBrowsers?: Partial<\n Record<\n Browser,\n {\n buildId: string;\n skipDownload: boolean;\n }\n >\n >;\n #prefixCommand?: {cmd: string; description: string};\n\n constructor(\n opts?:\n | string\n | {\n cachePath?: string;\n scriptName?: string;\n version?: string;\n prefixCommand?: {cmd: string; description: string};\n allowCachePathOverride?: boolean;\n pinnedBrowsers?: Partial<\n Record<\n Browser,\n {\n buildId: string;\n skipDownload: boolean;\n }\n >\n >;\n },\n rl?: readline.Interface,\n ) {\n if (!opts) {\n opts = {};\n }\n if (typeof opts === 'string') {\n opts = {\n cachePath: opts,\n };\n }\n this.#cachePath = opts.cachePath ?? process.cwd();\n this.#rl = rl;\n this.#scriptName = opts.scriptName ?? '@puppeteer/browsers';\n this.#version = opts.version ?? packageVersion;\n this.#allowCachePathOverride = opts.allowCachePathOverride ?? true;\n this.#pinnedBrowsers = opts.pinnedBrowsers;\n this.#prefixCommand = opts.prefixCommand;\n }\n\n #defineBrowserParameter<T>(\n yargs: Yargs.Argv<T>,\n required: true,\n ): Yargs.Argv<T & {browser: InstallBrowser}>;\n #defineBrowserParameter<T>(\n yargs: Yargs.Argv<T>,\n required: boolean,\n ): Yargs.Argv<T & {browser: InstallBrowser | undefined}>;\n #defineBrowserParameter<T>(yargs: Yargs.Argv<T>, required: boolean) {\n return yargs.positional('browser', {\n description:\n 'Which browser to install <browser>[@<buildId|latest>]. `latest` will try to find the latest available build. `buildId` is a browser-specific identifier such as a version or a revision.',\n type: 'string',\n coerce: (opt): InstallBrowser => {\n const browser: InstallBrowser = {\n name: this.#parseBrowser(opt),\n buildId: this.#parseBuildId(opt),\n };\n\n if (!isValidBrowser(browser.name)) {\n throw new Error(`Unsupported browser '${browser.name}'`);\n }\n\n return browser;\n },\n demandOption: required,\n });\n }\n\n #definePlatformParameter<T>(yargs: Yargs.Argv<T>) {\n return yargs.option('platform', {\n type: 'string',\n desc: 'Platform that the binary needs to be compatible with.',\n choices: Object.values(BrowserPlatform),\n default: detectBrowserPlatform(),\n coerce: platform => {\n if (!isValidPlatform(platform)) {\n throw new Error(`Unsupported platform '${platform}'`);\n }\n\n return platform;\n },\n defaultDescription: 'Auto-detected',\n });\n }\n\n #definePathParameter<T>(yargs: Yargs.Argv<T>, required = false) {\n if (!this.#allowCachePathOverride) {\n return yargs as Yargs.Argv<T & {path: undefined}>;\n }\n\n return yargs.option('path', {\n type: 'string',\n desc: 'Path to the root folder for the browser downloads and installation. If a relative path is provided, it will be resolved relative to the current working directory. The installation folder structure is compatible with the cache structure used by Puppeteer.',\n defaultDescription: 'Current working directory',\n ...(required ? {} : {default: process.cwd()}),\n demandOption: required,\n });\n }\n\n async run(argv: string[]): Promise<void> {\n const {default: yargs} = await import('yargs');\n const {hideBin} = await import('yargs/helpers');\n const yargsInstance = yargs(hideBin(argv));\n let target = yargsInstance\n .scriptName(this.#scriptName)\n .version(this.#version);\n if (this.#prefixCommand) {\n target = target.command(\n this.#prefixCommand.cmd,\n this.#prefixCommand.description,\n yargs => {\n return this.#build(yargs);\n },\n );\n } else {\n target = this.#build(target);\n }\n await target\n .demandCommand(1)\n .help()\n .wrap(Math.min(120, yargsInstance.terminalWidth()))\n .parseAsync();\n }\n\n #build(yargs: Yargs.Argv<unknown>) {\n const latestOrPinned = this.#pinnedBrowsers ? 'pinned' : 'latest';\n // If there are pinned browsers allow the positional arg to be optional\n const browserArgType = this.#pinnedBrowsers ? '[browser]' : '<browser>';\n return yargs\n .command(\n `install ${browserArgType}`,\n 'Download and install the specified browser. If successful, the command outputs the actual browser buildId that was installed and the absolute path to the browser executable (see --format).',\n yargs => {\n if (this.#pinnedBrowsers) {\n yargs.example('$0 install', 'Install all pinned browsers');\n }\n yargs\n .example(\n '$0 install chrome',\n `Install the ${latestOrPinned} available build of the Chrome browser.`,\n )\n .example(\n '$0 install chrome@latest',\n 'Install the latest available build for the Chrome browser.',\n )\n .example(\n '$0 install chrome@stable',\n 'Install the latest available build for the Chrome browser from the stable channel.',\n )\n .example(\n '$0 install chrome@beta',\n 'Install the latest available build for the Chrome browser from the beta channel.',\n )\n .example(\n '$0 install chrome@dev',\n 'Install the latest available build for the Chrome browser from the dev channel.',\n )\n .example(\n '$0 install chrome@canary',\n 'Install the latest available build for the Chrome Canary browser.',\n )\n .example(\n '$0 install chrome@115',\n 'Install the latest available build for Chrome 115.',\n )\n .example(\n '$0 install chromedriver@canary',\n 'Install the latest available build for ChromeDriver Canary.',\n )\n .example(\n '$0 install chromedriver@115',\n 'Install the latest available build for ChromeDriver 115.',\n )\n .example(\n '$0 install chromedriver@115.0.5790',\n 'Install the latest available patch (115.0.5790.X) build for ChromeDriver.',\n )\n .example(\n '$0 install chrome-headless-shell',\n 'Install the latest available chrome-headless-shell build.',\n )\n .example(\n '$0 install chrome-headless-shell@beta',\n 'Install the latest available chrome-headless-shell build corresponding to the Beta channel.',\n )\n .example(\n '$0 install chrome-headless-shell@118',\n 'Install the latest available chrome-headless-shell 118 build.',\n )\n .example(\n '$0 install chromium@1083080',\n 'Install the revision 1083080 of the Chromium browser.',\n )\n .example(\n '$0 install firefox',\n 'Install the latest nightly available build of the Firefox browser.',\n )\n .example(\n '$0 install firefox@stable',\n 'Install the latest stable build of the Firefox browser.',\n )\n .example(\n '$0 install firefox@beta',\n 'Install the latest beta build of the Firefox browser.',\n )\n .example(\n '$0 install firefox@devedition',\n 'Install the latest devedition build of the Firefox browser.',\n )\n .example(\n '$0 install firefox@esr',\n 'Install the latest ESR build of the Firefox browser.',\n )\n .example(\n '$0 install firefox@nightly',\n 'Install the latest nightly build of the Firefox browser.',\n )\n .example(\n '$0 install firefox@stable_111.0.1',\n 'Install a specific version of the Firefox browser.',\n )\n .example(\n '$0 install firefox --platform mac',\n 'Install the latest Mac (Intel) build of the Firefox browser.',\n );\n if (this.#allowCachePathOverride) {\n yargs.example(\n '$0 install firefox --path /tmp/my-browser-cache',\n 'Install to the specified cache directory.',\n );\n }\n\n const yargsWithBrowserParam = this.#defineBrowserParameter(\n yargs,\n !Boolean(this.#pinnedBrowsers),\n );\n const yargsWithPlatformParam = this.#definePlatformParameter(\n yargsWithBrowserParam,\n );\n return this.#definePathParameter(yargsWithPlatformParam, false)\n .option('base-url', {\n type: 'string',\n desc: 'Base URL to download from',\n })\n .option('install-deps', {\n type: 'boolean',\n desc: 'Whether to attempt installing system dependencies (only supported on Linux, requires root privileges).',\n default: false,\n })\n .option('format', {\n type: 'string',\n desc: 'Format to use for the output. Supported placeholders: {{browser}}, {{buildId}}, {{path}}, {{platform}}',\n default: '{{browser}}@{{buildId}} {{path}}',\n });\n },\n async args => {\n if (this.#pinnedBrowsers && !args.browser) {\n // Use allSettled to avoid scenarios that\n // a browser may fail early and leave the other\n // installation in a faulty state\n const result = await Promise.allSettled(\n Object.entries(this.#pinnedBrowsers).map(\n async ([browser, options]) => {\n if (options.skipDownload) {\n return;\n }\n await this.#install({\n ...args,\n browser: {\n name: browser as Browser,\n buildId: options.buildId,\n },\n });\n },\n ),\n );\n\n for (const install of result) {\n if (install.status === 'rejected') {\n throw install.reason;\n }\n }\n } else {\n await this.#install(args);\n }\n },\n )\n .command(\n 'launch <browser>',\n 'Launch the specified browser',\n yargs => {\n yargs\n .example(\n '$0 launch chrome@115.0.5790.170',\n 'Launch Chrome 115.0.5790.170',\n )\n .example(\n '$0 launch firefox@112.0a1',\n 'Launch the Firefox browser identified by the milestone 112.0a1.',\n )\n .example(\n '$0 launch chrome@115.0.5790.170 --detached',\n 'Launch the browser but detach the sub-processes.',\n )\n .example(\n '$0 launch chrome@canary --system',\n 'Try to locate the Canary build of Chrome installed on the system and launch it.',\n )\n .example(\n '$0 launch chrome@115.0.5790.170 -- --version',\n 'Launch Chrome 115.0.5790.170 and pass custom argument to the binary.',\n );\n\n const yargsWithExtraAgs = yargs.parserConfiguration({\n 'populate--': true,\n // Yargs does not have the correct overload for this.\n }) as Yargs.Argv<{'--'?: Array<string | number>}>;\n const yargsWithBrowserParam = this.#defineBrowserParameter(\n yargsWithExtraAgs,\n true,\n );\n const yargsWithPlatformParam = this.#definePlatformParameter(\n yargsWithBrowserParam,\n );\n return this.#definePathParameter(yargsWithPlatformParam)\n .option('detached', {\n type: 'boolean',\n desc: 'Detach the child process.',\n default: false,\n })\n .option('system', {\n type: 'boolean',\n desc: 'Search for a browser installed on the system instead of the cache folder.',\n default: false,\n })\n .option('dumpio', {\n type: 'boolean',\n desc: \"Forwards the browser's process stdout and stderr\",\n default: false,\n });\n },\n async args => {\n const extraArgs = args['--']?.filter(arg => {\n return typeof arg === 'string';\n });\n\n args.browser.buildId = this.#resolvePinnedBrowserIfNeeded(\n args.browser.buildId,\n args.browser.name,\n );\n\n const executablePath = args.system\n ? computeSystemExecutablePath({\n browser: args.browser.name,\n channel: verifyChromeReleaseChannel(args.browser.buildId),\n platform: args.platform,\n })\n : computeExecutablePath({\n browser: args.browser.name,\n buildId: args.browser.buildId,\n cacheDir: args.path ?? this.#cachePath,\n platform: args.platform,\n });\n launch({\n args: extraArgs,\n executablePath,\n dumpio: args.dumpio,\n detached: args.detached,\n });\n },\n )\n .command(\n 'clear',\n this.#allowCachePathOverride\n ? 'Removes all installed browsers from the specified cache directory'\n : `Removes all installed browsers from ${this.#cachePath}`,\n yargs => {\n return this.#definePathParameter(yargs, true);\n },\n async args => {\n const cacheDir = args.path ?? this.#cachePath;\n const rl = this.#rl ?? readline.createInterface({input, output});\n rl.question(\n `Do you want to permanently and recursively delete the content of ${cacheDir} (yes/No)? `,\n answer => {\n rl.close();\n if (!['y', 'yes'].includes(answer.toLowerCase().trim())) {\n console.log('Cancelled.');\n return;\n }\n const cache = new Cache(cacheDir);\n cache.clear();\n console.log(`${cacheDir} cleared.`);\n },\n );\n },\n )\n .command(\n 'list',\n 'List all installed browsers in the cache directory',\n yargs => {\n yargs.example(\n '$0 list',\n 'List all installed browsers in the cache directory',\n );\n if (this.#allowCachePathOverride) {\n yargs.example(\n '$0 list --path /tmp/my-browser-cache',\n 'List browsers installed in the specified cache directory',\n );\n }\n\n return this.#definePathParameter(yargs);\n },\n async args => {\n const cacheDir = args.path ?? this.#cachePath;\n const cache = new Cache(cacheDir);\n const browsers = cache.getInstalledBrowsers();\n\n for (const browser of browsers) {\n console.log(\n `${browser.browser}@${browser.buildId} (${browser.platform}) ${browser.executablePath}`,\n );\n }\n },\n )\n .command(\n 'bisect <path>',\n '(experimental) Bisect Chrome for Testing using the specified script. Downloads https://chromium.googlesource.com/chromium/src.git/+/main/tools/bisect-builds.py to ~/bisect-builds.py if needed.',\n yargs => {\n return yargs\n .positional('path', {\n type: 'string',\n description: 'Path to a script or test name to bisect.',\n demandOption: true,\n })\n .option('good', {\n type: 'string',\n alias: 'g',\n demandOption: true,\n desc: 'Last known good version',\n })\n .option('bad', {\n type: 'string',\n alias: 'b',\n demandOption: true,\n desc: 'First known bad version',\n })\n .option('cft', {\n type: 'boolean',\n desc: 'Use -cft',\n default: true,\n });\n },\n async args => {\n const isScript =\n args.path.endsWith('.mjs') ||\n args.path.endsWith('.cjs') ||\n args.path.endsWith('.js');\n const testCommand = isScript\n ? `PUPPETEER_EXECUTABLE_PATH=%p node ${args.path}`\n : `BINARY=%p npm run ${args.path}`;\n\n const bisectScriptPath = path.join(os.homedir(), 'bisect-builds.py');\n\n if (!fs.existsSync(bisectScriptPath)) {\n console.log('Downloading bisect-builds.py...');\n const response = await fetch(\n 'https://chromium.googlesource.com/chromium/src.git/+/main/tools/bisect-builds.py?format=TEXT',\n );\n if (!response.ok) {\n throw new Error(\n `Failed to download bisect-builds.py: ${response.statusText}`,\n );\n }\n const base64Text = await response.text();\n const decodedText = Buffer.from(base64Text, 'base64').toString(\n 'utf-8',\n );\n fs.writeFileSync(bisectScriptPath, decodedText, {mode: 0o755});\n console.log(`Saved bisect-builds.py to ${bisectScriptPath}`);\n }\n\n const pythonExecutable = 'python3';\n const bisectArgs = [\n bisectScriptPath,\n '-g',\n args.good,\n '-b',\n args.bad,\n args.cft ? '-cft' : '-s',\n '-v',\n '--verify-range',\n '--not-interactive',\n '-c',\n testCommand,\n ];\n\n await new Promise<void>((resolve, reject) => {\n const createProcess = spawn(pythonExecutable, bisectArgs, {\n stdio: 'inherit',\n });\n\n createProcess.on('error', message => {\n reject(message);\n });\n\n createProcess.on('exit', code => {\n if (code !== 0) {\n reject(new Error(`Process exited with code ${code}`));\n } else {\n resolve();\n }\n });\n });\n },\n )\n .demandCommand(1)\n .help();\n }\n\n #parseBrowser(version: string): Browser {\n return version.split('@').shift() as Browser;\n }\n\n #parseBuildId(version: string): string {\n const parts = version.split('@');\n return parts.length === 2\n ? parts[1]!\n : this.#pinnedBrowsers\n ? 'pinned'\n : 'latest';\n }\n\n #resolvePinnedBrowserIfNeeded(buildId: string, browserName: Browser): string {\n if (buildId === 'pinned') {\n const options = this.#pinnedBrowsers?.[browserName];\n if (!options || !options.buildId) {\n throw new Error(`No pinned version found for ${browserName}`);\n }\n return options.buildId;\n }\n return buildId;\n }\n\n async #install(args: InstallArgs) {\n if (!args.browser) {\n throw new Error(`No browser arg provided`);\n }\n if (!args.platform) {\n throw new Error(`Could not resolve the current platform`);\n }\n args.browser.buildId = this.#resolvePinnedBrowserIfNeeded(\n args.browser.buildId,\n args.browser.name,\n );\n const originalBuildId = args.browser.buildId;\n args.browser.buildId = await resolveBuildId(\n args.browser.name,\n args.platform,\n args.browser.buildId,\n );\n try {\n await install({\n browser: args.browser.name,\n buildId: args.browser.buildId,\n platform: args.platform,\n cacheDir: args.path ?? this.#cachePath,\n downloadProgressCallback: 'default',\n baseUrl: args.baseUrl,\n buildIdAlias:\n originalBuildId !== args.browser.buildId\n ? originalBuildId\n : undefined,\n installDeps: args.installDeps,\n });\n } catch (error) {\n if (!(error instanceof IncompleteInstallationError)) {\n throw error;\n }\n const command = this.#prefixCommand\n ? `${this.#scriptName} ${this.#prefixCommand.cmd}`\n : this.#scriptName;\n throw new Error(\n `${error.message}\\nYou can also empty the whole browser cache with \\`npx ${command} clear\\` and then run \\`npx ${command} install\\` again.`,\n {cause: error},\n );\n }\n const executablePath = computeExecutablePath({\n browser: args.browser.name,\n buildId: args.browser.buildId,\n cacheDir: args.path ?? this.#cachePath,\n platform: args.platform,\n });\n\n console.log(\n args.format\n .replace(/{{browser}}/g, args.browser.name)\n .replace(/{{buildId}}/g, args.browser.buildId)\n .replace(/{{path}}/g, executablePath)\n .replace(/{{platform}}/g, args.platform),\n );\n }\n}\n","/**\n * @license\n * Copyright 2026 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {Browser, BrowserPlatform} from './browser-data/browser-data.js';\n\n/**\n * Options passed to a provider.\n * @public\n */\nexport interface DownloadOptions {\n browser: Browser;\n platform: BrowserPlatform;\n buildId: string;\n}\n\n/**\n * Interface for custom browser provider implementations.\n * Allows users to implement alternative download sources for browsers.\n *\n * ⚠️ **IMPORTANT**: Custom providers are NOT officially supported by\n * Puppeteer.\n *\n * By implementing this interface, you accept full responsibility for:\n *\n * - Ensuring downloaded binaries are compatible with Puppeteer's expectations\n * - Testing that browser launch and other features work with your binaries\n * - Maintaining compatibility when Puppeteer or your download source changes\n * - Version consistency across platforms if mixing sources\n *\n * Puppeteer only tests and guarantees Chrome for Testing binaries.\n *\n * @example\n *\n * ```typescript\n * class ElectronDownloader implements BrowserProvider {\n * supports(options: DownloadOptions): boolean {\n * return options.browser === Browser.CHROMEDRIVER;\n * }\n *\n * getDownloadUrl(options: DownloadOptions): URL {\n * const platform = mapToPlatform(options.platform);\n * return new URL(\n * `v${options.buildId}/chromedriver-v${options.buildId}-${platform}.zip`,\n * 'https://github.com/electron/electron/releases/download/',\n * );\n * }\n *\n * getExecutablePath(options): string {\n * const ext = options.platform.includes('win') ? '.exe' : '';\n * return `chromedriver/chromedriver${ext}`;\n * }\n * }\n * ```\n *\n * @public\n */\nexport interface BrowserProvider {\n /**\n * Check if this provider supports the given browser/platform.\n * Used for filtering before attempting downloads.\n *\n * Can be synchronous for quick checks or asynchronous if version\n * resolution/network requests are needed.\n *\n * @param options - Download options to check\n * @returns True if this provider supports the browser/platform combination\n */\n supports(options: DownloadOptions): Promise<boolean> | boolean;\n\n /**\n * Get the download URL for the requested browser.\n *\n * The buildId can be either an exact version (e.g., \"131.0.6778.109\")\n * or an alias (e.g., \"latest\", \"stable\"). Custom providers should handle\n * version resolution internally if they support aliases.\n *\n * Returns null if the buildId cannot be resolved to a valid version.\n * The URL is not validated - download will fail later if URL doesn't exist.\n *\n * Can be synchronous for simple URL construction or asynchronous if version\n * resolution/network requests are needed.\n *\n * @param options - Download options (buildId may be alias or exact version)\n * @returns Download URL, or null if version cannot be resolved\n * @example\n *\n * ```ts\n * // Synchronous example\n * getDownloadUrl(options) {\n * const platform = mapPlatform(options.platform);\n * return new URL(`https://releases.example.com/v${options.buildId}/${platform}.zip`);\n * }\n *\n * // Asynchronous example with version mapping\n * async getDownloadUrl(options) {\n * const electronVersion = await resolveElectronVersion(options.buildId);\n * if (!electronVersion) return null;\n *\n * const platform = mapPlatform(options.platform);\n * return new URL(`https://github.com/electron/electron/releases/download/v${electronVersion}/${platform}.zip`);\n * }\n * ```\n */\n getDownloadUrl(options: DownloadOptions): Promise<URL | null> | URL | null;\n\n /**\n * Get the relative path to the executable within the extracted archive.\n *\n * @param options - Browser, buildId, and platform\n * @returns Relative path to the executable\n * @example\n *\n * ```ts\n * // Electron uses simple structure\n * getExecutablePath() {\n * return 'chromedriver/chromedriver';\n * }\n *\n * // Custom provider with platform-specific paths\n * getExecutablePath(options) {\n * return `binaries/${options.browser}-${options.platform}`;\n * }\n * ```\n */\n getExecutablePath(options: {\n browser: Browser;\n buildId: string;\n platform: BrowserPlatform;\n }): Promise<string> | string;\n\n /**\n * Get the name of this provider.\n * Used for error messages and logging purposes.\n *\n * @returns The provider name (e.g., \"DefaultProvider\", \"CustomProvider\")\n *\n * @remarks\n * This method is used instead of `constructor.name` to avoid issues with\n * minification in production builds.\n *\n * @example\n *\n * ```ts\n * getName() {\n * return 'MyCustomProvider';\n * }\n * ```\n */\n getName(): string;\n}\n\n/**\n * Utility function to build a standard archive filename.\n * @public\n */\nexport function buildArchiveFilename(\n browser: Browser,\n platform: BrowserPlatform,\n buildId: string,\n extension = 'zip',\n): string {\n return `${browser}-${platform}-${buildId}.${extension}`;\n}\n"],"mappings":";;;;;AAMA,OAAO,kBAAkB;AACzB,SAAQ,oBAAmB;AAC3B,SAAQ,kBAAiB;AACzB,OAAOA,SAAQ;AACf,OAAO,cAAc;;;ACLrB,OAAOC,WAAU;;;ACCjB,SAAQ,gBAAe;AACvB,OAAO,QAAQ;AACf,OAAO,UAAU;;;ACFjB,SAAQ,kBAAiB;AACzB,SAAQ,mBAAmB,kBAAiB;AAC5C,YAAY,UAAU;AACtB,YAAY,WAAW;AACvB,SAAQ,OAAAC,MAAK,wBAAuB;AAEpC,eAAsB,gBAAgB,KAAQ;AAC5C,SAAO,MAAM,IAAI,QAAQ,CAAAC,aAAU;AACjC,gBACE,KACA,QACA,cAAW;AAET,eAAS,OAAM;AACf,MAAAA,SAAQ,SAAS,eAAe,GAAG;IACrC,GACA,KAAK,EAEJ,KAAK,CAAAC,aAAU;AACd,MAAAA,SAAQ,GAAG,SAAS,MAAK;AACvB,QAAAD,SAAQ,KAAK;MACf,CAAC;IACH,CAAC,EACA,MAAM,MAAK;AACV,MAAAA,SAAQ,KAAK;IACf,CAAC;EACL,CAAC;AACH;AAEA,eAAsB,YACpB,KACA,QACA,UACA,YAAY,MAAI;AAEhB,MAAI;AACJ,MAAI;AACF,UAAM,EAAC,WAAU,IAAI,MAAM,OAAO,oBAAa;AAC/C,YAAQ,IAAI,WAAU;EACxB,QAAQ;EAER;AAEA,QAAM,UAA+B;IACnC,UAAU,IAAI;IACd,UAAU,IAAI;IACd,MAAM,IAAI;IACV,MAAM,IAAI,WAAW,IAAI;IACzB;IACA,SAAS,YAAY,EAAC,YAAY,aAAY,IAAI;IAClD,MAAM,iBAAiB,GAAG,EAAE;IAC5B;;AAGF,QAAM,kBAAkB,CAAC,QAAmC;AAC1D,QACE,IAAI,cACJ,IAAI,cAAc,OAClB,IAAI,aAAa,OACjB,IAAI,QAAQ,UACZ;AACA,WAAK,YAAY,IAAID,KAAI,IAAI,QAAQ,QAAQ,GAAG,QAAQ,QAAQ;AAGhE,UAAI,OAAM;IACZ,OAAO;AACL,eAAS,GAAG;IACd;EACF;AACA,QAAME,WACJ,QAAQ,aAAa,WACX,cAAQ,SAAS,eAAe,IACjC,aAAQ,SAAS,eAAe;AAC3C,EAAAA,SAAQ,IAAG;AACX,SAAOA;AACT;AAEA,IAAM,eAAN,MAAkB;EACP,QAAQ,WAAW,QAAQ;EAEpC,OAAO,OAAa;AAClB,SAAK,MAAM,OAAO,KAAK;EACzB;EAEA,OAAO,KAAU,iBAAyB,cAAoB;AAC5D,UAAM,aAAa,KAAK,MAAM,OAAO,KAAK;AAC1C,QAAI,eAAe,aAAa,YAAW,GAAI;AAC7C,UAAI;AACF,mBAAW,eAAe;MAC5B,QAAQ;MAAC;AACT,YAAM,IAAI,MACR;cACiB,GAAG;cACH,aAAa,YAAW,CAAE;cAC1B,UAAU,EAAE;IAEjC;EACF;;AAMI,SAAU,aACd,KACA,iBACA,kBACA,cAAqB;AAErB,SAAO,IAAI,QAAc,OAAOD,UAAS,WAAU;AACjD,QAAI,kBAAkB;AACtB,QAAI,aAAa;AACjB,UAAM,WAAW,eAAe,IAAI,aAAY,IAAK;AAErD,QAAI;AACF,YAAMC,WAAU,MAAM,YAAY,KAAK,OAAO,cAAW;AACvD,YAAI,SAAS,eAAe,KAAK;AAC/B,gBAAM,QAAQ,IAAI,MAChB,yCAAyC,SAAS,UAAU,UAAU,GAAG,EAAE;AAG7E,mBAAS,OAAM;AACf,iBAAO,KAAK;AACZ;QACF;AACA,cAAM,OAAO,kBAAkB,eAAe;AAC9C,aAAK,GAAG,SAAS,MAAK;AACpB,cAAI,YAAY,cAAc;AAC5B,gBAAI;AACF,uBAAS,OAAO,KAAK,iBAAiB,YAAY;YACpD,SAAS,KAAK;AACZ,qBAAO,GAAG;AACV;YACF;UACF;AACA,iBAAOD,SAAO;QAChB,CAAC;AACD,aAAK,GAAG,SAAS,WAAQ;AACvB,iBAAO,OAAO,KAAK;QACrB,CAAC;AACD,qBAAa,SAAS,SAAS,QAAQ,gBAAgB,GAAI,EAAE;AAC7D,iBAAS,GAAG,QAAQ,CAAC,UAAiB;AACpC,6BAAmB,MAAM;AACzB,oBAAU,OAAO,KAAK;AACtB,cAAI,kBAAkB;AACpB,6BAAiB,iBAAiB,UAAU;UAC9C;QACF,CAAC;AACD,iBAAS,KAAK,IAAI;MACpB,CAAC;AACD,MAAAC,SAAQ,GAAG,SAAS,WAAQ;AAC1B,eAAO,OAAO,KAAK;MACrB,CAAC;IACH,SAAS,OAAO;AACd,aAAO,KAAK;IACd;EACF,CAAC;AACH;AAEA,eAAsB,QAAQ,KAAQ;AACpC,QAAM,OAAO,MAAM,QAAQ,GAAG;AAC9B,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,+BAA+B,IAAI,SAAQ,CAAE;EAC/D;AACF;AAEM,SAAU,QAAQ,KAAQ;AAC9B,SAAO,IAAI,QAAQ,OAAOD,UAAS,WAAU;AAC3C,QAAI;AACF,YAAMC,WAAU,MAAM,YACpB,KACA,OACA,cAAW;AACT,YAAI,OAAO;AACX,YAAI,SAAS,cAAc,SAAS,cAAc,KAAK;AACrD,iBAAO,OAAO,IAAI,MAAM,mBAAmB,SAAS,UAAU,EAAE,CAAC;QACnE;AACA,iBAAS,GAAG,QAAQ,WAAQ;AAC1B,kBAAQ;QACV,CAAC;AACD,iBAAS,GAAG,OAAO,MAAK;AACtB,cAAI;AACF,mBAAOD,SAAQ,OAAO,IAAI,CAAC;UAC7B,QAAQ;AACN,mBAAO,OACL,IAAI,MAAM,qCAAqC,GAAG,EAAE,CAAC;UAEzD;QACF,CAAC;MACH,GACA,KAAK;AAEP,MAAAC,SAAQ,GAAG,SAAS,SAAM;AACxB,eAAO,GAAG;MACZ,CAAC;IACH,SAAS,KAAK;AACZ,aAAO,GAAG;IACZ;EACF,CAAC;AACH;;;ACpMA,IAAY;CAAZ,SAAYC,UAAO;AACjB,EAAAA,SAAA,QAAA,IAAA;AACA,EAAAA,SAAA,qBAAA,IAAA;AACA,EAAAA,SAAA,UAAA,IAAA;AACA,EAAAA,SAAA,SAAA,IAAA;AACA,EAAAA,SAAA,cAAA,IAAA;AACF,GANY,YAAA,UAAO,CAAA,EAAA;AAcnB,IAAY;CAAZ,SAAYC,kBAAe;AACzB,EAAAA,iBAAA,OAAA,IAAA;AACA,EAAAA,iBAAA,WAAA,IAAA;AACA,EAAAA,iBAAA,KAAA,IAAA;AACA,EAAAA,iBAAA,SAAA,IAAA;AACA,EAAAA,iBAAA,OAAA,IAAA;AACA,EAAAA,iBAAA,OAAA,IAAA;AACF,GAPY,oBAAA,kBAAe,CAAA,EAAA;AAiB3B,IAAY;CAAZ,SAAYC,aAAU;AACpB,EAAAA,YAAA,QAAA,IAAA;AACA,EAAAA,YAAA,SAAA,IAAA;AACA,EAAAA,YAAA,MAAA,IAAA;AACA,EAAAA,YAAA,KAAA,IAAA;AACA,EAAAA,YAAA,YAAA,IAAA;AACA,EAAAA,YAAA,QAAA,IAAA;AACA,EAAAA,YAAA,KAAA,IAAA;AACA,EAAAA,YAAA,QAAA,IAAA;AACF,GATY,eAAA,aAAU,CAAA,EAAA;AAsBtB,IAAY;CAAZ,SAAYC,uBAAoB;AAC9B,EAAAA,sBAAA,QAAA,IAAA;AACA,EAAAA,sBAAA,KAAA,IAAA;AACA,EAAAA,sBAAA,QAAA,IAAA;AACA,EAAAA,sBAAA,MAAA,IAAA;AACF,GALY,yBAAA,uBAAoB,CAAA,EAAA;AAU1B,SAAU,2BACd,OAAc;AAEd,MAAI,OAAO,OAAO,oBAAoB,EAAE,SAAS,KAAY,GAAG;AAC9D,WAAO;EACT;AACA,QAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AACpD;;;AFnEA,SAAS,OAAO,UAA2B,SAAgB;AACzD,UAAQ,UAAU;IAChB,KAAK,gBAAgB;AACnB,UAAI,WAAW,gBAAgB,SAAS,cAAc,IAAI,GAAG;AAC3D,eAAO;MACT;AACA,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;EACX;AACF;AAEM,SAAU,mBACd,UACA,SACA,UAAU,4DAA0D;AAEpE,SAAO,GAAG,OAAO,IAAI,oBAAoB,UAAU,OAAO,EAAE,KAAK,GAAG,CAAC;AACvE;AAEM,SAAU,oBACd,UACA,SAAe;AAEf,SAAO;IACL;IACA,OAAO,UAAU,OAAO;IACxB,UAAU,OAAO,UAAU,OAAO,CAAC;;AAEvC;AAEM,SAAU,uBACd,UACA,SAAe;AAEf,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,KAAK,KACV,YAAY,OAAO,UAAU,OAAO,GACpC,iCACA,YACA,SACA,2BAA2B;IAE/B,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,KAAK,KAAK,YAAY,OAAO,UAAU,OAAO,GAAG,QAAQ;IAClE,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,KAAK,KAAK,YAAY,OAAO,UAAU,OAAO,GAAG,YAAY;EACxE;AACF;AAEA,IAAI,iBAAiB;AASrB,eAAsB,kCACpB,SAA6B;AAE7B,QAAM,OAAQ,MAAM,QAClB,IAAI,IAAI,GAAG,cAAc,gCAAgC,CAAC;AAK5D,aAAWC,YAAW,OAAO,KAAK,KAAK,QAAQ,GAAG;AAChD,SAAK,SAASA,SAAQ,YAAW,CAAE,IAAI,KAAK,SAASA,QAAO;AAC5D,WAAO,KAAK,SAASA,QAAO;EAC9B;AAEA,SACE,KAMA,SAAS,OAAO;AACpB;AAEA,eAAsB,oCACpB,WAAiB;AAEjB,QAAM,OAAQ,MAAM,QAClB,IAAI,IAAI,GAAG,cAAc,qCAAqC,CAAC;AAIjE,SAAO,KAAK,WAAW,SAAS;AAElC;AAEA,eAAsB,gCAIpB,aAAmB;AAEnB,QAAM,OAAQ,MAAM,QAClB,IAAI,IAAI,GAAG,cAAc,uCAAuC,CAAC;AAInE,SAAO,KAAK,OAAO,WAAW;AAEhC;AAQA,eAAsB,eACpB,SAAsC;AAEtC,MACE,OAAO,OAAO,oBAAoB,EAAE,SAClC,OAA+B,GAEjC;AACA,YACE,MAAM,kCAAkC,OAA+B,GACvE;EACJ;AACA,MAAI,QAAQ,MAAM,OAAO,GAAG;AAE1B,YAAQ,MAAM,oCAAoC,OAAO,IAAI;EAC/D;AACA,MAAI,QAAQ,MAAM,iBAAiB,GAAG;AAEpC,YAAQ,MAAM,gCAAgC,OAAO,IAAI;EAC3D;AACA;AACF;AACA,IAAM,0BAA0B;EAC9B;EACA;EACA;;EAEA;;AAGF,SAAS,yBACP,SACA,mBAA8B;AAE9B,MAAI,kBAAkB,SAAS,GAAG;AAChC,UAAM,IAAI,MAAM,kDAAkD;EACpE;AAEA,MAAI;AACJ,UAAQ,SAAS;IACf,KAAK,qBAAqB;AACxB,eAAS;AACT;IACF,KAAK,qBAAqB;AACxB,eAAS;AACT;IACF,KAAK,qBAAqB;AACxB,eAAS;AACT;IACF,KAAK,qBAAqB;AACxB,eAAS;AACT;EACJ;AAEA,SAAO,CAAC,GAAG,kBAAkB,OAAM,CAAE,EAAE,IAAI,OAAI;AAC7C,WAAO,KAAK,MAAM,KAAK,GAAG,MAAM;EAClC,CAAC;AACH;AAEA,SAAS,eAAe,UAAgB;AACtC,MAAI;AAMF,UAAM,SAAS,SACb,oBAAoB,SAAS,kBAAiB,CAAE,KAChD;;;MAGE,OAAO,CAAC,UAAU,QAAQ,QAAQ;MAClC,UAAU;KACX,EACD,KAAI;AACN,QAAI,QAAQ;AACV,aAAO;IACT;EACF,QAAQ;EAAC;AACT;AACF;AAEA,SAAS,eAAe,SAA6B;AACnD,QAAM,aAAa,SAAS,qBAAqB;IAC/C,OAAO,CAAC,UAAU,QAAQ,QAAQ;IAClC,UAAU;GACX,EAAE,KAAI;AACP,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,2CAA2C;EAC7D;AACA,QAAM,cAAc,oBAAI,IAAG;AAC3B,aAAW,QAAQ,yBAAyB;AAC1C,UAAM,YAAY,eAAe,IAAI;AACrC,QAAI,WAAW;AACb,kBAAY,IAAI,SAAS;IAC3B;EACF;AACA,QAAM,cAAc,yBAAyB,SAAS,WAAW;AAEjE,SAAO,YAAY,IAAI,CAAAC,WAAO;AAG5B,WAAO,SAAS,YAAYA,MAAI,GAAG,EAAE,SAAQ,EAAG,KAAI;EACtD,CAAC;AACH;AAEA,SAAS,4BACP,SAA6B;AAE7B,QAAM,YAAsB,CAAA;AAE5B,UAAQ,SAAS;IACf,KAAK,qBAAqB;AACxB,gBAAU,KAAK,2BAA2B;AAC1C;IACF,KAAK,qBAAqB;AACxB,gBAAU,KAAK,gCAAgC;AAC/C;IACF,KAAK,qBAAqB;AACxB,gBAAU,KAAK,kCAAkC;AACjD;IACF,KAAK,qBAAqB;AACxB,gBAAU,KAAK,oCAAoC;AACnD;EACJ;AAEA,MAAI;AACF,UAAM,UAAU,eAAe,OAAO;AACtC,QAAI,SAAS;AACX,gBAAU,KAAK,GAAG,OAAO;IAC3B;EACF,QAAQ;EAER;AAEA,SAAO;AACT;AAEM,SAAU,6BACd,UACA,SAA6B;AAE7B,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,YAAM,iBAAiB,IAAI,IACzB,wBAAwB,IAAI,UAAO;AACjC,eAAO,QAAQ,IAAI,IAAI;MACzB,CAAC,EAAE,OAAO,CAAC,MAAkB;AAC3B,eAAO,CAAC,CAAC;MACX,CAAC,CAAC;AAGJ,qBAAe,IAAI,mBAAmB;AACtC,qBAAe,IAAI,yBAAyB;AAC5C,qBAAe,IAAI,mBAAmB;AACtC,qBAAe,IAAI,yBAAyB;AAC5C,aAAO,yBAAyB,SAAS,cAAc;IACzD,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,cAAQ,SAAS;QACf,KAAK,qBAAqB;AACxB,iBAAO;YACL;;QAEJ,KAAK,qBAAqB;AACxB,iBAAO;YACL;;QAEJ,KAAK,qBAAqB;AACxB,iBAAO;YACL;;QAEJ,KAAK,qBAAqB;AACxB,iBAAO;YACL;;MAEN;IACF,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,4BAA4B,OAAO;EAC9C;AACF;AAEM,SAAU,0BACd,UACA,SAA6B;AAE7B,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AAEnB,cAAQ,SAAS;QACf,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KACV,mBAAkB,GAClB,UACA,UACA,WAAW;QAEf,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KACV,mBAAkB,GAClB,UACA,eACA,WAAW;QAEf,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KACV,mBAAkB,GAClB,UACA,cACA,WAAW;QAEf,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KACV,mBAAkB,GAClB,UACA,cACA,WAAW;MAEjB;IACF,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AAEnB,cAAQ,SAAS;QACf,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,0BAAyB,GAAI,QAAQ;QACxD,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,0BAAyB,GAAI,aAAa;QAC7D,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,0BAAyB,GAAI,YAAY;QAC5D,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,0BAAyB,GAAI,eAAe;MACjE;IACF,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AAEnB,cAAQ,SAAS;QACf,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,mBAAkB,GAAI,eAAe;QACxD,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,mBAAkB,GAAI,oBAAoB;QAC7D,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,mBAAkB,GAAI,sBAAsB;QAC/D,KAAK,qBAAqB;AACxB,iBAAO,KAAK,KAAK,mBAAkB,GAAI,wBAAwB;MACnE;EACJ;AACF;AAEA,SAAS,qBAAkB;AACzB,SACE,QAAQ,IAAI,cAAc,KAAK,KAAK,KAAK,GAAG,QAAO,GAAI,WAAW,OAAO;AAE7E;AAEA,SAAS,qBAAkB;AACzB,SACE,QAAQ,IAAI,oBAAoB,KAChC,QAAQ,IAAI,iBAAiB,KAC7B,KAAK,KAAK,GAAG,QAAO,GAAI,SAAS;AAErC;AAEA,SAAS,4BAAyB;AAChC,SAAO,KAAK,KAAK,GAAG,QAAO,GAAI,WAAW,uBAAuB,QAAQ;AAC3E;AAEM,SAAU,gBAAgB,GAAW,GAAS;AAClD,QAAM,SAAS,EAAE,KAAI;AACrB,QAAM,SAAS,EAAE,KAAI;AAErB,QAAM,eAAe;AACrB,MAAI,CAAC,aAAa,KAAK,MAAM,GAAG;AAC9B,UAAM,IAAI,MAAM,WAAW,CAAC,gCAAgC;EAC9D;AACA,MAAI,CAAC,aAAa,KAAK,MAAM,GAAG;AAC9B,UAAM,IAAI,MAAM,WAAW,CAAC,gCAAgC;EAC9D;AAEA,QAAM,SAAS,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3C,QAAM,SAAS,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAE3C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,QAAQ,OAAO,CAAC,KAAK;AAC3B,UAAM,QAAQ,OAAO,CAAC,KAAK;AAE3B,QAAI,QAAQ,OAAO;AACjB,aAAO;IACT;AACA,QAAI,QAAQ,OAAO;AACjB,aAAO;IACT;EACF;AAEA,SAAO;AACT;;;AD7aA,SAASC,QAAO,UAA2B,SAAgB;AACzD,UAAQ,UAAU;IAChB,KAAK,gBAAgB;AACnB,UAAI,WAAW,gBAAgB,SAAS,cAAc,IAAI,GAAG;AAC3D,eAAO;MACT;AACA,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;EACX;AACF;AAEM,SAAUC,oBACd,UACA,SACA,UAAU,4DAA0D;AAEpE,SAAO,GAAG,OAAO,IAAIC,qBAAoB,UAAU,OAAO,EAAE,KAAK,GAAG,CAAC;AACvE;AAEM,SAAUA,qBACd,UACA,SAAe;AAEf,SAAO;IACL;IACAF,QAAO,UAAU,OAAO;IACxB,yBAAyBA,QAAO,UAAU,OAAO,CAAC;;AAEtD;AAEM,SAAUG,wBACd,UACA,SAAe;AAEf,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOC,MAAK,KACV,2BAA2BJ,QAAO,UAAU,OAAO,GACnD,uBAAuB;IAE3B,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOI,MAAK,KACV,2BAA2BJ,QAAO,UAAU,OAAO,GACnD,uBAAuB;IAE3B,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOI,MAAK,KACV,2BAA2BJ,QAAO,UAAU,OAAO,GACnD,2BAA2B;EAEjC;AACF;;;AIpEA,OAAOK,WAAU;AAKjB,SAASC,QAAO,UAA2B,SAAgB;AACzD,UAAQ,UAAU;IAChB,KAAK,gBAAgB;AACnB,UAAI,WAAW,gBAAgB,SAAS,cAAc,IAAI,GAAG;AAC3D,eAAO;MACT;AACA,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;EACX;AACF;AAEM,SAAUC,oBACd,UACA,SACA,UAAU,4DAA0D;AAEpE,SAAO,GAAG,OAAO,IAAIC,qBAAoB,UAAU,OAAO,EAAE,KAAK,GAAG,CAAC;AACvE;AAEM,SAAUA,qBACd,UACA,SAAe;AAEf,SAAO;IACL;IACAF,QAAO,UAAU,OAAO;IACxB,gBAAgBA,QAAO,UAAU,OAAO,CAAC;;AAE7C;AAEM,SAAUG,wBACd,UACA,SAAe;AAEf,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOC,MAAK,KACV,kBAAkBJ,QAAO,UAAU,OAAO,GAC1C,cAAc;IAElB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOI,MAAK,KACV,kBAAkBJ,QAAO,UAAU,OAAO,GAC1C,cAAc;IAElB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOI,MAAK,KACV,kBAAkBJ,QAAO,UAAU,OAAO,GAC1C,kBAAkB;EAExB;AACF;;;ACnEA,OAAOK,WAAU;AAMjB,SAAS,QAAQ,UAA2B,SAAe;AACzD,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AAEnB,aAAO,SAAS,SAAS,EAAE,IAAI,SAAS,eAAe;EAC3D;AACF;AAEA,SAASC,QAAO,UAAyB;AACvC,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;EACX;AACF;AAEM,SAAUC,oBACd,UACA,SACA,UAAU,6DAA2D;AAErE,SAAO,GAAG,OAAO,IAAIC,qBAAoB,UAAU,OAAO,EAAE,KAAK,GAAG,CAAC;AACvE;AAEM,SAAUA,qBACd,UACA,SAAe;AAEf,SAAO,CAACF,QAAO,QAAQ,GAAG,SAAS,GAAG,QAAQ,UAAU,OAAO,CAAC,MAAM;AACxE;AAEM,SAAUG,wBACd,UACA,UAAgB;AAEhB,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOC,MAAK,KACV,cACA,gBACA,YACA,SACA,UAAU;IAEd,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOA,MAAK,KAAK,gBAAgB,QAAQ;IAC3C,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAOA,MAAK,KAAK,cAAc,YAAY;EAC/C;AACF;AACA,eAAsBC,gBACpB,UAAyB;AAEzB,SAAO,MAAM,QACX,IAAI,IACF,6DAA6DL,QAC3D,QAAQ,CACT,cAAc,CAChB;AAEL;AAEM,SAAUM,iBAAgB,GAAW,GAAS;AAClD,SAAO,OAAO,CAAC,IAAI,OAAO,CAAC;AAC7B;;;ACxFA,OAAO,QAAQ;AACf,OAAOC,WAAU;AAMjB,SAAS,UAAU,SAAe;AAChC,QAAM,eAAe,OAAO,QAAQ,MAAM,GAAG,EAAE,MAAK,CAAG;AACvD,SAAO,gBAAgB,MAAM,OAAO;AACtC;AAEA,SAAS,eAAe,UAA2B,SAAe;AAChE,UAAQ,UAAU;IAChB,KAAK,gBAAgB;AACnB,aAAO,WAAW,OAAO,2BAA2B,UAAU,OAAO,CAAC;IACxE,KAAK,gBAAgB;AACnB,aAAO,WAAW,OAAO,4BAA4B,UAAU,OAAO,CAAC;IACzE,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,WAAW,OAAO;IAC3B,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,WAAW,OAAO,UAAU,QAAQ;EAC/C;AACF;AAEA,SAASC,SAAQ,UAA2B,SAAe;AACzD,UAAQ,UAAU;IAChB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,WAAW,OAAO,QAAQ,UAAU,OAAO,CAAC;IACrD,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,WAAW,OAAO;IAC3B,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO,iBAAiB,OAAO;EACnC;AACF;AAEA,SAAS,aAAa,UAAyB;AAC7C,UAAQ,UAAU;IAChB,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO;IACT,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;AACnB,aAAO;EACX;AACF;AAEA,SAAS,aAAa,SAAe;AACnC,aAAW,SAAS,OAAO,OAAO,cAAc,GAAG;AACjD,QAAI,QAAQ,WAAW,QAAQ,GAAG,GAAG;AACnC,gBAAU,QAAQ,UAAU,MAAM,SAAS,CAAC;AAC5C,aAAO,CAAC,OAAO,OAAO;IACxB;EACF;AAEA,SAAO,CAAC,eAAe,SAAS,OAAO;AACzC;AAEM,SAAUC,oBACd,UACA,SACA,SAAgB;AAEhB,QAAM,CAAC,OAAO,IAAI,aAAa,OAAO;AACtC,UAAQ,SAAS;IACf,KAAK,eAAe;AAClB,kBACE;AACF;IACF,KAAK,eAAe;AAClB,kBAAY;AACZ;IACF,KAAK,eAAe;IACpB,KAAK,eAAe;IACpB,KAAK,eAAe;AAClB,kBAAY;AACZ;EACJ;AACA,SAAO,GAAG,OAAO,IAAIC,qBAAoB,UAAU,OAAO,EAAE,KAAK,GAAG,CAAC;AACvE;AAEM,SAAUA,qBACd,UACA,SAAe;AAEf,QAAM,CAAC,SAAS,eAAe,IAAI,aAAa,OAAO;AACvD,UAAQ,SAAS;IACf,KAAK,eAAe;AAClB,aAAO,CAAC,eAAe,UAAU,eAAe,CAAC;IACnD,KAAK,eAAe;IACpB,KAAK,eAAe;IACpB,KAAK,eAAe;IACpB,KAAK,eAAe;AAClB,aAAO;QACL;QACA,aAAa,QAAQ;QACrB;QACAF,SAAQ,UAAU,eAAe;;EAEvC;AACF;AAEM,SAAUG,wBACd,UACA,SAAe;AAEf,QAAM,CAAC,OAAO,IAAI,aAAa,OAAO;AACtC,UAAQ,SAAS;IACf,KAAK,eAAe;AAClB,cAAQ,UAAU;QAChB,KAAK,gBAAgB;QACrB,KAAK,gBAAgB;AACnB,iBAAOC,MAAK,KACV,uBACA,YACA,SACA,SAAS;QAEb,KAAK,gBAAgB;QACrB,KAAK,gBAAgB;AACnB,iBAAOA,MAAK,KAAK,WAAW,SAAS;QACvC,KAAK,gBAAgB;QACrB,KAAK,gBAAgB;AACnB,iBAAOA,MAAK,KAAK,WAAW,aAAa;MAC7C;IACF,KAAK,eAAe;IACpB,KAAK,eAAe;IACpB,KAAK,eAAe;IACpB,KAAK,eAAe;AAClB,cAAQ,UAAU;QAChB,KAAK,gBAAgB;QACrB,KAAK,gBAAgB;AACnB,iBAAOA,MAAK,KAAK,eAAe,YAAY,SAAS,SAAS;QAChE,KAAK,gBAAgB;QACrB,KAAK,gBAAgB;AACnB,iBAAOA,MAAK,KAAK,WAAW,SAAS;QACvC,KAAK,gBAAgB;QACrB,KAAK,gBAAgB;AACnB,iBAAOA,MAAK,KAAK,QAAQ,aAAa;MAC1C;EACJ;AACF;AAEA,IAAY;CAAZ,SAAYC,iBAAc;AACxB,EAAAA,gBAAA,QAAA,IAAA;AACA,EAAAA,gBAAA,KAAA,IAAA;AACA,EAAAA,gBAAA,YAAA,IAAA;AACA,EAAAA,gBAAA,MAAA,IAAA;AACA,EAAAA,gBAAA,SAAA,IAAA;AACF,GANY,mBAAA,iBAAc,CAAA,EAAA;AAQ1B,IAAIC,kBAAiB;AAUrB,eAAsBC,gBACpB,UAA0B,eAAe,SAAO;AAEhD,QAAM,sBAAsB;IAC1B,CAAC,eAAe,GAAG,GAAG;IACtB,CAAC,eAAe,MAAM,GAAG;IACzB,CAAC,eAAe,UAAU,GAAG;IAC7B,CAAC,eAAe,IAAI,GAAG;IACvB,CAAC,eAAe,OAAO,GAAG;;AAE5B,QAAM,WAAY,MAAM,QACtB,IAAI,IAAI,GAAGC,eAAc,wBAAwB,CAAC;AAEpD,QAAM,UAAU,SAAS,oBAAoB,OAAO,CAAC;AACrD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,WAAW,OAAO,gBAAgB;EACpD;AACA,SAAO,UAAU,MAAM;AACzB;AAEA,eAAsB,cAAc,SAAuB;AACzD,MAAI,CAAC,GAAG,WAAW,QAAQ,IAAI,GAAG;AAChC,UAAM,GAAG,SAAS,MAAM,QAAQ,MAAM;MACpC,WAAW;KACZ;EACH;AACA,QAAM,gBAAgB;IACpB,aAAa;MACX,GAAG,0BAA0B,QAAQ,WAAW;MAChD,GAAG,QAAQ;;IAEb,MAAM,QAAQ;GACf;AACH;AAEA,SAAS,0BACP,YAAmC;AAEnC,QAAM,SAAS;AAEf,QAAM,eAAe;;IAEnB,wBAAwB;;IAExB,+BAA+B;;IAE/B,iCAAiC;;IAGjC,gCAAgC;;;IAIhC,6CACE;;;;IAKF,mCAAmC;;IAEnC,8DAA8D;;IAE9D,8BAA8B;;;IAG9B,6CAA6C;;IAG7C,4CAA4C;IAC5C,0CAA0C;IAC1C,wCAAwC;IACxC,yCAAyC;;IAGzC,yBAAyB;;IAEzB,0CAA0C;;IAE1C,qCAAqC;;IAGrC,4BAA4B;;IAE5B,4CAA4C;;IAE5C,wBAAwB;;;;IAKxB,+CAA+C;;IAE/C,qCAAqC;;IAErC,2BAA2B;;IAG3B,2CAA2C;;IAG3C,0BAA0B;;;IAG1B,mCAAmC;;IAEnC,oCAAoC;;IAEpC,sBAAsB;;IAGtB,gDAAgD,UAAU,MAAM;IAChE,qDAAqD;IACrD,8CAA8C;IAC9C,+CAA+C;IAC/C,4CAA4C;;IAG5C,8CAA8C;IAC9C,+DAA+D;;;IAI/D,6BAA6B;;IAG7B,gCAAgC;;;IAIhC,0BAA0B;;IAG1B,8BAA8B;;IAG9B,kCAAkC;IAClC,2BAA2B;;;IAI3B,gCAAgC;IAChC,4BAA4B;;IAG5B,sCAAsC;;IAGtC,kCAAkC;;IAGlC,6BAA6B;;IAG7B,gCAAgC;;IAGhC,qCAAqC,UAAU,MAAM;;IAGrD,yBAAyB;;IAGzB,qCAAqC;;;IAIrC,wBAAwB;;IAGxB,iBAAiB;;IAGjB,uBAAuB;;IAGvB,oCAAoC;;IAGpC,mCAAmC;;IAGnC,8BAA8B;;IAG9B,wCAAwC;;IAGxC,qCAAqC;;;IAIrC,2CAA2C;;IAG3C,iCAAiC;;IAGjC,sBAAsB;;IAGtB,sBAAsB;IAEtB,sCAAsC;;;IAItC,4CAA4C;;IAG5C,yCAAyC;;IAGzC,4CAA4C;;;IAI5C,yCAAyC;;IAGzC,sCAAsC;;IAGtC,4BAA4B;;;IAI5B,wBAAwB;;;IAIxB,0BAA0B;;IAG1B,gCAAgC;;IAGhC,2CAA2C;;IAG3C,sCAAsC;;IAGtC,uCAAuC;;AAGzC,SAAO,OAAO,OAAO,cAAc,UAAU;AAC/C;AAEA,eAAe,WAAWC,QAAa;AACrC,MAAI,CAAC,GAAG,WAAWA,MAAK,GAAG;AACzB;EACF;AACA,QAAM,GAAG,SAAS,SAASA,QAAOA,SAAQ,YAAY;AACxD;AASA,eAAe,gBAAgB,SAAuB;AACpD,QAAM,YAAYC,MAAK,KAAK,QAAQ,MAAM,UAAU;AACpD,QAAM,WAAWA,MAAK,KAAK,QAAQ,MAAM,SAAS;AAElD,QAAM,QAAQ,OAAO,QAAQ,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAK;AACrE,WAAO,aAAa,KAAK,UAAU,GAAG,CAAC,KAAK,KAAK,UAAU,KAAK,CAAC;EACnE,CAAC;AAGD,QAAM,SAAS,MAAM,QAAQ,WAAW;IACtC,WAAW,QAAQ,EAAE,KAAK,YAAW;AACnC,YAAM,GAAG,SAAS,UAAU,UAAU,MAAM,KAAK,IAAI,CAAC;IACxD,CAAC;IACD,WAAW,SAAS;GACrB;AACD,aAAW,WAAW,QAAQ;AAC5B,QAAI,QAAQ,WAAW,YAAY;AACjC,YAAM,QAAQ;IAChB;EACF;AACF;AAEM,SAAUC,iBAAgB,GAAW,GAAS;AAElD,SAAO,SAAS,EAAE,QAAQ,KAAK,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,QAAQ,KAAK,EAAE,GAAG,EAAE;AAC3E;;;AC1bO,IAAM,eAAe;EAC1B,CAAC,QAAQ,YAAY,GAAgBC;EACrC,CAAC,QAAQ,mBAAmB,GAAuBA;EACnD,CAAC,QAAQ,MAAM,GAAU;EACzB,CAAC,QAAQ,QAAQ,GAAYA;EAC7B,CAAC,QAAQ,OAAO,GAAWA;;AAGtB,IAAM,gBAAgB;EAC3B,CAAC,QAAQ,YAAY,GAAgBC;EACrC,CAAC,QAAQ,mBAAmB,GAAuBA;EACnD,CAAC,QAAQ,MAAM,GAAU;EACzB,CAAC,QAAQ,QAAQ,GAAYA;EAC7B,CAAC,QAAQ,OAAO,GAAWA;;AAGtB,IAAM,0BAA0B;EACrC,CAAC,QAAQ,YAAY,GAAgBC;EACrC,CAAC,QAAQ,mBAAmB,GAAuBA;EACnD,CAAC,QAAQ,MAAM,GAAU;EACzB,CAAC,QAAQ,QAAQ,GAAYA;EAC7B,CAAC,QAAQ,OAAO,GAAWA;;AAGtB,IAAM,qBAAqB;EAChC,CAAC,QAAQ,YAAY,GAAgB;EACrC,CAAC,QAAQ,mBAAmB,GAAuB;EACnD,CAAC,QAAQ,MAAM,GAAU;EACzB,CAAC,QAAQ,QAAQ,GAAYC;EAC7B,CAAC,QAAQ,OAAO,GAAWA;;AAa7B,eAAe,4BACb,SACA,UACA,KAAe;AAEf,UAAQ,SAAS;IACf,KAAK,QAAQ;AACX,cAAQ,KAAK;QACX,KAAK,WAAW;AACd,iBAAO,MAAcC,gBAAuB,eAAe,OAAO;QACpE,KAAK,WAAW;AACd,iBAAO,MAAcA,gBAAuB,eAAe,IAAI;QACjE,KAAK,WAAW;AACd,iBAAO,MAAcA,gBAAuB,eAAe,OAAO;QACpE,KAAK,WAAW;AACd,iBAAO,MAAcA,gBACX,eAAe,UAAU;QAErC,KAAK,WAAW;AACd,iBAAO,MAAcA,gBAAuB,eAAe,MAAM;QACnE,KAAK,WAAW;AACd,iBAAO,MAAcA,gBAAuB,eAAe,GAAG;QAChE,KAAK,WAAW;QAChB,KAAK,WAAW;AACd,gBAAM,IAAI,MAAM,GAAG,IAAI,YAAW,CAAE,+BAA+B;MACvE;IACF,KAAK,QAAQ,QAAQ;AACnB,cAAQ,KAAK;QACX,KAAK,WAAW;AACd,iBAAO,MAAa,eAAe,qBAAqB,MAAM;QAChE,KAAK,WAAW;AACd,iBAAO,MAAa,eAAe,qBAAqB,IAAI;QAC9D,KAAK,WAAW;AACd,iBAAO,MAAa,eAAe,qBAAqB,MAAM;QAChE,KAAK,WAAW;AACd,iBAAO,MAAa,eAAe,qBAAqB,GAAG;QAC7D,KAAK,WAAW;AACd,iBAAO,MAAa,eAAe,qBAAqB,MAAM;QAChE,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;AACd,gBAAM,IAAI,MAAM,GAAG,IAAI,YAAW,CAAE,8BAA8B;MACtE;IACF;IACA,KAAK,QAAQ,cAAc;AACzB,cAAQ,KAAK;QACX,KAAK,WAAW;QAChB,KAAK,WAAW;AACd,iBAAO,MAAmB,eAAe,qBAAqB,MAAM;QACtE,KAAK,WAAW;AACd,iBAAO,MAAmB,eAAe,qBAAqB,IAAI;QACpE,KAAK,WAAW;AACd,iBAAO,MAAmB,eAAe,qBAAqB,GAAG;QACnE,KAAK,WAAW;AACd,iBAAO,MAAmB,eAAe,qBAAqB,MAAM;QACtE,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;AACd,gBAAM,IAAI,MACR,GAAG,IAAI,YAAW,CAAE,oCAAoC;MAE9D;IACF;IACA,KAAK,QAAQ,qBAAqB;AAChC,cAAQ,KAAK;QACX,KAAK,WAAW;QAChB,KAAK,WAAW;AACd,iBAAO,MAA0B,eAC/B,qBAAqB,MAAM;QAE/B,KAAK,WAAW;AACd,iBAAO,MAA0B,eAC/B,qBAAqB,IAAI;QAE7B,KAAK,WAAW;AACd,iBAAO,MAA0B,eAC/B,qBAAqB,GAAG;QAE5B,KAAK,WAAW;AACd,iBAAO,MAA0B,eAC/B,qBAAqB,MAAM;QAE/B,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;AACd,gBAAM,IAAI,MAAM,GAAG,GAAG,6CAA6C;MACvE;IACF;IACA,KAAK,QAAQ;AACX,cAAQ,KAAK;QACX,KAAK,WAAW;AACd,iBAAO,MAAeA,gBAAe,QAAQ;QAC/C,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;QAChB,KAAK,WAAW;AACd,gBAAM,IAAI,MACR,GAAG,GAAG,uDAAuD;MAEnE;EACJ;AACF;AAKA,eAAsBA,gBACpB,SACA,UACA,KAAwB;AAExB,QAAM,aAAa;AACnB,MAAI,OAAO,OAAO,UAAU,EAAE,SAAS,UAAU,GAAG;AAClD,WAAO,MAAM,4BAA4B,SAAS,UAAU,UAAU;EACxE;AAEA,UAAQ,SAAS;IACf,KAAK,QAAQ;AACX,aAAO;IACT,KAAK,QAAQ;AACX,YAAM,eAAe,MAAa,eAAe,GAAG;AACpD,UAAI,cAAc;AAChB,eAAO;MACT;AACA,aAAO;IACT,KAAK,QAAQ;AACX,YAAM,qBAAqB,MAAmB,eAAe,GAAG;AAChE,UAAI,oBAAoB;AACtB,eAAO;MACT;AACA,aAAO;IACT,KAAK,QAAQ;AACX,YAAM,4BACJ,MAA0B,eAAe,GAAG;AAC9C,UAAI,2BAA2B;AAC7B,eAAO;MACT;AACA,aAAO;IACT,KAAK,QAAQ;AACX,aAAO;EACX;AACF;AAKA,eAAsBC,eACpB,SACA,MAAoB;AAEpB,UAAQ,SAAS;IACf,KAAK,QAAQ;AACX,aAAO,MAAc,cAAc,IAAI;IACzC,KAAK,QAAQ;IACb,KAAK,QAAQ;AACX,YAAM,IAAI,MAAM,uCAAuC,OAAO,MAAM;EACxE;AACF;AA+BM,SAAUC,2BACd,SACA,UACA,SAA6B;AAE7B,UAAQ,SAAS;IACf,KAAK,QAAQ;IACb,KAAK,QAAQ;IACb,KAAK,QAAQ;IACb,KAAK,QAAQ;AACX,YAAM,IAAI,MACR,mDAAmD,OAAO,OAAO;IAErE,KAAK,QAAQ;AACX,aAAc,0BAA0B,UAAU,OAAO;EAC7D;AACF;AAQM,SAAUC,8BACd,SACA,UACA,SAA6B;AAE7B,UAAQ,SAAS;IACf,KAAK,QAAQ;IACb,KAAK,QAAQ;IACb,KAAK,QAAQ;IACb,KAAK,QAAQ;AACX,YAAM,IAAI,MACR,iDAAiD,OAAO,OAAO;IAEnE,KAAK,QAAQ;AACX,aAAc,6BAA6B,UAAU,OAAO;EAChE;AACF;AAQM,SAAU,qBACd,SAAgB;AAEhB,SAAO,mBAAmB,OAAO;AACnC;;;AC7SA,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACFjB,SAAQ,gBAAe;AAEhB,IAAM,iBAAiB;EAC5B,OAAO;EACP,UAAU;EACV,SAAS;EACT,UAAU;;AAML,IAAM,QAAQ,CAAC,WAA8C;AAClE,QAAM,MAAM,SAAS,MAAM;AAC3B,SAAO,IAAI,UAAW,MAAoC;AAC5D;;;ACfA,OAAOC,SAAQ;AAOT,SAAU,wBAAqB;AACnC,QAAM,WAAWC,IAAG,SAAQ;AAC5B,QAAM,OAAOA,IAAG,KAAI;AACpB,UAAQ,UAAU;IAChB,KAAK;AACH,aAAO,SAAS,UAAU,gBAAgB,UAAU,gBAAgB;IACtE,KAAK;AACH,aAAO,SAAS,UACZ,gBAAgB,YAChB,gBAAgB;IACtB,KAAK;AACH,aAAO,SAAS;MAEb,SAAS,WAAW,YAAYA,IAAG,QAAO,CAAE,IAC3C,gBAAgB,QAChB,gBAAgB;IACtB;AACE,aAAO;EACX;AACF;AAMA,SAAS,YAAY,SAAe;AAClC,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,QAAQ,SAAS,MAAM,CAAC,GAAa,EAAE;AAC7C,UAAM,QAAQ,SAAS,MAAM,CAAC,GAAa,EAAE;AAC7C,UAAM,QAAQ,SAAS,MAAM,CAAC,GAAa,EAAE;AAC7C,WACE,QAAQ,MACP,UAAU,MAAM,QAAQ,KACxB,UAAU,MAAM,UAAU,KAAK,SAAS;EAE7C;AACA,SAAO;AACT;;;AF7BM,IAAO,mBAAP,MAAuB;EAC3B;EACA;EACA;EACS;EAET;;;;EAKA,YACE,OACA,SACA,SACA,UAAyB;AAEzB,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,iBAAiB,MAAM,sBAAsB;MAChD;MACA;MACA;KACD;EACH;;;;;EAMA,IAAI,OAAI;AACN,WAAO,KAAK,OAAO,gBACjB,KAAK,SACL,KAAK,UACL,KAAK,OAAO;EAEhB;EAEA,eAAY;AACV,WAAO,KAAK,OAAO,aAAa,KAAK,OAAO;EAC9C;EAEA,cAAc,UAAkB;AAC9B,SAAK,OAAO,cAAc,KAAK,SAAS,QAAQ;EAClD;;AAgDI,IAAO,QAAP,MAAY;EAChB;EACA;EAEA,YAAY,SAAiB,QAAe;AAC1C,SAAK,WAAW;AAChB,SAAK,UAAU,SAAS,eAAe,KAAK;EAC9C;;;;EAKA,IAAI,UAAO;AACT,WAAO,KAAK;EACd;EAEA,YAAY,SAAgB;AAC1B,WAAOC,MAAK,KAAK,KAAK,UAAU,OAAO;EACzC;EAEA,aAAa,SAAgB;AAC3B,WAAOA,MAAK,KAAK,KAAK,YAAY,OAAO,GAAG,WAAW;EACzD;EAEA,aAAa,SAAgB;AAC3B,UAAM,eAAe,KAAK,aAAa,OAAO;AAC9C,QAAI,CAACC,IAAG,WAAW,YAAY,GAAG;AAChC,aAAO,EAAC,SAAS,CAAA,EAAE;IACrB;AAEA,UAAM,OAAO,KAAK,MAAMA,IAAG,aAAa,cAAc,MAAM,CAAC;AAC7D,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,MAAM,4BAA4B;IAC9C;AACA,WAAO;EACT;EAEA,cAAc,SAAkB,UAAkB;AAChD,UAAM,eAAe,KAAK,aAAa,OAAO;AAC9C,IAAAA,IAAG,UAAUD,MAAK,QAAQ,YAAY,GAAG,EAAC,WAAW,KAAI,CAAC;AAC1D,IAAAC,IAAG,cAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;EAClE;EAEA,mBACE,SACA,UACA,SAAe;AAEf,UAAM,WAAW,KAAK,aAAa,OAAO;AAC1C,UAAM,MAAM,GAAG,QAAQ,IAAI,OAAO;AAClC,WAAO,SAAS,kBAAkB,GAAG,KAAK;EAC5C;EAEA,oBACE,SACA,UACA,SACA,gBAAsB;AAEtB,UAAM,WAAW,KAAK,aAAa,OAAO;AAC1C,QAAI,CAAC,SAAS,iBAAiB;AAC7B,eAAS,kBAAkB,CAAA;IAC7B;AACA,UAAM,MAAM,GAAG,QAAQ,IAAI,OAAO;AAClC,aAAS,gBAAgB,GAAG,IAAI;AAChC,SAAK,cAAc,SAAS,QAAQ;EACtC;EAEA,aAAa,SAAkB,OAAa;AAC1C,UAAM,WAAW,KAAK,aAAa,OAAO;AAC1C,QAAI,UAAU,UAAU;AACtB,aAAO,OAAO,OAAO,SAAS,WAAW,CAAA,CAAE,EACxC,KAAK,qBAAqB,OAAO,CAAC,EAClC,GAAG,EAAE;IACV;AACA,WAAO,SAAS,QAAQ,KAAK;EAC/B;EAEA,gBACE,SACA,UACA,SAAe;AAEf,WAAOD,MAAK,KAAK,KAAK,YAAY,OAAO,GAAG,GAAG,QAAQ,IAAI,OAAO,EAAE;EACtE;EAEA,QAAK;AACH,IAAAC,IAAG,OAAO,KAAK,UAAU;MACvB,OAAO;MACP,WAAW;MACX,YAAY;MACZ,YAAY;KACb;EACH;EAEA,UACE,SACA,UACA,SAAe;AAEf,UAAM,WAAW,KAAK,aAAa,OAAO;AAC1C,eAAW,SAAS,OAAO,KAAK,SAAS,OAAO,GAAG;AACjD,UAAI,SAAS,QAAQ,KAAK,MAAM,SAAS;AACvC,eAAO,SAAS,QAAQ,KAAK;MAC/B;IACF;AAEA,UAAM,MAAM,GAAG,QAAQ,IAAI,OAAO;AAClC,QAAI,SAAS,kBAAkB,GAAG,GAAG;AACnC,aAAO,SAAS,gBAAgB,GAAG;AACnC,WAAK,cAAc,SAAS,QAAQ;IACtC;AACA,IAAAA,IAAG,OAAO,KAAK,gBAAgB,SAAS,UAAU,OAAO,GAAG;MAC1D,OAAO;MACP,WAAW;MACX,YAAY;MACZ,YAAY;KACb;EACH;EAEA,uBAAoB;AAClB,QAAI,CAACA,IAAG,WAAW,KAAK,QAAQ,GAAG;AACjC,aAAO,CAAA;IACT;AACA,UAAM,QAAQA,IAAG,YAAY,KAAK,QAAQ;AAC1C,UAAM,WAAW,MAAM,OAAO,CAAC,MAAmB;AAChD,aAAQ,OAAO,OAAO,OAAO,EAAe,SAAS,CAAC;IACxD,CAAC;AACD,WAAO,SAAS,QAAQ,aAAU;AAChC,YAAM,QAAQA,IAAG,YAAY,KAAK,YAAY,OAAO,CAAC;AACtD,aAAO,MACJ,IAAI,UAAO;AACV,cAAM,SAAS,gBACbD,MAAK,KAAK,KAAK,YAAY,OAAO,GAAG,IAAI,CAAC;AAE5C,YAAI,CAAC,QAAQ;AACX,iBAAO;QACT;AACA,eAAO,IAAI,iBACT,MACA,SACA,OAAO,SACP,OAAO,QAA2B;MAEtC,CAAC,EACA,OAAO,CAAC,SAA2D;AAClE,eAAO,SAAS;MAClB,CAAC;IACL,CAAC;EACH;EAEA,sBAAsB,SAAqC;AACzD,YAAQ,aAAa,sBAAqB;AAC1C,QAAI,CAAC,QAAQ,UAAU;AACrB,YAAM,IAAI,MACR,uDAAuDE,IAAG,SAAQ,CAAE,KAAKA,IAAG,KAAI,CAAE,GAAG;IAEzF;AACA,QAAI;AACF,cAAQ,UACN,KAAK,aAAa,QAAQ,SAAS,QAAQ,OAAO,KAAK,QAAQ;IACnE,QAAQ;AACN,WAAK,UAAU,+CAA+C;IAChE;AACA,UAAM,kBAAkB,KAAK,gBAC3B,QAAQ,SACR,QAAQ,UACR,QAAQ,OAAO;AAGjB,UAAM,uBAAuB,KAAK,mBAChC,QAAQ,SACR,QAAQ,UACR,QAAQ,OAAO;AAEjB,QAAI,sBAAsB;AAExB,aAAOF,MAAK,KAAK,iBAAiB,oBAAoB;IACxD;AAEA,WAAOA,MAAK,KACV,iBACA,wBAAwB,QAAQ,OAAO,EACrC,QAAQ,UACR,QAAQ,OAAO,CAChB;EAEL;;AAGF,SAAS,gBACP,YAAkB;AAElB,QAAM,OAAOA,MAAK,SAAS,UAAU;AACrC,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,OAAO,WAAW,GAAG;AACvB;EACF;AACA,QAAM,CAAC,UAAU,OAAO,IAAI;AAC5B,MAAI,CAAC,WAAW,CAAC,UAAU;AACzB;EACF;AACA,SAAO,EAAC,UAAU,QAAO;AAC3B;;;ATvQM,SAAU,sBACd,SAAqC;AAErC,MAAI,QAAQ,aAAa,MAAM;AAC7B,YAAQ,aAAa,sBAAqB;AAC1C,QAAI,QAAQ,aAAa,QAAW;AAClC,YAAM,IAAI,MACR,+DAA+D;IAEnE;AACA,WAAO,wBAAwB,QAAQ,OAAO,EAC5C,QAAQ,UACR,QAAQ,OAAO;EAEnB;AAEA,SAAO,IAAI,MAAM,QAAQ,QAAQ,EAAE,sBAAsB,OAAO;AAClE;AA8BM,SAAU,4BACd,SACA,eAAe,MAAI;AAEnB,UAAQ,aAAa,sBAAqB;AAC1C,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,IAAI,MACR,uDAAuDG,IAAG,SAAQ,CAAE,KAAKA,IAAG,KAAI,CAAE,GAAG;EAEzF;AACA,QAAM,QAAQC,8BACZ,QAAQ,SACR,QAAQ,UACR,QAAQ,OAAO;AAGjB,aAAWC,UAAQ,OAAO;AACxB,QAAI;AACF,iBAAWA,MAAI;AACf,aAAOA;IACT,QAAQ;IAAC;EACX;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO,MAAM,CAAC;EAChB;AACA,QAAM,IAAI,MACR,wDAAwD,QAAQ,OAAO,QAAQ,MAAM,IACnF,CAAAA,WAAO;AACL,WAAO;KAAQA,MAAI;EACrB,CAAC,CACF,GAAG;AAER;AA+EM,SAAU,OAAO,MAAmB;AACxC,SAAO,IAAI,QAAQ;IACjB,GAAG;IACH,QAAQ,KAAK,UAAU;GACxB;AACH;AAKO,IAAM,+BACX;AAKK,IAAM,0CACX;AAGF,IAAM,mBAAmB,oBAAI,IAAG;AAChC,IAAM,cAAc;EAClB,MAAM,IAAI,SAAe;AACvB,qBAAiB,IAAI,MAAM,GAAG,QAAQ,aAAU;AAC9C,aAAO,QAAQ,GAAG,IAAI;IACxB,CAAC;EACH;EACA,QAAQ,IAAI,SAAe;AACzB,qBAAiB,IAAI,QAAQ,GAAG,QAAQ,aAAU;AAChD,aAAO,QAAQ,GAAG,IAAI;IACxB,CAAC;EACH;EACA,QAAQ,IAAI,SAAe;AACzB,qBAAiB,IAAI,QAAQ,GAAG,QAAQ,aAAU;AAChD,aAAO,QAAQ,GAAG,IAAI;IACxB,CAAC;EACH;EACA,SAAS,IAAI,SAAe;AAC1B,qBAAiB,IAAI,SAAS,GAAG,QAAQ,aAAU;AACjD,aAAO,QAAQ,GAAG,IAAI;IACxB,CAAC;EACH;;AAGF,SAAS,wBACP,OACA,SAAqB;AAErB,QAAM,YAAY,iBAAiB,IAAI,KAAK,KAAK,CAAA;AACjD,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,GAAG,OAAO,YAAY,KAAK,CAAC;EACtC;AACA,YAAU,KAAK,OAAO;AACtB,mBAAiB,IAAI,OAAO,SAAS;AACvC;AAEA,SAAS,4BACP,OACA,SAAqB;AAErB,QAAM,YAAY,iBAAiB,IAAI,KAAK,KAAK,CAAA;AACjD,QAAM,sBAAsB,UAAU,QAAQ,OAAO;AACrD,MAAI,wBAAwB,IAAI;AAC9B;EACF;AACA,YAAU,OAAO,qBAAqB,CAAC;AACvC,mBAAiB,IAAI,OAAO,SAAS;AACrC,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAI,OAAO,YAAY,KAAK,CAAC;EACvC;AACF;AAKM,IAAO,UAAP,MAAc;EAClB;EACA;EACA;EACA;EACA,UAAU;;;;EAIV,YAAY;EACZ,cAAc,YAAW;EAAE;EAC3B;EACA,QAAkB,CAAA;EAClB,mBAAmB;EACnB,eAAe,IAAI,aAAY;EAC/B,WAAW,MAAW;AACpB,SAAK,KAAI;EACX;EACA;EAEA,YAAY,MAAmB;AAC7B,SAAK,kBAAkB,KAAK;AAC5B,SAAK,QAAQ,KAAK,QAAQ,CAAA;AAC1B,SAAK,UAAU,KAAK,SAAS,eAAe,QAAQ;AAEpD,SAAK,UAAU,KAAK;AACpB,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,IAAI,MACR,KAAK,QAAQ,SAAS,KAAK,QAAQ,SAAS,gBAAgB;IAEhE;AACA,SAAK,SAAS,iBAAiB,SAAS,KAAK,UAAU,EAAC,MAAM,KAAI,CAAC;AAEnE,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AACvB,SAAK,iBAAiB;AAKtB,SAAK,aAAa,QAAQ,aAAa;AACvC,UAAM,QAAQ,KAAK,gBAAgB;MACjC,MAAM,KAAK;KACZ;AAED,UAAM,MAAM,KAAK,OAAO,CAAA;AAExB,SAAK,UACH,aAAa,KAAK,eAAe,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC,IACzD;MACE,UAAU,KAAK;MACf,KAAK,OAAO,KAAK,GAAG,EAAE,OACpB,CAAC,KAAK,QAAO;AACX,YAAI,IAAI,YAAW,EAAG,WAAW,YAAY,GAAG;AAC9C,cAAI,GAAG,IAAI,IAAI,GAAG;QACpB;AACA,eAAO;MACT,GACA,CAAA,CAAE;MAEJ;KACD;AAGH,SAAK,kBAAkB,aAAa,MAClC,KAAK,iBACL,KAAK,OACL;MACE,UAAU,KAAK;MACf,aAAa;MACb;MACA;KACD;AAEH,SAAK,cAAc,KAAK,gBAAgB,MAAO;AAC/C,SAAK,cAAc,KAAK,gBAAgB,MAAO;AAE/C,SAAK,UAAU,YAAY,KAAK,gBAAgB,GAAG,EAAE;AACrD,QAAI,KAAK,QAAQ;AACf,WAAK,gBAAgB,QAAQ,KAAK,QAAQ,MAAM;AAChD,WAAK,gBAAgB,QAAQ,KAAK,QAAQ,MAAM;IAClD;AACA,4BAAwB,QAAQ,KAAK,oBAAoB;AACzD,QAAI,KAAK,cAAc;AACrB,8BAAwB,UAAU,KAAK,sBAAsB;IAC/D;AACA,QAAI,KAAK,eAAe;AACtB,8BAAwB,WAAW,KAAK,sBAAsB;IAChE;AACA,QAAI,KAAK,cAAc;AACrB,8BAAwB,UAAU,KAAK,sBAAsB;IAC/D;AACA,QAAI,KAAK,QAAQ;AACf,WAAK,cAAc,KAAK;IAC1B;AACA,SAAK,yBAAyB,IAAI,QAAQ,CAACC,UAAS,WAAU;AAC5D,WAAK,gBAAgB,KAAK,QAAQ,YAAW;AAC3C,aAAK,UAAU,mBAAmB,KAAK,gBAAgB,GAAG,SAAS;AACnE,aAAK,gBAAe;AACpB,aAAK,UAAU;AACf,YAAI;AACF,gBAAM,KAAK,UAAS;QACtB,SAAS,KAAK;AACZ,iBAAO,GAAG;AACV;QACF;AACA,QAAAA,SAAO;MACT,CAAC;IACH,CAAC;EACH;EAEA,MAAM,YAAS;AACb,QAAI,KAAK,WAAW;AAClB;IACF;AACA,SAAK,YAAY;AACjB,UAAM,KAAK,YAAW;EACxB;EAEA,IAAI,cAAW;AACb,WAAO,KAAK;EACd;EAEA,gBAAgB,MAAqB;AACnC,QAAI,KAAK,MAAM;AACb,aAAO,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;IAChD,OAAO;AACL,aAAO,CAAC,QAAQ,QAAQ,MAAM;IAChC;EACF;EAEA,kBAAe;AACb,gCAA4B,QAAQ,KAAK,oBAAoB;AAC7D,gCAA4B,UAAU,KAAK,sBAAsB;AACjE,gCAA4B,WAAW,KAAK,sBAAsB;AAClE,gCAA4B,UAAU,KAAK,sBAAsB;AACjE,SAAK,SAAS,oBAAoB,SAAS,KAAK,QAAQ;EAC1D;EAEA,uBAAuB,CAAC,UAAiB;AACvC,SAAK,KAAI;EACX;EAEA,yBAAyB,CAAC,WAAwB;AAChD,YAAQ,QAAQ;MACd,KAAK;AACH,aAAK,KAAI;AACT,gBAAQ,KAAK,GAAG;MAClB,KAAK;MACL,KAAK;AACH,aAAK,KAAK,MAAK;AACf;IACJ;EACF;EAEA,MAAM,QAAK;AACT,UAAM,KAAK,UAAS;AACpB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,KAAI;IACX;AACA,WAAO,MAAM,KAAK;EACpB;EAEA,YAAS;AACP,WAAO,KAAK;EACd;EAEA,OAAI;AACF,SAAK,UAAU,kBAAkB,KAAK,gBAAgB,GAAG,EAAE;AAI3D,QACE,KAAK,mBACL,KAAK,gBAAgB,OACrB,UAAU,KAAK,gBAAgB,GAAG,GAClC;AACA,UAAI;AACF,aAAK,UAAU,mBAAmB,KAAK,gBAAgB,GAAG,SAAS;AACnE,YAAI,QAAQ,aAAa,SAAS;AAChC,cAAI;AACF,yBAAa,SACX,iBAAiB,KAAK,gBAAgB,GAAG,QAAQ;UAErD,SAAS,OAAO;AACd,iBAAK,UACH,WAAW,KAAK,gBAAgB,GAAG,0BACnC,KAAK;AAKP,iBAAK,gBAAgB,KAAI;UAC3B;QACF,OAAO;AAGL,gBAAM,iBAAiB,CAAC,KAAK,gBAAgB;AAE7C,cAAI;AACF,oBAAQ,KAAK,gBAAgB,SAAS;UACxC,SAAS,OAAO;AACd,iBAAK,UACH,WAAW,KAAK,gBAAgB,GAAG,8BACnC,KAAK;AAKP,iBAAK,gBAAgB,KAAK,SAAS;UACrC;QACF;MACF,SAAS,OAAO;AACd,cAAM,IAAI,MACR,GAAG,yBAAyB;eAC1B,YAAY,KAAK,IAAI,MAAM,QAAQ,KACrC,EAAE;MAEN;IACF;AACA,SAAK,gBAAe;EACtB;EAEA,cAAc,QAAuB;AACnC,UAAM,KAAK,SAAS,gBAAgB,MAAM;AAC1C,UAAM,UAAU,MAAW;AACzB,SAAG,IAAI,QAAQ,MAAM;AACrB,SAAG,IAAI,SAAS,OAAO;AACvB,UAAI;AACF,WAAG,MAAK;MACV,QAAQ;MAAC;IACX;AACA,UAAM,SAAS,CAAC,SAAgB;AAC9B,UAAI,KAAK,KAAI,MAAO,IAAI;AACtB;MACF;AACA,WAAK,MAAM,KAAK,IAAI;AACpB,YAAM,QAAQ,KAAK,MAAM,SAAS,KAAK;AACvC,UAAI,OAAO;AACT,aAAK,MAAM,OAAO,GAAG,KAAK;MAC5B;AACA,WAAK,aAAa,KAAK,QAAQ,IAAI;IACrC;AACA,UAAM,UAAU,MAAW;AACzB,cAAO;IACT;AACA,OAAG,GAAG,QAAQ,MAAM;AACpB,OAAG,GAAG,SAAS,OAAO;EACxB;;;;;;EAOA,gBAAa;AACX,WAAO,CAAC,GAAG,KAAK,KAAK;EACvB;EAEA,kBAAkB,OAAe,UAAU,GAAC;AAC1C,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAU;AACrC,YAAM,UAAU,CAAC,gBAAsC;AACrD,gBAAO;AACP,eACE,IAAI,MACF;UACE,yCACE,uBAAuB,QACnB,IAAI,YAAY,OAAO,KACvB,UAAU,WAAW,EAC3B;UACA;UACA;UACA,KAAK,cAAa,EAAG,KAAK,IAAI;UAC9B;UACA;UACA;UACA,KAAK,IAAI,CAAC,CACb;MAEL;AAEA,WAAK,gBAAgB,GAAG,QAAQ,OAAO;AACvC,WAAK,gBAAgB,GAAG,SAAS,OAAO;AACxC,YAAM,YACJ,UAAU,IAAI,WAAW,WAAW,OAAO,IAAI;AAEjD,WAAK,aAAa,GAAG,QAAQ,MAAM;AACnC,YAAM,UAAU,MAAW;AACzB,qBAAa,SAAS;AACtB,aAAK,aAAa,IAAI,QAAQ,MAAM;AACpC,aAAK,gBAAgB,IAAI,QAAQ,OAAO;AACxC,aAAK,gBAAgB,IAAI,SAAS,OAAO;MAC3C;AAEA,eAAS,YAAS;AAChB,gBAAO;AACP,eACE,IAAI,aACF,mBAAmB,OAAO,gEAAgE,CAC3F;MAEL;AAEA,iBAAW,QAAQ,KAAK,OAAO;AAC7B,eAAO,IAAI;MACb;AAEA,eAAS,OAAO,MAAY;AAC1B,cAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,YAAI,CAAC,OAAO;AACV;QACF;AACA,gBAAO;AAEP,QAAAA,SAAQ,MAAM,CAAC,CAAE;MACnB;IACF,CAAC;EACH;;AAGF,IAAM,4BAA4B;;;;AAQlC,SAAS,UAAU,KAAW;AAC5B,MAAI;AACF,WAAO,QAAQ,KAAK,KAAK,CAAC;EAC5B,SAAS,OAAO;AACd,QAAI,iBAAiB,KAAK,GAAG;AAC3B,UAAI,MAAM,QAAQ,MAAM,SAAS,SAAS;AACxC,eAAO;MACT;IACF;AACA,UAAM;EACR;AACF;AAaM,SAAU,YAAY,KAAY;AACtC,SACE,OAAO,QAAQ,YAAY,QAAQ,QAAQ,UAAU,OAAO,aAAa;AAE7E;AAIM,SAAU,iBAAiB,KAAY;AAC3C,SACE,YAAY,GAAG,MACd,WAAW,OAAO,UAAU,OAAO,UAAU,OAAO,aAAa;AAEtE;AAKM,IAAO,eAAP,cAA4B,MAAK;;;;EAIrC,YAAY,SAAgB;AAC1B,UAAM,OAAO;AACb,SAAK,OAAO,KAAK,YAAY;AAC7B,UAAM,kBAAkB,MAAM,KAAK,WAAW;EAChD;;;;AYzpBF,OAAO,YAAY;AACnB,SAAQ,aAAAC,kBAAgB;AACxB,SAAQ,YAAY,oBAAmB;AACvC,SAAQ,SAAAC,QAAO,cAAa;AAC5B,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACQX,IAAO,kBAAP,MAAsB;EAC1B;EAEA,YAAY,SAAgB;AAC1B,SAAK,WAAW;EAClB;EAEA,SAAS,UAAyB;AAEhC,WAAO;EACT;EAEA,eAAe,SAAwB;AACrC,WAAO,KAAK,gBACV,QAAQ,SACR,QAAQ,UACR,QAAQ,OAAO;EAEnB;EAEA,gBACE,SACA,UACA,SAAe;AAEf,WAAO,IAAI,IAAI,aAAa,OAAO,EAAE,UAAU,SAAS,KAAK,QAAQ,CAAC;EACxE;EAEA,kBAAkB,SAIjB;AACC,WAAO,wBAAwB,QAAQ,OAAO,EAC5C,QAAQ,UACR,QAAQ,OAAO;EAEnB;EAEA,UAAO;AACL,WAAO;EACT;;;;ACrDF,SAAQ,WAAW,OAAO,gBAAe;AACzC,SAAQ,WAAW,kBAAkB,qBAAAC,0BAAwB;AAC7D,SAAQ,OAAO,SAAS,eAAc;AACtC,YAAYC,WAAU;AAEtB,SAAQ,QAAQ,gBAAe;AAC/B,SAAQ,gBAAe;AACvB,SAAQ,iBAAgB;AAMxB,IAAM,gBAAgB,UAAU,QAAQ;AAKxC,eAAsB,cACpB,aACA,YACA,QAAe;AAEf,MAAI,CAAM,iBAAW,UAAU,GAAG;AAChC,iBAAkB,cAAQ,QAAQ,IAAG,GAAI,UAAU;EACrD;AACA,MAAI,YAAY,SAAS,MAAM,GAAG;AAChC,UAAM,MAAM,YAAY,EAAC,WAAW,KAAI,CAAC;AACzC,UAAM,WAAW,aAAa,YAAY,MAAM;EAClD,WAAW,YAAY,SAAS,UAAU,GAAG;AAC3C,UAAM,WAAW,aAAa,YAAY,SAAS,MAAM;EAC3D,WAAW,YAAY,SAAS,MAAM,GAAG;AACvC,UAAM,MAAM,UAAU;AACtB,UAAM,WAAW,aAAa,UAAU;EAC1C,WAAW,YAAY,SAAS,MAAM,GAAG;AAEvC,UAAM,SAAS,UAAU,aAAa,CAAC,eAAe,UAAU,EAAE,GAAG;MACnE,KAAK;QACH,gBAAgB;;KAEnB;AACD,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI,MACR,qBAAqB,WAAW,OAAO,UAAU,KAAK,OAAO,MAAM,EAAE;IAEzE;EACF,WAAW,YAAY,SAAS,SAAS,GAAG;AAC1C,UAAM,WAAW,aAAa,YAAY,IAAI;EAChD,OAAO;AACL,UAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;EAC9D;AACF;AAEA,SAAS,sBACP,OAAoD;AAEpD,QAAM,SAAS,IAAI,OAAO,UAAU;IAClC,UAAU,OAAO,UAAU,UAAQ;AACjC,UAAI,CAAC,MAAM,MAAM,MAAM,OAAO,QAAQ,GAAG;AACvC,cAAM,MAAM,KAAK,SAAS,QAAQ;MACpC,OAAO;AACL,iBAAQ;MACV;IACF;IAEA,MAAM,UAAQ;AACZ,UAAI,MAAM,OAAO,WAAW;AAC1B,iBAAQ;MACV,OAAO;AACL,cAAM,MAAM,IAAG;AACf,cAAM,OAAO,GAAG,SAAS,QAAQ;MACnC;IACF;GACD;AAED,QAAM,MAAM,GAAG,SAAS,OAAI;AAC1B,QAAI,UAAU,KAAK,EAAE,SAAS,SAAS;AAErC,aAAO,KAAK,KAAK;IACnB,OAAO;AACL,aAAO,QAAQ,CAAC;IAClB;EACF,CAAC;AAED,QAAM,OACH,GAAG,QAAQ,UAAO;AACjB,WAAO,OAAO,KAAK,IAAI;EACzB,CAAC,EACA,GAAG,SAAS,OAAI;AACf,WAAO,OAAO,QAAQ,CAAC;EACzB,CAAC;AAEH,QAAM,KAAK,SAAS,MAAK;AACvB,WAAO,OAAO,IAAG;EACnB,CAAC;AAED,SAAO;AACT;AAKO,IAAM,8BAA8B;EACzC,IAAI;EACJ,OAAO;;AAMT,eAAe,WACb,SACA,YACA,uBACA,QAAe;AAEf,QAAM,EAAC,UAAS,IAAI,MAAM,OAAO,kBAAe;AAChD,SAAO,MAAM,IAAI,QAAc,CAAC,SAAS,WAAU;AACjD,aAAS,YAAY,aAAmB;AACtC,aAAO,CAAC,UAAgB;AACtB,YAAI,UAAU,SAAS,MAAM,SAAS,UAAU;AAC9C,kBAAQ,IAAI,MACV,KAAK,WAAW,iDAChB;YACE,OAAO;WACR;QAEL;AACA,eAAO,KAAK;MACd;IACF;AACA,UAAM,SAAS,MACb,4BAA4B,qBAAqB,GACjD,CAAC,IAAI,GACL;MACE,OAAO,CAAC,QAAQ,QAAQ,SAAS;KAClC,EAEA,KAAK,SAAS,YAAY,qBAAqB,CAAC,EAChD,KAAK,QAAQ,UAAO;AACnB,eAAS,eAAe,QAAQ,IAC9B,GAAG,qBAAqB,iBAAiB,IAAI,EAAE;IAEnD,CAAC;AAEH,UAAM,MAAM,UAAU,UAAU;AAChC,QAAI,KAAK,SAAS,YAAY,KAAK,CAAC;AACpC,QAAI,KAAK,UAAU,OAAO;AAC1B,qBAAiB,OAAO,EAAE,KAAK,sBAAsB,MAAM,CAAC,EAAE,KAAK,GAAG;EACxE,CAAC;AACH;AAKA,eAAe,WAAW,SAAiB,YAAkB;AAC3D,QAAM,EAAC,OAAM,IAAI,MAAM,cAAc,WAAW;IAC9C;IACA;IACA;IACA;GACD;AAED,QAAM,UAAU,OAAO,MAAM,kBAAkB;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iCAAiC,MAAM,EAAE;EAC3D;AACA,QAAM,YAAY,QAAQ,CAAC;AAE3B,MAAI;AACF,UAAM,YAAY,MAAM,QAAQ,SAAS;AACzC,UAAM,UAAU,UAAU,KAAK,UAAO;AACpC,aAAO,OAAO,SAAS,YAAY,KAAK,SAAS,MAAM;IACzD,CAAC;AACD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,sBAAsB,SAAS,EAAE;IACnD;AACA,UAAM,cAAmB,WAAK,WAAY,OAAO;AAEjD,UAAM,cAAc,MAAM,CAAC,MAAM,aAAa,UAAU,CAAC;EAC3D;AACE,UAAM,cAAc,WAAW,CAAC,UAAU,WAAW,QAAQ,CAAC;EAChE;AACF;AAKA,IAAM,2BAAN,cAAuC,MAAK;;AAK5C,eAAe,WACb,aACA,YACA,QAAe;AAEf,aAAW,WAAW,CAAC,mBAAmB,mBAAmB,GAAG;AAC9D,QAAI;AACF,YAAM,QAAQ,aAAa,YAAY,MAAM;AAC7C;IACF,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,2BAA2B;AAChD,cAAM;MACR;IACF;EACF;AACA,QAAM,IAAI,MACR,sJAAsJ;AAE1J;AAKA,eAAsB,oBACpB,aACA,YACA,SAAgB;AAEhB,QAAM,EAAC,SAAS,MAAK,IAAI,MAAM;;IACH;EAAO,EACjC,MAAM,MAAK;AACX,UAAM,IAAI,yBACR,sEAAsE;EAE1E,CAAC;AACD,QAAM,OAAO,UAAoC,MAAM,IAAI;AAC3D,MAAI;AACF,UAAM,UAAU,MAAM,KAAK,aAAa,EAAC,aAAa,KAAI,CAAC;AAC3D,UAAM,IAAI,QAAQ,CAACC,UAAS,WAAU;AACpC,cACG,GAAG,SAAS,MAAM,EAClB,GAAG,OAAOA,QAAO,EACjB,GAAG,SAAS,WAAQ;AACnB,wBAAgB,SAAS,OAAO,UAAU,EAAE,KAAK,MAAK;AACpD,kBAAQ,UAAS;QACnB,GAAG,MAAM;MACX,CAAC,EACA,UAAS;IACd,CAAC;EACH,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,sBAAsB,WAAW,IAAI,EAAC,OAAO,MAAK,CAAC;EACrE;AACF;AAKA,eAAe,kBACb,aACA,YACA,QAAe;AAEf,MAAI;AACF,QAAI,QAAQ,aAAa,SAAS;AAChC,YAAM,aACJ,QAAQ,IAAI,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK;AAC5D,UAAI;AACF,cAAM,YAAY,GAAG,UAAU;AAI/B,cAAM,cAAc,WAAW,CAAC,OAAO,aAAa,MAAM,UAAU,CAAC;AACrE;MACF,SAAS,UAAU;AACjB,iBAAS,eAAe,QAAQ,IAC9B,8BAA8B,QAAQ,EAAE;MAE5C;AACA,UAAI;AACF,cAAM,cAAc,kBAAkB;UACpC;UACA;UACA;UACA;UACA;UACA;SACD;AACD;MACF,SAAS,iBAAiB;AACxB,iBAAS,eAAe,QAAQ,IAC9B,qCAAqC,eAAe,EAAE;MAE1D;AACA,YAAM,cAAc,YAAY;QAC9B;QACA;QACA;QACA;QACA;QACA;OACD;IACH,OAAO;AAGL,YAAM,cAAc,SAAS,CAAC,MAAM,aAAa,MAAM,UAAU,CAAC;IACpE;EACF,SAAS,OAAY;AACnB,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,yBACR,kIAAkI;IAEtI;AACA,UAAM,IAAI,MACR,sBAAsB,OAAO,QAAQ,SAAQ,KAAM,OAAO,OAAO,EAAE;EAEvE;AACF;AAKA,SAAS,kBAAkB,WAAmB,WAAiB;AAC7D,QAAM,oBAAyB,cAAQ,SAAS;AAChD,QAAM,oBAAyB,cAAQ,SAAS;AAChD,SACE,sBAAsB,qBACtB,kBAAkB,WAAW,oBAAyB,SAAG;AAE7D;AAKA,eAAe,gBACb,SACA,OACA,YAAkB;AAElB,QAAM,EAAC,QAAQ,SAAS,QAAO,IAAI;AAGnC,QAAM,WAAW,MAAM,2BAA2B;AAClD,QAAM,eACH,WAAW,YAAY,WACxB,MAAM,SAAS,SAAS,GAAG,KAC1B,MAAM,iBAAiB,MAAM,KAAK,MAAM,2BAA2B;AACtE,QAAM,aAAa,WAAW,YAAY;AAE1C,QAAM,OACJ,aAAa,IAAK,cAAc,MAAQ,MAAS,WAAW;AAE9D,QAAM,cAAmB,WAAK,YAAY,MAAM,QAAQ;AACxD,MAAI,aAAa;AACf,UAAM,MAAM,aAAa,EAAC,WAAW,MAAM,KAAI,CAAC;AAChD;EACF;AACA,QAAM,MAAW,cAAQ,WAAW,GAAG,EAAC,WAAW,KAAI,CAAC;AAExD,QAAM,aAAa,MAAM,UAAU,QAAQ,eAAe,KAAK,OAAO,CAAC,EACrE,KAAK;AAEP,MAAI,WAAW;AAIb,UAAM,SAAmB,CAAA;AACzB,UAAM,SACJ,YACA,IAAI,SAAS;MACX,MAAM,OAAgB,WAAW,UAAQ;AAEvC,YAAI,iBAAiB,QAAQ;AAC3B,iBAAO,KAAK,KAAK;QACnB;AACA,iBAAQ;MACV;KACD,CAAC;AAEJ,UAAM,aAAa,OAAO,OAAO,MAAM,EAAE,SAAQ;AAEjD,UAAM,qBAA0B,cACzB,cAAQ,WAAW,GACxB,UAAU;AAEZ,QAAI,CAAC,kBAAkB,YAAY,kBAAkB,GAAG;AACtD,YAAM,IAAI,MACR,gBAAgB,MAAM,QAAQ,gDAAgD;IAElF;AACA,UAAM,QAAQ,YAAY,WAAW;AACrC;EACF;AACA,QAAM,SAAS,YAAYC,mBAAkB,aAAa,EAAC,KAAI,CAAC,CAAC;AACnE;;;ACjYA,IAAI,YAAgC;AAS9B,IAAO,cAAP,MAAO,aAAW;EACtB;EACA,aAAa;EACb,aAAa;EACb,QAMK,CAAA;EACL,mBAAmB;EACnB,kBAAkB;EAClB,WAAW;EAEX,YAAoB,QAA0B;AAC5C,SAAK,UAAU;EACjB;;;;;;;EAQA,OAAO,gBACL,OACA,OACA,SAA6B,QAAQ,QAA4B;AAGjE,QAAI,CAAC,aAAa,UAAU,YAAY,QAAQ;AAC9C,kBAAY,IAAI,aAAY,MAAM;IACpC;AACA,WAAO,UAAU,QAAQ,OAAO,KAAK;EACvC;EAEA,YAAS;AACP,UAAM,MAAM,KAAK;AACjB,QAAI,MAAM,KAAK,KAAK,QAAQ,OAAO;AAGjC,WAAK,QAAQ,MAAM,IAAI;IACzB;AACA,WAAO;EACT;EAEA,QAAQ,OAAe,OAAa;AAClC,UAAM,MAAM,KAAK,UAAS;AAC1B,SAAK,MAAM,KAAK;MACd;MACA;MACA,YAAY;MACZ,WAAW;MACX,cAAc;KACf;AACD,QAAI,eAAe;AAEnB,WAAO,CAAC,UAAiB;AACvB,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,UAAI,IAAI,cAAc,GAAG;AACvB,YAAI,YAAY,KAAK,IAAG;MAC1B;AACA,UAAI,cAAc;AAElB,YAAM,SAAS,IAAI,cAAc,IAAI;AACrC,UAAI,UAAU,KAAK,IAAG,IAAK,KAAK,mBAAmB,KAAK;AACtD,aAAK,gBAAe;MACtB;AAEA,UAAI,UAAU,CAAC,cAAc;AAC3B,uBAAe;AACf,aAAK,WAAU;MACjB;IACF;EACF;;;EAIA,kBAAe;AACb,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,mBAAmB;AACxB,qBAAe,MAAK;AAClB,aAAK,mBAAmB;AACxB,aAAK,kBAAkB,KAAK,IAAG;AAC/B,aAAK,WAAU;MACjB,CAAC;IACH;EACF;EAEA,iBAAiB,KAAW;AAC1B,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,aAAa,IAAI,KAAK,CAAC;AACjE,UAAM,UAAU,KAAK,MAAM,QAAQ,GAAG;AACtC,UAAM,YAAY,IAAI,YAAY,IAAI,KAAK,IAAG,IAAK,IAAI,YAAY;AACnE,UAAM,OAAO,YAAY,IAAI,IAAI,aAAa,YAAY;AAC1D,UAAM,SAAS,OAAO,KAAK,IAAI,QAAQ,IAAI,cAAc,OAAO,MAAO;AACvE,UAAM,QAAQ;AACd,UAAM,gBAAgB,KAAK,MAAM,QAAQ,KAAK;AAC9C,UAAM,SACJ,IAAI,OAAO,aAAa,IAAI,IAAI,OAAO,QAAQ,aAAa;AAC9D,UAAM,SACJ,SAAS,IAAI,cAAc,GAAG,OAAO,KAAK,OAAO,QAAQ,CAAC,CAAC;AAC7D,WAAO,GAAG,IAAI,KAAK,KAAK,MAAM,KAAK,MAAM;EAC3C;;;EAIA,aAAU;AACR,QAAI,CAAC,KAAK,QAAQ,OAAO;AACvB;IACF;AACA,UAAM,IAAI,KAAK;AACf,QAAI,MAAM,GAAG;AACX;IACF;AAGA,QAAI,IAAI,GAAG;AACT,WAAK,QAAQ,WAAW,GAAG,EAAE,IAAI,EAAE;IACrC;AAEA,aAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAChC,YAAM,WAAW,KAAK,iBAAiB,GAAG;AAC1C,UAAI,aAAa,KAAK,MAAM,GAAG,EAAG,cAAc;AAC9C,aAAK,QAAQ,SAAS,CAAC;AACvB,aAAK,QAAQ,MAAM,QAAQ;AAC3B,aAAK,QAAQ,UAAU,CAAC;AACxB,aAAK,MAAM,GAAG,EAAG,eAAe;MAClC;AACA,UAAI,MAAM,IAAI,GAAG;AACf,aAAK,QAAQ,WAAW,GAAG,CAAC;MAC9B;IACF;AAGA,SAAK,QAAQ,SAAS,CAAC;AAEvB,QAAI,KAAK,UAAU;AACjB,kBAAY;AACZ,WAAK,QAAQ,MAAM,IAAI;IACzB;EACF;EAEA,aAAU;AACR,SAAK;AACL,QAAI,KAAK,cAAc,KAAK,cAAc,KAAK,aAAa,GAAG;AAC7D,WAAK,WAAW;IAIlB;EACF;;;;AH9IF,IAAM,QAAQ,oBAAI,IAAG;AACrB,SAAS,UAAU,OAAa;AAC9B,QAAM,IAAI,OAAO,QAAQ,OAAM,CAAE;AACnC;AAEA,SAAS,aAAa,OAAe,QAAe;AAClD,QAAM,MAAM,QAAQ,OAAM;AAC1B,QAAM,QAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,CAAC,OAAO;AACV;EACF;AACA,QAAM,WACJ,IAAI,CAAC,IAAI,MAAO,IAAI,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,MAAO,MAAM,CAAC,IAAI;AAC/D,WAAS,eAAe,OAAO,IAAI,gBAAgB,KAAK,KAAK,QAAQ,IAAI;AAC3E;AA4HM,IAAO,8BAAP,cAA2C,MAAK;;AAStD,eAAe,qBACb,SAAuB;AAEvB,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,IAAI,MAAM,0BAA0B;EAC5C;AAEA,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,IAAI,MAAM,QAAQ,UAAU,QAAQ,MAAM;AACxD,QAAM,cAAc,MAAM,YAAY,QAAQ,OAAO;AAGrD,QAAM,YAAY,CAAC,GAAI,QAAQ,aAAa,CAAA,CAAG;AAG/C,MAAI,QAAQ,SAAS;AACnB,cAAU,KAAK,IAAI,gBAAgB,QAAQ,OAAO,CAAC;EACrD;AAIA,MAAI,CAAC,QAAQ,WAAW,QAAQ,yBAAyB;AACvD,cAAU,KAAK,IAAI,gBAAe,CAAE;EACtC;AAEA,QAAM,kBAAkB;IACtB,SAAS,QAAQ;IACjB,UAAU,QAAQ;IAClB,SAAS,QAAQ;IACjB,kBACE,QAAQ,6BAA6B,YACjC,MAAM,qBACJ,QAAQ,SACR,QAAQ,gBAAgB,QAAQ,OAAO,IAEzC,QAAQ;;AAQhB,QAAM,SAA0B,CAAA;AAEhC,aAAW,YAAY,WAAW;AAChC,QAAI;AAEF,UAAI,CAAE,MAAM,SAAS,SAAS,eAAe,GAAI;AAC/C,iBAAS,eAAe,OAAO,IAC7B,YAAY,SAAS,QAAO,CAAE,qBAAqB,QAAQ,OAAO,OAAO,QAAQ,QAAQ,EAAE;AAE7F;MACF;AAGA,UAAI,EAAE,oBAAoB,kBAAkB;AAC1C,iBAAS,eAAe,OAAO,IAC7B,0CAAgC,SAAS,QAAO,CAAE,EAAE;AAEtD,iBAAS,eAAe,OAAO,IAC7B,qFAA2E;MAE/E;AAEA,eAAS,eAAe,OAAO,IAC7B,oBAAoB,SAAS,QAAO,CAAE,QAAQ,QAAQ,OAAO,IAAI,QAAQ,OAAO,EAAE;AAIpF,YAAM,MAAM,MAAM,SAAS,eAAe,eAAe;AACzD,UAAI,CAAC,KAAK;AACR,iBAAS,eAAe,OAAO,IAC7B,YAAY,SAAS,QAAO,CAAE,wBAAwB,QAAQ,OAAO,IAAI,QAAQ,OAAO,EAAE;AAE5F;MACF;AAEA,eAAS,eAAe,OAAO,IAC7B,6BAA6B,SAAS,QAAO,CAAE,KAAK,GAAG,EAAE;AAG3D,UAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,cAAMC,OAAM,aAAa,EAAC,WAAW,KAAI,CAAC;MAC5C;AAGA,aAAO,MAAM,WAAW,KAAK,SAAS,UAAU,MAAM;IACxD,SAAS,KAAK;AACZ,eAAS,eAAe,OAAO,IAC7B,YAAY,SAAS,QAAO,CAAE,YAAa,IAAc,OAAO,EAAE;AAEpE,aAAO,KAAK;QACV,cAAc,SAAS,QAAO;QAC9B,OAAO;OACR;IAEH;EACF;AAGA,QAAM,eAAe,OAClB,IAAI,OAAI;AACP,WAAO,OAAO,EAAE,YAAY,KAAK,EAAE,MAAM,OAAO;EAClD,CAAC,EACA,KAAK,IAAI;AACZ,QAAM,UAAU,4BAA4B,QAAQ,OAAO,IAAI,QAAQ,OAAO;EAAM,YAAY;AAChG,MACE,OAAO,SAAS,KAChB,OAAO,MAAM,OAAI;AACf,WAAO,EAAE,iBAAiB;EAC5B,CAAC,GACD;AACA,UAAM,IAAI,4BAA4B,OAAO;EAC/C;AACA,QAAM,IAAI,MAAM,OAAO;AACzB;AAwBA,eAAsB,QACpB,SAAuB;AAEvB,UAAQ,aAAa,sBAAqB;AAC1C,UAAQ,WAAW;AACnB,UAAQ,WAAW;AACnB,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,IAAI,MACR,uDAAuDC,IAAG,SAAQ,CAAE,KAAKA,IAAG,KAAI,CAAE,GAAG;EAEzF;AAGA,UAAQ,cAAc,CAAA;AACtB,SAAO,MAAM,qBAAqB,OAAO;AAC3C;AAEA,eAAe,YACb,kBACA,QAAe;AAEf,MACE,QAAQ,aAAa,WACpB,iBAAiB,aAAa,gBAAgB,SAC7C,iBAAiB,aAAa,gBAAgB,WAChD;AACA;EACF;AAEA,QAAM,WAAWC,MAAK,KACpBA,MAAK,QAAQ,iBAAiB,cAAc,GAC5C,UAAU;AAEZ,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,aAAS,eAAe,OAAO,IAC7B,kCAAkC,QAAQ,EAAE;AAE9C;EACF;AACA,QAAM,OAAO,aAAa,UAAU,OAAO,EAAE,MAAM,IAAI,EAAE,KAAK,GAAG;AACjE,MAAI,QAAQ,SAAQ,MAAO,GAAG;AAC5B,UAAM,IAAI,MAAM,yDAAyD;EAC3E;AACA,MAAI,SAASC,WAAU,WAAW,CAAC,IAAI,CAAC;AACxC,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MACR,8EAA8E;EAElF;AACA,WAAS,eAAe,OAAO,IAAI,mCAAmC,IAAI,EAAE;AAC5E,WAASA,WAAU,WAAW;IAC5B;IACA;IACA;IACA;GACD;AACD,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MACR,iDAAiD,OAAO,MAAM,UAAU,OAAO,KAAK,WAAW,OAAO,OAAO,SAAS,MAAM,CAAC,WAAW,OAAO,OAAO,SAAS,MAAM,CAAC,EAAE;EAE5K;AACA,WAAS,eAAe,OAAO,IAAI,iCAAiC,IAAI,EAAE;AAC5E;AAEA,eAAe,WACb,KACA,SACA,UACA,QAAe;AAEf,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,uCAAuC;EACzD;AACA,UAAQ,aAAa,sBAAqB;AAC1C,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,IAAI,MACR,uDAAuDF,IAAG,SAAQ,CAAE,KAAKA,IAAG,KAAI,CAAE,GAAG;EAEzF;AACA,MAAI,2BAA2B,QAAQ;AACvC,MAAI,6BAA6B,WAAW;AAC1C,+BAA2B,MAAM,qBAC/B,QAAQ,SACR,QAAQ,gBAAgB,QAAQ,OAAO;EAE3C;AACA,QAAM,WAAW,mBAAmB,IAAI,SAAQ,CAAE,EAAE,MAAM,GAAG,EAAE,IAAG;AAClE,SAAO,UAAU,uCAAuC,GAAG,GAAG;AAC9D,QAAM,QAAQ,IAAI,MAAM,QAAQ,UAAU,QAAQ,MAAM;AACxD,QAAM,cAAc,MAAM,YAAY,QAAQ,OAAO;AACrD,QAAM,cAAcC,MAAK,KAAK,aAAa,GAAG,QAAQ,OAAO,IAAI,QAAQ,EAAE;AAC3E,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,UAAMF,OAAM,aAAa,EAAC,WAAW,KAAI,CAAC;EAC5C;AAEA,MAAI,QAAQ,cAAc;AACxB,aAAS,eAAe,OAAO,IAC7B,+BAA+B,QAAQ,KAAK,QAAQ,YAAY,EAAE;EAEtE;AAEA,MAAI,CAAC,QAAQ,QAAQ;AACnB,QAAI,WAAW,WAAW,GAAG;AAC3B,aAAO;IACT;AACA,aAAS,eAAe,OAAO,IAAI,2BAA2B,GAAG,EAAE;AACnE,cAAU,UAAU;AACpB,UAAM,aACJ,KACA,aACA,0BACA,QAAQ,YAAY;AAEtB,iBAAa,YAAY,MAAM;AAC/B,WAAO;EACT;AAEA,QAAM,aAAa,MAAM,gBACvB,QAAQ,SACR,QAAQ,UACR,QAAQ,OAAO;AAIjB,QAAMI,0BAAyB,MAAM,SAAS,kBAAkB;IAC9D,SAAS,QAAQ;IACjB,SAAS,QAAQ;IACjB,UAAU,QAAQ;GACnB;AACD,WAAS,eAAe,OAAO,IAC7B,wCAAwCA,uBAAsB,EAAE;AAGlE,QAAM,mBAAmB,IAAI,iBAC3B,OACA,QAAQ,SACR,QAAQ,SACR,QAAQ,QAAQ;AAIlB,MAAI,EAAE,oBAAoB,kBAAkB;AAC1C,UAAM,oBACJ,QAAQ,SACR,QAAQ,UACR,QAAQ,SACRA,uBAAsB;EAE1B;AAEA,MAAI;AACF,QAAI,WAAW,UAAU,GAAG;AAC1B,UAAI,CAAC,WAAW,iBAAiB,cAAc,GAAG;AAChD,cAAM,IAAI,4BACR,uBAAuB,UAAU,gCAAgC,iBAAiB,cAAc,kFAEpF,UAAU,iCAAiC;MAE3D;AACA,YAAM,SAAS,kBAAkB,MAAM;AACvC,UAAI,QAAQ,aAAa;AACvB,cAAM,YAAY,kBAAkB,MAAM;MAC5C;AACA,aAAO;IACT;AAGA,QAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,eAAS,eAAe,OAAO,IAAI,2BAA2B,GAAG,EAAE;AACnE,UAAI;AACF,kBAAU,UAAU;AACpB,cAAM,aACJ,KACA,aACA,0BACA,QAAQ,YAAY;MAExB;AACE,qBAAa,YAAY,MAAM;MACjC;IACF,OAAO;AACL,eAAS,eAAe,OAAO,IAC7B,6BAA6B,WAAW,EAAE;IAE9C;AAEA,aAAS,eAAe,OAAO,IAC7B,cAAc,WAAW,OAAO,UAAU,EAAE;AAE9C,QAAI;AACF,gBAAU,SAAS;AACnB,YAAM,cAAc,aAAa,YAAY,QAAQ,MAAM;IAC7D;AACE,mBAAa,WAAW,MAAM;IAChC;AAEA,QAAI,QAAQ,cAAc;AACxB,YAAM,WAAW,iBAAiB,aAAY;AAC9C,eAAS,QAAQ,QAAQ,YAAY,IAAI,QAAQ;AACjD,uBAAiB,cAAc,QAAQ;IACzC;AAEA,UAAM,SAAS,kBAAkB,MAAM;AACvC,QAAI,QAAQ,aAAa;AACvB,YAAM,YAAY,kBAAkB,MAAM;IAC5C;AACA,WAAO;EACT;AACE,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,OAAO,WAAW;IAC1B;EACF;AACF;AAEA,eAAe,SACb,kBACA,QAAe;AAGf,OACG,iBAAiB,aAAa,gBAAgB,SAC7C,iBAAiB,aAAa,gBAAgB,UAChD,iBAAiB,YAAY,QAAQ,UACrC,iBAAiB,aAAa,sBAAqB,GACnD;AACA,QAAI;AACF,gBAAU,aAAa;AACvB,YAAM,aAAaF,MAAK,QAAQ,iBAAiB,cAAc;AAC/D,YAAM,eAAeA,MAAK,KAAK,YAAY,WAAW;AACtD,UAAI,CAAC,WAAW,YAAY,GAAG;AAC7B;MACF;AACA,MAAAC,WACED,MAAK,KAAK,YAAY,WAAW,GACjC,CAAC,sCAAsC,UAAU,GACjD;QACE,OAAO;OACR;IAIL;AACE,mBAAa,eAAe,MAAM;IACpC;EACF;AACF;AA8BA,eAAsB,UAAU,SAAyB;AACvD,UAAQ,aAAa,sBAAqB;AAC1C,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,IAAI,MACR,2CAA2CD,IAAG,SAAQ,CAAE,KAAKA,IAAG,KAAI,CAAE,GAAG;EAE7E;AAEA,MAAI,MAAM,QAAQ,QAAQ,EAAE,UAC1B,QAAQ,SACR,QAAQ,UACR,QAAQ,OAAO;AAEnB;AAiBA,eAAsB,qBACpB,SAAoC;AAEpC,SAAO,IAAI,MAAM,QAAQ,QAAQ,EAAE,qBAAoB;AACzD;AAKA,eAAsB,YAAY,SAAuB;AACvD,UAAQ,aAAa,sBAAqB;AAC1C,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,IAAI,MACR,uDAAuDA,IAAG,SAAQ,CAAE,KAAKA,IAAG,KAAI,CAAE,GAAG;EAEzF;AAGA,QAAM,YAAY;IAChB,GAAI,QAAQ,aAAa,CAAA;IACzB,IAAI,gBAAgB,QAAQ,OAAO;;AAGrC,QAAM,kBAAkB;IACtB,SAAS,QAAQ;IACjB,UAAU,QAAQ;IAClB,SAAS,QAAQ;;AAInB,aAAW,YAAY,WAAW;AAChC,QAAI,CAAE,MAAM,SAAS,SAAS,eAAe,GAAI;AAC/C;IACF;AACA,UAAM,MAAM,MAAM,SAAS,eAAe,eAAe;AACzD,QAAI,OAAQ,MAAM,gBAAgB,GAAG,GAAI;AACvC,aAAO;IACT;EACF;AAEA,SAAO;AACT;AASM,SAAU,eACd,SACA,UACA,SACA,SAAgB;AAEhB,SAAO,IAAI,IAAI,aAAa,OAAO,EAAE,UAAU,SAAS,OAAO,CAAC;AAClE;AAIA,eAAsB,qBACpB,SACA,SAAe;AAEf,MAAI;AACJ,MAAI,sBAAsB;AAE1B,SAAO,CAAC,iBAAyB,eAAsB;AACrD,QAAI,CAAC,QAAQ;AACX,eAAS,YAAY,gBACnB,eAAe,OAAO,IAAI,OAAO,MAAM,YAAY,UAAU,CAAC,IAC9D,UAAU;IAEd;AACA,UAAM,QAAQ,kBAAkB;AAChC,0BAAsB;AACtB,WAAO,KAAK;EACd;AACF;AAEA,SAAS,YAAY,OAAa;AAChC,QAAM,KAAK,QAAQ,MAAO;AAC1B,SAAO,GAAG,KAAK,MAAM,KAAK,EAAE,IAAI,EAAE;AACpC;;;AIzrBA,SAAQ,SAAAI,cAAY;AACpB,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAQ,SAAS,OAAO,UAAU,cAAa;AAC/C,YAAYC,eAAc;AAgC1B,SAAS,eAAe,SAAgB;AACtC,SAAO,OAAO,OAAO,OAAO,EAAE,SAAS,OAAkB;AAC3D;AAEA,SAAS,gBAAgB,UAAiB;AACxC,SAAO,OAAO,OAAO,eAAe,EAAE,SAAS,QAA2B;AAC5E;AAIA,IAAM,iBAAiB;AAMjB,IAAO,MAAP,MAAU;EACd;EACA;EACA;EACA;EACA;EACA;EASA;EAEA,YACE,MAkBA,IAAuB;AAEvB,QAAI,CAAC,MAAM;AACT,aAAO,CAAA;IACT;AACA,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO;QACL,WAAW;;IAEf;AACA,SAAK,aAAa,KAAK,aAAa,QAAQ,IAAG;AAC/C,SAAK,MAAM;AACX,SAAK,cAAc,KAAK,cAAc;AACtC,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,0BAA0B,KAAK,0BAA0B;AAC9D,SAAK,kBAAkB,KAAK;AAC5B,SAAK,iBAAiB,KAAK;EAC7B;EAUA,wBAA2B,OAAsB,UAAiB;AAChE,WAAO,MAAM,WAAW,WAAW;MACjC,aACE;MACF,MAAM;MACN,QAAQ,CAAC,QAAuB;AAC9B,cAAM,UAA0B;UAC9B,MAAM,KAAK,cAAc,GAAG;UAC5B,SAAS,KAAK,cAAc,GAAG;;AAGjC,YAAI,CAAC,eAAe,QAAQ,IAAI,GAAG;AACjC,gBAAM,IAAI,MAAM,wBAAwB,QAAQ,IAAI,GAAG;QACzD;AAEA,eAAO;MACT;MACA,cAAc;KACf;EACH;EAEA,yBAA4B,OAAoB;AAC9C,WAAO,MAAM,OAAO,YAAY;MAC9B,MAAM;MACN,MAAM;MACN,SAAS,OAAO,OAAO,eAAe;MACtC,SAAS,sBAAqB;MAC9B,QAAQ,cAAW;AACjB,YAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,gBAAM,IAAI,MAAM,yBAAyB,QAAQ,GAAG;QACtD;AAEA,eAAO;MACT;MACA,oBAAoB;KACrB;EACH;EAEA,qBAAwB,OAAsB,WAAW,OAAK;AAC5D,QAAI,CAAC,KAAK,yBAAyB;AACjC,aAAO;IACT;AAEA,WAAO,MAAM,OAAO,QAAQ;MAC1B,MAAM;MACN,MAAM;MACN,oBAAoB;MACpB,GAAI,WAAW,CAAA,IAAK,EAAC,SAAS,QAAQ,IAAG,EAAE;MAC3C,cAAc;KACf;EACH;EAEA,MAAM,IAAI,MAAc;AACtB,UAAM,EAAC,SAAS,MAAK,IAAI,MAAM,OAAO,qBAAO;AAC7C,UAAM,EAAC,QAAO,IAAI,MAAM,OAAO,uBAAe;AAC9C,UAAM,gBAAgB,MAAM,QAAQ,IAAI,CAAC;AACzC,QAAI,SAAS,cACV,WAAW,KAAK,WAAW,EAC3B,QAAQ,KAAK,QAAQ;AACxB,QAAI,KAAK,gBAAgB;AACvB,eAAS,OAAO,QACd,KAAK,eAAe,KACpB,KAAK,eAAe,aACpB,CAAAC,WAAQ;AACN,eAAO,KAAK,OAAOA,MAAK;MAC1B,CAAC;IAEL,OAAO;AACL,eAAS,KAAK,OAAO,MAAM;IAC7B;AACA,UAAM,OACH,cAAc,CAAC,EACf,KAAI,EACJ,KAAK,KAAK,IAAI,KAAK,cAAc,cAAa,CAAE,CAAC,EACjD,WAAU;EACf;EAEA,OAAO,OAA0B;AAC/B,UAAM,iBAAiB,KAAK,kBAAkB,WAAW;AAEzD,UAAM,iBAAiB,KAAK,kBAAkB,cAAc;AAC5D,WAAO,MACJ,QACC,WAAW,cAAc,IACzB,gMACA,CAAAA,WAAQ;AACN,UAAI,KAAK,iBAAiB;AACxB,QAAAA,OAAM,QAAQ,cAAc,6BAA6B;MAC3D;AACA,MAAAA,OACG,QACC,qBACA,eAAe,cAAc,yCAAyC,EAEvE,QACC,4BACA,4DAA4D,EAE7D,QACC,4BACA,oFAAoF,EAErF,QACC,0BACA,kFAAkF,EAEnF,QACC,yBACA,iFAAiF,EAElF,QACC,4BACA,mEAAmE,EAEpE,QACC,yBACA,oDAAoD,EAErD,QACC,kCACA,6DAA6D,EAE9D,QACC,+BACA,0DAA0D,EAE3D,QACC,sCACA,2EAA2E,EAE5E,QACC,oCACA,2DAA2D,EAE5D,QACC,yCACA,6FAA6F,EAE9F,QACC,wCACA,+DAA+D,EAEhE,QACC,+BACA,uDAAuD,EAExD,QACC,sBACA,oEAAoE,EAErE,QACC,6BACA,yDAAyD,EAE1D,QACC,2BACA,uDAAuD,EAExD,QACC,iCACA,6DAA6D,EAE9D,QACC,0BACA,sDAAsD,EAEvD,QACC,8BACA,0DAA0D,EAE3D,QACC,qCACA,oDAAoD,EAErD,QACC,qCACA,8DAA8D;AAElE,UAAI,KAAK,yBAAyB;AAChC,QAAAA,OAAM,QACJ,mDACA,2CAA2C;MAE/C;AAEA,YAAM,wBAAwB,KAAK,wBACjCA,QACA,CAAC,QAAQ,KAAK,eAAe,CAAC;AAEhC,YAAM,yBAAyB,KAAK,yBAClC,qBAAqB;AAEvB,aAAO,KAAK,qBAAqB,wBAAwB,KAAK,EAC3D,OAAO,YAAY;QAClB,MAAM;QACN,MAAM;OACP,EACA,OAAO,gBAAgB;QACtB,MAAM;QACN,MAAM;QACN,SAAS;OACV,EACA,OAAO,UAAU;QAChB,MAAM;QACN,MAAM;QACN,SAAS;OACV;IACL,GACA,OAAM,SAAO;AACX,UAAI,KAAK,mBAAmB,CAAC,KAAK,SAAS;AAIzC,cAAM,SAAS,MAAM,QAAQ,WAC3B,OAAO,QAAQ,KAAK,eAAe,EAAE,IACnC,OAAO,CAAC,SAAS,OAAO,MAAK;AAC3B,cAAI,QAAQ,cAAc;AACxB;UACF;AACA,gBAAM,KAAK,SAAS;YAClB,GAAG;YACH,SAAS;cACP,MAAM;cACN,SAAS,QAAQ;;WAEpB;QACH,CAAC,CACF;AAGH,mBAAWC,YAAW,QAAQ;AAC5B,cAAIA,SAAQ,WAAW,YAAY;AACjC,kBAAMA,SAAQ;UAChB;QACF;MACF,OAAO;AACL,cAAM,KAAK,SAAS,IAAI;MAC1B;IACF,CAAC,EAEF,QACC,oBACA,gCACA,CAAAD,WAAQ;AACN,MAAAA,OACG,QACC,mCACA,8BAA8B,EAE/B,QACC,6BACA,iEAAiE,EAElE,QACC,8CACA,kDAAkD,EAEnD,QACC,oCACA,iFAAiF,EAElF,QACC,gDACA,sEAAsE;AAG1E,YAAM,oBAAoBA,OAAM,oBAAoB;QAClD,cAAc;;OAEf;AACD,YAAM,wBAAwB,KAAK,wBACjC,mBACA,IAAI;AAEN,YAAM,yBAAyB,KAAK,yBAClC,qBAAqB;AAEvB,aAAO,KAAK,qBAAqB,sBAAsB,EACpD,OAAO,YAAY;QAClB,MAAM;QACN,MAAM;QACN,SAAS;OACV,EACA,OAAO,UAAU;QAChB,MAAM;QACN,MAAM;QACN,SAAS;OACV,EACA,OAAO,UAAU;QAChB,MAAM;QACN,MAAM;QACN,SAAS;OACV;IACL,GACA,OAAM,SAAO;AACX,YAAM,YAAY,KAAK,IAAI,GAAG,OAAO,SAAM;AACzC,eAAO,OAAO,QAAQ;MACxB,CAAC;AAED,WAAK,QAAQ,UAAU,KAAK,8BAC1B,KAAK,QAAQ,SACb,KAAK,QAAQ,IAAI;AAGnB,YAAM,iBAAiB,KAAK,SACxB,4BAA4B;QAC1B,SAAS,KAAK,QAAQ;QACtB,SAAS,2BAA2B,KAAK,QAAQ,OAAO;QACxD,UAAU,KAAK;OAChB,IACD,sBAAsB;QACpB,SAAS,KAAK,QAAQ;QACtB,SAAS,KAAK,QAAQ;QACtB,UAAU,KAAK,QAAQ,KAAK;QAC5B,UAAU,KAAK;OAChB;AACL,aAAO;QACL,MAAM;QACN;QACA,QAAQ,KAAK;QACb,UAAU,KAAK;OAChB;IACH,CAAC,EAEF,QACC,SACA,KAAK,0BACD,sEACA,uCAAuC,KAAK,UAAU,IAC1D,CAAAA,WAAQ;AACN,aAAO,KAAK,qBAAqBA,QAAO,IAAI;IAC9C,GACA,OAAM,SAAO;AACX,YAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,YAAM,KAAK,KAAK,OAAgB,0BAAgB,EAAC,OAAO,OAAM,CAAC;AAC/D,SAAG,SACD,oEAAoE,QAAQ,eAC5E,YAAS;AACP,WAAG,MAAK;AACR,YAAI,CAAC,CAAC,KAAK,KAAK,EAAE,SAAS,OAAO,YAAW,EAAG,KAAI,CAAE,GAAG;AACvD,kBAAQ,IAAI,YAAY;AACxB;QACF;AACA,cAAM,QAAQ,IAAI,MAAM,QAAQ;AAChC,cAAM,MAAK;AACX,gBAAQ,IAAI,GAAG,QAAQ,WAAW;MACpC,CAAC;IAEL,CAAC,EAEF,QACC,QACA,sDACA,CAAAA,WAAQ;AACN,MAAAA,OAAM,QACJ,WACA,oDAAoD;AAEtD,UAAI,KAAK,yBAAyB;AAChC,QAAAA,OAAM,QACJ,wCACA,0DAA0D;MAE9D;AAEA,aAAO,KAAK,qBAAqBA,MAAK;IACxC,GACA,OAAM,SAAO;AACX,YAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,YAAM,QAAQ,IAAI,MAAM,QAAQ;AAChC,YAAM,WAAW,MAAM,qBAAoB;AAE3C,iBAAW,WAAW,UAAU;AAC9B,gBAAQ,IACN,GAAG,QAAQ,OAAO,IAAI,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK,QAAQ,cAAc,EAAE;MAE3F;IACF,CAAC,EAEF,QACC,iBACA,oMACA,CAAAA,WAAQ;AACN,aAAOA,OACJ,WAAW,QAAQ;QAClB,MAAM;QACN,aAAa;QACb,cAAc;OACf,EACA,OAAO,QAAQ;QACd,MAAM;QACN,OAAO;QACP,cAAc;QACd,MAAM;OACP,EACA,OAAO,OAAO;QACb,MAAM;QACN,OAAO;QACP,cAAc;QACd,MAAM;OACP,EACA,OAAO,OAAO;QACb,MAAM;QACN,MAAM;QACN,SAAS;OACV;IACL,GACA,OAAM,SAAO;AACX,YAAM,WACJ,KAAK,KAAK,SAAS,MAAM,KACzB,KAAK,KAAK,SAAS,MAAM,KACzB,KAAK,KAAK,SAAS,KAAK;AAC1B,YAAM,cAAc,WAChB,qCAAqC,KAAK,IAAI,KAC9C,qBAAqB,KAAK,IAAI;AAElC,YAAM,mBAAmBE,MAAK,KAAKC,IAAG,QAAO,GAAI,kBAAkB;AAEnE,UAAI,CAACC,IAAG,WAAW,gBAAgB,GAAG;AACpC,gBAAQ,IAAI,iCAAiC;AAC7C,cAAM,WAAW,MAAM,MACrB,8FAA8F;AAEhG,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MACR,wCAAwC,SAAS,UAAU,EAAE;QAEjE;AACA,cAAM,aAAa,MAAM,SAAS,KAAI;AACtC,cAAM,cAAc,OAAO,KAAK,YAAY,QAAQ,EAAE,SACpD,OAAO;AAET,QAAAA,IAAG,cAAc,kBAAkB,aAAa,EAAC,MAAM,IAAK,CAAC;AAC7D,gBAAQ,IAAI,6BAA6B,gBAAgB,EAAE;MAC7D;AAEA,YAAM,mBAAmB;AACzB,YAAM,aAAa;QACjB;QACA;QACA,KAAK;QACL;QACA,KAAK;QACL,KAAK,MAAM,SAAS;QACpB;QACA;QACA;QACA;QACA;;AAGF,YAAM,IAAI,QAAc,CAACC,UAAS,WAAU;AAC1C,cAAM,gBAAgBC,OAAM,kBAAkB,YAAY;UACxD,OAAO;SACR;AAED,sBAAc,GAAG,SAAS,aAAU;AAClC,iBAAO,OAAO;QAChB,CAAC;AAED,sBAAc,GAAG,QAAQ,UAAO;AAC9B,cAAI,SAAS,GAAG;AACd,mBAAO,IAAI,MAAM,4BAA4B,IAAI,EAAE,CAAC;UACtD,OAAO;AACL,YAAAD,SAAO;UACT;QACF,CAAC;MACH,CAAC;IACH,CAAC,EAEF,cAAc,CAAC,EACf,KAAI;EACT;EAEA,cAAc,SAAe;AAC3B,WAAO,QAAQ,MAAM,GAAG,EAAE,MAAK;EACjC;EAEA,cAAc,SAAe;AAC3B,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,WAAO,MAAM,WAAW,IACpB,MAAM,CAAC,IACP,KAAK,kBACH,WACA;EACR;EAEA,8BAA8B,SAAiB,aAAoB;AACjE,QAAI,YAAY,UAAU;AACxB,YAAM,UAAU,KAAK,kBAAkB,WAAW;AAClD,UAAI,CAAC,WAAW,CAAC,QAAQ,SAAS;AAChC,cAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;MAC9D;AACA,aAAO,QAAQ;IACjB;AACA,WAAO;EACT;EAEA,MAAM,SAAS,MAAiB;AAC9B,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,yBAAyB;IAC3C;AACA,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,wCAAwC;IAC1D;AACA,SAAK,QAAQ,UAAU,KAAK,8BAC1B,KAAK,QAAQ,SACb,KAAK,QAAQ,IAAI;AAEnB,UAAM,kBAAkB,KAAK,QAAQ;AACrC,SAAK,QAAQ,UAAU,MAAME,gBAC3B,KAAK,QAAQ,MACb,KAAK,UACL,KAAK,QAAQ,OAAO;AAEtB,QAAI;AACF,YAAM,QAAQ;QACZ,SAAS,KAAK,QAAQ;QACtB,SAAS,KAAK,QAAQ;QACtB,UAAU,KAAK;QACf,UAAU,KAAK,QAAQ,KAAK;QAC5B,0BAA0B;QAC1B,SAAS,KAAK;QACd,cACE,oBAAoB,KAAK,QAAQ,UAC7B,kBACA;QACN,aAAa,KAAK;OACnB;IACH,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,8BAA8B;AACnD,cAAM;MACR;AACA,YAAM,UAAU,KAAK,iBACjB,GAAG,KAAK,WAAW,IAAI,KAAK,eAAe,GAAG,KAC9C,KAAK;AACT,YAAM,IAAI,MACR,GAAG,MAAM,OAAO;wDAA2D,OAAO,+BAA+B,OAAO,qBACxH,EAAC,OAAO,MAAK,CAAC;IAElB;AACA,UAAM,iBAAiB,sBAAsB;MAC3C,SAAS,KAAK,QAAQ;MACtB,SAAS,KAAK,QAAQ;MACtB,UAAU,KAAK,QAAQ,KAAK;MAC5B,UAAU,KAAK;KAChB;AAED,YAAQ,IACN,KAAK,OACF,QAAQ,gBAAgB,KAAK,QAAQ,IAAI,EACzC,QAAQ,gBAAgB,KAAK,QAAQ,OAAO,EAC5C,QAAQ,aAAa,cAAc,EACnC,QAAQ,iBAAiB,KAAK,QAAQ,CAAC;EAE9C;;;;ACvgBI,SAAU,qBACd,SACA,UACA,SACA,YAAY,OAAK;AAEjB,SAAO,GAAG,OAAO,IAAI,QAAQ,IAAI,OAAO,IAAI,SAAS;AACvD;","names":["os","path","URL","resolve","request","Browser","BrowserPlatform","BrowserTag","ChromeReleaseChannel","channel","path","folder","resolveDownloadUrl","resolveDownloadPath","relativeExecutablePath","path","path","folder","resolveDownloadUrl","resolveDownloadPath","relativeExecutablePath","path","path","folder","resolveDownloadUrl","resolveDownloadPath","relativeExecutablePath","path","resolveBuildId","compareVersions","path","archive","resolveDownloadUrl","resolveDownloadPath","relativeExecutablePath","path","FirefoxChannel","baseVersionUrl","resolveBuildId","baseVersionUrl","input","path","compareVersions","resolveDownloadUrl","resolveDownloadPath","relativeExecutablePath","compareVersions","resolveBuildId","createProfile","resolveDefaultUserDataDir","resolveSystemExecutablePaths","fs","os","path","os","os","path","fs","os","os","resolveSystemExecutablePaths","path","resolve","spawnSync","mkdir","os","path","createWriteStream","path","resolve","createWriteStream","mkdir","os","path","spawnSync","relativeExecutablePath","spawn","fs","os","path","readline","yargs","install","path","os","fs","resolve","spawn","resolveBuildId"]}