{"version":3,"sources":["../../src/index.ts","../../src/utilities.ts","../../src/utilities.client.ts","../../src/usernames.ts","../../src/exponential_backoff.ts","../../src/health_checker.ts","../../src/parse_jsonl_stream.ts","../../src/streams_utilities.ts","../../src/webhook_payload_template.ts","../../src/crypto.ts","../../src/url_params_utils.ts","../../src/code_hash_manager.ts","../../src/hmac.ts","../../src/storages.ts","../../src/parse_boolean.ts"],"sourcesContent":["export * from './utilities';\nexport * from './utilities.client';\nexport * from './usernames';\nexport * from './exponential_backoff';\nexport * from './health_checker';\nexport * from './parse_jsonl_stream';\nexport * from './streams_utilities';\nexport * from './webhook_payload_template';\nexport * from './crypto';\nexport * from './url_params_utils';\nexport * from './code_hash_manager';\nexport * from './hmac';\nexport * from './storages';\nexport * from './parse_boolean';\n","/*!\n * This module contains various server utility and helper functions.\n * Note that it automatically exports functions from utilities.client.js\n *\n * Author: Jan Curn (jan@apify.com)\n * Copyright(c) 2015 Apify. All rights reserved.\n *\n */\n\nimport crypto from 'node:crypto';\n\nimport type { Log } from '@apify/log';\nimport log, { LoggerJson, LogLevel } from '@apify/log';\n\n/**\n * Generates a random cryptographically strong string consisting of 17 alphanumeric characters.\n * This string is similar to MongoDB ObjectIds generated by Meteor.\n */\nexport function cryptoRandomObjectId(length = 17): string {\n    const chars = 'abcdefghijklmnopqrstuvwxyzABCEDFGHIJKLMNOPQRSTUVWXYZ0123456789';\n    const bytes = crypto.randomBytes(length);\n    let str = '';\n    // eslint-disable-next-line\n    for (let i = bytes.length - 1; i >= 0; i--) {\n        str += chars[(bytes[i] | 0) % chars.length];\n    }\n    return str;\n}\n\n/**\n * Generates unique, deterministic record ID from the provided key with given length (defaults to 17).\n */\nexport function deterministicUniqueId(key: string, length = 17): string {\n    return crypto\n        .createHash('sha256')\n        .update(key)\n        .digest('base64')\n        .replace(/(\\+|\\/|=)/g, 'x')\n        .substr(0, length);\n}\n\n/**\n * Returns a random integer between 0 and max (excluded, unless it is also 0).\n * @param maxExcluded - exclusive upper bound; the returned value is always lower than this\n */\nexport function getRandomInt(maxExcluded: number) {\n    maxExcluded = Math.floor(maxExcluded);\n    return Math.floor(Math.random() * maxExcluded);\n}\n\n/**\n * If 'date' is a String, this function converts and returns it as a Date object.\n * Otherwise, the function returns the original 'date' argument.\n * This function is useful to convert dates transfered via JSON which doesn't natively support dates.\n */\nexport function parseDateFromJson(date: string | Date) {\n    if (typeof date === 'string') {\n        return new Date(Date.parse(date));\n    }\n    return date;\n}\n\n/**\n * Returns a Promise object that will wait a specific number of milliseconds.\n * @param millis - time to wait in milliseconds; if not larger than zero, the promise resolves immediately\n */\nexport async function delayPromise(millis: number): Promise<void> {\n    return new Promise((resolve) => {\n        if (millis > 0) {\n            setTimeout(() => resolve(), millis);\n        } else {\n            resolve();\n        }\n    });\n}\n\n/**\n * Removes an element from an array.\n */\nexport function removeFromArray<T>(array: T[], element: T) {\n    const index = array.indexOf(element);\n    if (index >= 0) {\n        array.splice(index, 1);\n        return true;\n    }\n    return false;\n}\n\ninterface RequestLike {\n    url: string;\n}\n\ninterface ResponseLike {\n    status: (code: number) => void;\n    send: (payload: string) => void;\n    headersSent?: boolean;\n}\n\n/**\n * A default route for HTTP 404 error page for API endpoints.\n */\nexport function http404Route(req: RequestLike, res: ResponseLike) {\n    res.status(404);\n    res.send('Page not found');\n}\n\n/**\n * Default error handler of Express API endpoints.\n */\nexport function expressErrorHandler(\n    err: Error,\n    req: RequestLike,\n    res: ResponseLike,\n    next: (...a: unknown[]) => unknown,\n) {\n    log.warning('Client HTTP request failed', { url: req.url, errMsg: err.message });\n    if (res.headersSent) {\n        next(err);\n        return;\n    }\n    res.status(505);\n    res.send('Internal server error');\n}\n\nexport type BetterIntervalID = { _betterClearInterval: () => void };\n\n/**\n * Similar to setInterval() but with two important differences:\n * First, it assumes the function is asynchronous and only schedules its next invocation AFTER the asynchronous function finished.\n * Second, it invokes the function immediately.\n * @param func Function to be periodically executed.\n * For backwards compatibility reasons, it is passed a callback as its first argument during invocation, however that callback has no effect.\n * @param delay The number of milliseconds to wait to next invocation of the function after the current invocation finishes.\n * @returns Object that can be passed to betterClearInterval()\n */\nexport function betterSetInterval(\n    func: ((a: (...args: unknown[]) => unknown) => void) | ((...args: unknown[]) => unknown),\n    delay: number,\n): BetterIntervalID {\n    let scheduleNextRun: () => void;\n    let timeoutId: NodeJS.Timeout;\n    let isRunning = true;\n\n    const funcWrapper = function () {\n        // Historically, the function was passed a callback that it needed to call to signal it was done.\n        // We keep passing this callback for backwards compatibility, but it has no effect anymore.\n        void new Promise((resolve) => {\n            resolve(func(() => undefined));\n        }).finally(scheduleNextRun);\n    };\n    scheduleNextRun = function () {\n        if (isRunning) timeoutId = setTimeout(funcWrapper, delay);\n    };\n    funcWrapper();\n\n    return {\n        _betterClearInterval() {\n            isRunning = false;\n            clearTimeout(timeoutId);\n        },\n    };\n}\n\nexport function betterClearInterval(intervalID: BetterIntervalID) {\n    // eslint-disable-next-line no-underscore-dangle\n    if (intervalID && intervalID._betterClearInterval) {\n        try {\n            // eslint-disable-next-line no-underscore-dangle\n            intervalID._betterClearInterval();\n        } catch (e) {\n            log.exception(e as Error, '_betterClearInterval() threw an exception!?');\n        }\n    }\n}\n\n/**\n * Escapes a string so that it can be used in regular expression (e.g. converts \"myfile.*\" to \"myfile\\\\.\\\\*\").\n */\nexport function escapeRegExp(str: string): string {\n    // code taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n    return String(str).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * String left pad\n */\nexport function leftpad(str: string, len: number, ch: string | number = ' ') {\n    // code inspired by https://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/\n    str = String(str);\n    let i = -1;\n\n    if (!ch && ch !== 0) ch = ' ';\n\n    len -= str.length;\n\n    while (++i < len) {\n        str = ch + str;\n    }\n\n    return str;\n}\n\n/**\n * Computes weighted average of 2 values.\n */\nexport function weightedAverage(val1: number, weight1: number, val2: number, weight2: number) {\n    return (val1 * weight1 + val2 * weight2) / (weight1 + weight2);\n}\n\n/**\n * Executes array of promises in sequence and then returns array where Nth item is result of Nth promise.\n */\nexport async function sequentializePromises<T>(promises: (Promise<T> | (() => Promise<T>))[]) {\n    if (!promises.length) return [];\n    const results: T[] = [];\n\n    for (const promiseOrFunc of promises) {\n        const promise = promiseOrFunc instanceof Function ? promiseOrFunc() : promiseOrFunc;\n        results.push(await promise);\n    }\n\n    return results;\n}\n\n/**\n * Helper function for validation if parameter is an instance of given prototype or multiple prototypes.\n */\nexport function checkParamPrototypeOrThrow(\n    paramVal: any,\n    paramName: string,\n    prototypes: any,\n    prototypeName: string,\n    isOptional = false,\n) {\n    if (isOptional && (paramVal === undefined || paramVal === null)) return;\n\n    const hasCorrectPrototype =\n        prototypes instanceof Array\n            ? prototypes.some((prototype) => paramVal instanceof prototype)\n            : paramVal instanceof prototypes;\n\n    if (!hasCorrectPrototype) throw new Error(`Parameter \"${paramName}\" must be an instance of ${prototypeName}`);\n}\n\ninterface Server {\n    removeListener(event: string, cb: (...params: any[]) => any): unknown;\n    on(event: string, cb: (...params: any[]) => any): unknown;\n    listen(port: number): unknown;\n}\n\n/**\n * Starts listening at a port specified in the constructor.\n * Unfortunately server.listen() is not a normal function that fails on error, so we need this trickery.\n * Returns a function that calls `server.listen(port)` and resolves once server starts listening.\n *\n * Usage: `promisifyServerListen(server)(1234)`;\n */\nexport function promisifyServerListen<T extends Server>(server: T) {\n    return async (port: number) => {\n        return new Promise<void>((resolve, reject) => {\n            function removeListeners() {\n                server.removeListener('error', onError);\n                server.removeListener('listening', onListening);\n            }\n            function onError(err: Error) {\n                removeListeners();\n                reject(err);\n            }\n            function onListening() {\n                removeListeners();\n                resolve();\n            }\n\n            server.on('error', onError);\n            server.on('listening', onListening);\n            server.listen(port);\n        });\n    };\n}\n\nexport function configureLogger(givenLog: Log, isProduction?: boolean) {\n    if (isProduction) {\n        givenLog.setOptions({\n            level: LogLevel.INFO,\n            logger: new LoggerJson(),\n        });\n    } else {\n        givenLog.setOptions({ level: LogLevel.DEBUG });\n    }\n}\n\n/**\n * Wraps given promise with timeout.\n */\nexport async function timeoutPromise<T>(\n    promise: Promise<T>,\n    timeoutMillis: number,\n    errorMessage = 'Promise has timed-out',\n) {\n    return new Promise((resolve, reject) => {\n        let timeout: number;\n        let hasFulfilled = false;\n\n        const callback = (err: Error | null, result?: T) => {\n            if (hasFulfilled) return;\n            clearTimeout(timeout);\n            hasFulfilled = true;\n            if (err) {\n                reject(err);\n                return;\n            }\n            resolve(result);\n        };\n\n        promise.then<void, void>((result: T) => callback(null, result), callback);\n        timeout = setTimeout(() => callback(new Error(errorMessage)), timeoutMillis) as unknown as number;\n    });\n}\n\n/**\n * Removes the leading ^ and trailing $ from regex\n */\nexport function createInjectableRegExp(regex: RegExp) {\n    return new RegExp(regex.source.replace(/^\\^|\\$$/g, ''));\n}\n","/*!\n * This module contains various client-side utility and helper functions.\n *\n * Author: Jan Curn (jan@apify.com)\n * Copyright(c) 2016 Apify. All rights reserved.\n *\n */\n\nimport { RELATIVE_URL_REGEX, VERSION_INT_MAJOR_BASE, VERSION_INT_MINOR_BASE } from '@apify/consts';\n\n/**\n * Returns true if object equals null or undefined, otherwise returns false.\n */\nexport function isNullOrUndefined(obj: unknown): boolean {\n    return obj == null;\n}\n\nexport function isBuffer(obj: any): boolean {\n    return (\n        obj != null &&\n        obj.constructor != null &&\n        typeof obj.constructor.isBuffer === 'function' &&\n        obj.constructor.isBuffer(obj)\n    );\n}\n\n/**\n * Converts Date object to ISO string.\n */\nexport function dateToString(date: Date, middleT: boolean): string {\n    if (!(date instanceof Date)) {\n        return '';\n    }\n    const year = date.getFullYear();\n    const month = date.getMonth() + 1; // January is 0, February is 1, and so on.\n    const day = date.getDate();\n    const hours = date.getHours();\n    const minutes = date.getMinutes();\n    const seconds = date.getSeconds();\n    const millis = date.getMilliseconds();\n\n    const pad = (num: number) => (num < 10 ? `0${num}` : num);\n    const datePart = `${year}-${pad(month)}-${pad(day)}`;\n    // eslint-disable-next-line no-nested-ternary\n    const millisPart = millis < 10 ? `00${millis}` : millis < 100 ? `0${millis}` : millis;\n    const timePart = `${pad(hours)}:${pad(minutes)}:${pad(seconds)}.${millisPart}`;\n\n    return `${datePart}${middleT ? 'T' : ' '}${timePart}`;\n}\n\n/**\n * Ensures a string is shorter than a specified number of character, and truncates it if not,\n * appending a specific suffix to it.\n * @param str\n * @param maxLength\n * @param [suffix] Suffix to be appended to truncated string. Defaults to \"...[truncated]\".\n */\nexport function truncate(str: string, maxLength: number, suffix = '...[truncated]'): string {\n    maxLength = Math.floor(maxLength);\n\n    // TODO: we should just ignore rest of the suffix...\n    if (suffix.length > maxLength) {\n        throw new Error('suffix string cannot be longer than maxLength');\n    }\n\n    if (typeof str === 'string' && str.length > maxLength) {\n        str = str.substr(0, maxLength - suffix.length) + suffix;\n    }\n\n    return str;\n}\n\n/**\n * Gets ordinal suffix for a number (e.g. \"nd\" for 2).\n */\nexport function getOrdinalSuffix(num: number) {\n    // code from https://ecommerce.shopify.com/c/ecommerce-design/t/ordinal-number-in-javascript-1st-2nd-3rd-4th-29259\n    const s = ['th', 'st', 'nd', 'rd'];\n    const v = num % 100;\n    return s[(v - 20) % 10] || s[v] || s[0];\n}\n\ninterface Uri {\n    protocol?: string;\n    host?: string;\n    path?: string;\n    query?: string;\n    fragment?: string;\n    fragmentKey?: Record<string, unknown>;\n}\n\n/**\n * @deprecated use `new URL()` instead\n */\nexport function parseUrl(str: string): Uri {\n    if (typeof str !== 'string') return {};\n    const o = {\n        strictMode: false,\n        key: [\n            'source',\n            'protocol',\n            'authority',\n            'userInfo',\n            'user',\n            'password',\n            'host',\n            'port',\n            'relative',\n            'path',\n            'directory',\n            'file',\n            'query',\n            'fragment',\n        ],\n        q: {\n            name: 'queryKey',\n            parser: /(?:^|&)([^&=]*)=?([^&]*)/g,\n        },\n        parser: {\n            strict: /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/, // eslint-disable-line max-len,no-useless-escape\n            loose: /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/, // eslint-disable-line max-len,no-useless-escape\n        },\n    };\n\n    const m = o.parser[o.strictMode ? 'strict' : 'loose'].exec(str);\n    const uri: Record<string, any> = {};\n    let i = o.key.length;\n\n    while (i--) uri[o.key[i]] = m![i] || '';\n\n    uri[o.q.name] = {};\n    uri[o.key[12]].replace(o.q.parser, ($0: any, $1: any, $2: any) => {\n        if ($1) uri[o.q.name][$1] = $2;\n    });\n\n    // our extension - parse fragment using a query string format (i.e. \"#key1=val1&key2=val2\")\n    // this format is used by many websites\n    uri.fragmentKey = {};\n    if (uri.fragment) {\n        // casting as any, as the usage seems invalid, replacer should always return something (but keeping as is to mitigate unwanted BCs)\n        uri.fragment.replace(o.q.parser, (($0: any, $1: any, $2: any) => {\n            if ($1) uri.fragmentKey![$1] = $2;\n        }) as any);\n    }\n\n    return uri;\n}\n\nexport function normalizeUrl(url: string, keepFragment?: boolean) {\n    if (typeof url !== 'string' || !url.length) {\n        return null;\n    }\n\n    let urlObj;\n\n    try {\n        urlObj = new URL(url.trim());\n    } catch {\n        return null;\n    }\n\n    const { searchParams } = urlObj;\n\n    for (const key of [...searchParams.keys()]) {\n        if (key.startsWith('utm_')) {\n            searchParams.delete(key);\n        }\n    }\n\n    searchParams.sort();\n\n    const protocol = urlObj.protocol.toLowerCase();\n    const host = urlObj.host.toLowerCase();\n    const path = urlObj.pathname.replace(/\\/$/, '');\n    const search = searchParams.toString() ? `?${searchParams}` : '';\n    const hash = keepFragment ? urlObj.hash : '';\n\n    return `${protocol}//${host}${path}${search}${hash}`;\n}\n\n// Helper function for markdown rendered marked\n// If passed referrerHostname, it renders links outside that hostname in readme with rel=\"noopener noreferrer\" and target=\"_blank\" attributes\n// And links outside apify.com in readme with rel=\"noopener noreferrer nofollow\" and target=\"_blank\" attributes\nexport function markedSetNofollowLinks(href: string, title: string, text: string, referrerHostname?: string) {\n    let urlParsed: URL;\n    try {\n        urlParsed = new URL(href);\n    } catch {\n        // Probably invalid url, go on\n    }\n    const isApifyLink = urlParsed! && /(\\.|^)apify\\.com$/i.test(urlParsed.hostname);\n    const isSameHostname = !referrerHostname || (urlParsed! && urlParsed.hostname === referrerHostname);\n\n    if (isApifyLink && isSameHostname) {\n        return `<a href=\"${href}\">${title || text}</a>`;\n    }\n    if (isApifyLink) {\n        return `<a rel=\"noopener noreferrer\" target=\"_blank\" href=\"${href}\">${title || text}</a>`;\n    }\n\n    return `<a rel=\"noopener noreferrer nofollow\" target=\"_blank\" href=\"${href}\">${title || text}</a>`;\n}\n\n// Helper function for markdown rendered marked\n// Decreases level of all headings by one, h1 -> h2\nexport function markedDecreaseHeadsLevel(text: string, level: number) {\n    level += 1;\n    return `<h${level}>${text}</h${level}>`;\n}\n\n/**\n * Converts integer version number previously generated by buildNumberToInt() or versionNumberToInt()\n * to string in a form 'MAJOR.MINOR' or 'MAJOR.MINOR.BUILD' in case build number is non-zero.\n */\nexport function buildOrVersionNumberIntToStr(int: number): string | null {\n    if (typeof int !== 'number' || !(int >= 0)) return null;\n\n    const major = Math.floor(int / VERSION_INT_MAJOR_BASE);\n    const remainder = int % VERSION_INT_MAJOR_BASE;\n    const minor = Math.floor(remainder / VERSION_INT_MINOR_BASE);\n    const build = remainder % VERSION_INT_MINOR_BASE;\n\n    let str = `${major}.${minor}`;\n    if (build > 0) str += `.${build}`;\n\n    return str;\n}\n\n// escaped variants for various strings\nconst ESCAPE_DOT = '\\uFF0E'; // \".\"\nconst ESCAPE_DOLLAR = '\\uFF04'; // \"$\"\nconst ESCAPE_TO_BSON = '\\uFF54\\uFF4F\\uFF22\\uFF33\\uFF2F\\uFF2E'; // \"toBSON\"\nconst ESCAPE_TO_STRING = '\\uFF54\\uFF4F\\uFF33\\uFF54\\uFF52\\uFF49\\uFF4E\\uFF47'; // \"toString\"\nconst ESCAPE_BSON_TYPE = '\\uFF3F\\uFF42\\uFF53\\uFF4F\\uFF4E\\uFF54\\uFF59\\uFF50\\uFF45'; // \"_bsontype\"\nconst ESCAPE_NULL = ''; // \"\\0\" (null chars are removed completely, they won't be recovered)\n\nconst REGEXP_IS_ESCAPED = new RegExp(\n    `(${ESCAPE_DOT}|^${ESCAPE_DOLLAR}|^${ESCAPE_TO_BSON}$|^${ESCAPE_BSON_TYPE}|^${ESCAPE_TO_STRING}$)`,\n);\n\nconst REGEXP_DOT = new RegExp(ESCAPE_DOT, 'g');\nconst REGEXP_DOLLAR = new RegExp(`^${ESCAPE_DOLLAR}`);\nconst REGEXP_TO_BSON = new RegExp(`^${ESCAPE_TO_BSON}$`);\nconst REGEXP_TO_STRING = new RegExp(`^${ESCAPE_TO_STRING}$`);\nconst REGEXP_BSON_TYPE = new RegExp(`^${ESCAPE_BSON_TYPE}$`);\n\n/**\n * If a property name is invalid for MongoDB or BSON, the function transforms\n * it to a valid form, which can be (most of the time) reversed back using unescapePropertyName().\n * For a detailed list of transformations, see escapeForBson().\n * @private\n */\nexport function escapePropertyName(name: string) {\n    // From MongoDB docs:\n    // \"Field names cannot contain dots (.) or null (\"\\0\") characters, and they must not start with\n    // a dollar sign (i.e. $). See faq-dollar-sign-escaping for an alternate approach.\"\n    // Moreover, the name cannot be \"toBSON\" and \"_bsontype\" because they have a special meaning in BSON serialization.\n    // Other special BSON properties like $id and $db are covered thanks to $ escape.\n    // 2021-06-25: The `toString` string was added as a property to escape because\n    // it generates issues due to a bug in mongo bson-ext package https://jira.mongodb.org/browse/NODE-3375.\n\n    // pre-test to improve performance\n    // eslint-disable-next-line no-control-regex -- intentionally matching the null character escaped by MongoDB BSON\n    if (/(\\.|^\\$|^toBSON$|^_bsontype$|^toString$|\\0)/.test(name)) {\n        name = name.replace(/\\./g, ESCAPE_DOT);\n        name = name.replace(/^\\$/, ESCAPE_DOLLAR);\n        name = name.replace(/^toBSON$/, ESCAPE_TO_BSON);\n        name = name.replace(/^toString$/, ESCAPE_TO_STRING);\n        name = name.replace(/^_bsontype$/, ESCAPE_BSON_TYPE);\n        // eslint-disable-next-line no-control-regex -- intentionally matching the null character escaped by MongoDB BSON\n        name = name.replace(/\\0/g, ESCAPE_NULL);\n    }\n\n    return name;\n}\n\n/**\n * Reverses a string transformed using escapePropertyName() back to its original form.\n * Note that the reverse transformation might not be 100% correct for certain unlikely-to-occur strings\n * (e.g. string contain null chars).\n * @private\n */\nexport function unescapePropertyName(name: string) {\n    // pre-test to improve performance\n    if (REGEXP_IS_ESCAPED.test(name)) {\n        name = name.replace(REGEXP_DOT, '.');\n        name = name.replace(REGEXP_DOLLAR, '$');\n        name = name.replace(REGEXP_TO_BSON, 'toBSON');\n        name = name.replace(REGEXP_TO_STRING, 'toString');\n        name = name.replace(REGEXP_BSON_TYPE, '_bsontype');\n    }\n\n    return name;\n}\n\n/**\n * Traverses an object, creates a deep clone if requested and transforms object keys and values using a provided function.\n * The `traverseObject` is recursive, hence if the input object has circular references, the function will run into\n * and infinite recursion and crash the Node.js process.\n * @param obj Object to traverse, it must not contain circular references!\n * @param clone If true, object is not modified but cloned.\n * @param transformFunc Function used to transform the property names na value.\n *  It has the following signature: `(key, value) => [key, value]`.\n *  Beware that the transformed value is only set if it !== old value.\n * @returns {*}\n * @private\n */\nexport function traverseObject(\n    obj: Record<string, any>,\n    clone: boolean,\n    transformFunc: (key: string, value: unknown) => [string, unknown],\n) {\n    // Primitive types don't need to be cloned or further traversed.\n    // Buffer needs to be skipped otherwise this will iterate over the whole buffer which kills the event loop.\n    if (\n        obj === null ||\n        typeof obj !== 'object' ||\n        Object.prototype.toString.call(obj) === '[object Date]' ||\n        isBuffer(obj)\n    )\n        return obj;\n\n    let result;\n\n    if (Array.isArray(obj)) {\n        // obj is an array, keys are numbers and never need to be escaped\n        result = clone ? new Array(obj.length) : obj;\n        for (let i = 0; i < obj.length; i++) {\n            const val = traverseObject(obj[i], clone, transformFunc);\n            if (clone) result[i] = val;\n        }\n\n        return result;\n    }\n\n    // obj is an object, all keys need to be checked\n    result = clone ? {} : obj;\n    // eslint-disable-next-line no-restricted-syntax, guard-for-in\n    for (const key in obj) {\n        const val = traverseObject(obj[key], clone, transformFunc);\n        const [transformedKey, transformedVal] = transformFunc(key, val);\n        if (key === transformedKey) {\n            // For better efficiency, skip setting the key-value if not cloning and nothing changed\n            if (clone || val !== transformedVal) result[key] = transformedVal;\n        } else {\n            // Key has been renamed\n            result[transformedKey] = transformedVal;\n            if (!clone) delete obj[key];\n        }\n    }\n\n    return result;\n}\n\n/**\n * Transforms an object so that it can be stored to MongoDB or serialized to BSON.\n * It does so by transforming prohibited property names (e.g. names starting with \"$\",\n * containing \".\" or null char, equal to \"toBSON\" or \"_bsontype\") to equivalent full-width Unicode chars\n * which are normally allowed. To revert this transformation, use unescapeFromBson().\n * @param obj Object to be transformed. It must not contain circular references or any complex types (e.g. Maps, Promises etc.)!\n * @param clone If true, the function transforms a deep clone of the object rather than the original object.\n * @returns {*} Transformed object\n */\nexport function escapeForBson(obj: Record<string, any>, clone = false) {\n    return traverseObject(obj, clone, (key, value) => [escapePropertyName(key), value]);\n}\n\n/**\n * Reverts a transformation of object property names performed by escapeForBson().\n * Note that the reverse transformation might not be 100% equal to the original object\n * for certain unlikely-to-occur property name (e.g. one contain null chars or full-width Unicode chars).\n * @param obj Object to be transformed. It must not contain circular references or any complex types (e.g. Maps, Promises etc.)!\n * @param clone If true, the function transforms a deep clone of the object rather than the original object.\n * @returns {*} Transformed object.\n */\nexport function unescapeFromBson(obj: Record<string, any>, clone = false): Record<string, any> {\n    return traverseObject(obj, clone, (key, value) => [unescapePropertyName(key), value]);\n}\n\n/**\n * Determines whether an object contains property names that cannot be stored to MongoDB.\n * See escapeForBson() for more details.\n * Note that this function only works with objects that are serializable to JSON!\n * @param obj Object to be checked. It must not contain circular references or any complex types (e.g. Maps, Promises etc.)!\n * @returns {boolean} Returns true if object is invalid, otherwise it returns false.\n */\nexport function isBadForMongo(obj: Record<string, any>): boolean {\n    let isBad = false;\n    try {\n        traverseObject(obj, false, (key, value) => {\n            const escapedKey = escapePropertyName(key);\n            if (key !== escapedKey) {\n                isBad = true;\n                throw new Error();\n            }\n            return [key, value];\n        });\n    } catch (e) {\n        if (!isBad) throw e;\n    }\n    return isBad;\n}\n\nexport class JsonVariable {\n    constructor(readonly name: string) {}\n\n    getToken() {\n        return `{{${this.name}}}`;\n    }\n}\n\n/**\n * Stringifies provided value to JSON with a difference that supports functions that\n * are stringified using .toString() method.\n *\n * In addition to that supports instances of JsonVariable('my.token') that are replaced\n * with a {{my.token}}.\n */\nexport function jsonStringifyExtended(\n    value: Record<string, any>,\n    replacer?: ((k: string, val: unknown) => unknown) | null,\n    space = 0,\n): string {\n    if (replacer && !(replacer instanceof Function))\n        throw new Error('Parameter \"replacer\" of jsonStringifyExtended() must be a function!');\n\n    const replacements: Record<string, string> = {};\n\n    const extendedReplacer = (key: string, val: unknown) => {\n        val = replacer ? replacer(key, val) : val;\n\n        if (val instanceof Function) return val.toString();\n        if (val instanceof JsonVariable) {\n            const randomToken = `<<<REPLACEMENT_TOKEN::${Math.random()}>>>`;\n            replacements[randomToken] = val.getToken();\n            return randomToken;\n        }\n\n        return val;\n    };\n\n    let stringifiedValue = JSON.stringify(value, extendedReplacer, space);\n    Object.entries(replacements).forEach(([replacementToken, replacementValue]) => {\n        stringifiedValue = stringifiedValue.replace(`\"${replacementToken}\"`, replacementValue);\n    });\n\n    return stringifiedValue;\n}\n\n/**\n * Splits a full name into the first name and last name, trimming all internal and external spaces.\n * Returns an array with two elements or null if splitting is not possible.\n */\nexport function splitFullName(fullName: string) {\n    if (typeof fullName !== 'string') return [null, null];\n\n    const names = (fullName || '').trim().split(' ');\n    const nonEmptyNames = names.filter((val) => val);\n\n    if (nonEmptyNames.length === 0) {\n        return [null, null];\n    }\n\n    if (nonEmptyNames.length === 1) {\n        return [null, nonEmptyNames[0]];\n    }\n\n    return [names[0], nonEmptyNames.slice(1).join(' ')];\n}\n\n/**\n * Perform a Regex test on a given URL to see if it is relative.\n */\nexport function isUrlRelative(url: string): boolean {\n    return RELATIVE_URL_REGEX.test(url);\n}\n","import { ANONYMOUS_USERNAME, APIFY_ID_REGEX } from '@apify/consts';\n\n/**\n * List of forbidden usernames. Note that usernames can be used as apify.com/username,\n * so we need to prohibit any username that might be part of our website or confusing in any way.\n *\n * After extending this list, check whether any existing users already hold one of the\n * newly-forbidden usernames. The thorough way is to mirror `isForbiddenUsername` server-side\n * by rebuilding the same regex inside Robo 3T / mongosh — paste the contents of this array\n * verbatim into `var patterns = [...]` and run something like:\n *\n *     var forbiddenRegex = new RegExp('^(anonymous|' + patterns.join('|') + ')$', 'i');\n *     var apifyIdRegex = /^[a-zA-Z0-9]{17}$/;\n *     db.getCollection('users').find({\n *         $or: [{ username: forbiddenRegex }, { username: apifyIdRegex }],\n *     }, { username: 1, 'profile.isPublic': 1, createdAt: 1, lastActivityAt: 1 })\n *     .sort({ username: 1 })\n *     .forEach(function (u) { print(u.username + '\\t' + !!(u.profile && u.profile.isPublic)); });\n *\n * For a quick sanity check (literals only, fast) use `$in` with an exact-string array\n * of the new additions instead.\n */\nconst FORBIDDEN_USERNAMES_REGEXPS = [\n    // App routes\n    'page-not-found',\n    'docs',\n    'terms-of-use',\n    'about',\n    'pricing',\n    'privacy-policy',\n    'customers',\n    'request-form',\n    'request-solution',\n    'release-notes',\n    'jobs',\n    'api-reference',\n    'video-tutorials',\n    'acts',\n    'key-value-stores',\n    'schedules',\n    'account',\n    'sign-up',\n    'sign-in-discourse',\n    'admin',\n    'documentation',\n    'change-password',\n    'enroll-account',\n    'forgot-password',\n    'reset-password',\n    'sign-in',\n    'verify-email',\n    'live-status',\n    'browser-info',\n    'webhooks',\n    'health-check',\n    'api',\n    'change-log',\n    'dashboard',\n    'community',\n    'crawlers',\n    'ext',\n    'schemas',\n\n    // Various strings\n    'admin',\n    'administration',\n    'crawler',\n    'act',\n    'library',\n    'lib',\n    'apifier',\n    'team',\n    'contact',\n    'doc',\n    'documentation',\n    'for-business',\n    'for-developers',\n    'developers',\n    'business',\n    'integrations',\n    'job',\n    'setting',\n    'settings',\n    'privacy',\n    'policy',\n    'assets',\n    'help',\n    'config',\n    'configuration',\n    'terms',\n    'hiring',\n    'hire',\n    'status',\n    'status-page',\n    'solutions',\n    'support',\n    'market',\n    'marketplace',\n    'download',\n    'downloads',\n    'username',\n    'users',\n    'user',\n    'login',\n    'logout',\n    'signin',\n    'sign',\n    'signup',\n    'sign-out',\n    'signout',\n    'plugins',\n    'plug-ins',\n    'reset',\n    'password',\n    'passwords',\n    'square',\n    'profile-photos',\n    'profiles',\n    'true',\n    'false',\n    'js',\n    'css',\n    'img',\n    'images',\n    'image',\n    'partials',\n    'fonts',\n    'font',\n    'dynamic_templates',\n    'app',\n    'schedules',\n    'community',\n    'storage',\n    'storages',\n    'account',\n    'node_modules',\n    'bower_components',\n    'video',\n    'knowledgebase',\n    'forum',\n    'customers',\n    'blog',\n    'health-check',\n    'health',\n    'anim',\n    'forum_topics.json',\n    'forum_categories.json',\n    'me',\n    'you',\n    'him',\n    'she',\n    'it',\n    'external',\n    'actor',\n    'crawler',\n    'scheduler',\n    'api',\n    'sdk',\n    'puppeteer',\n    'webdriver',\n    'selenium',\n    '(selenium.*webdriver)',\n    'undefined',\n    'page-analyzer',\n    'wp-login.php',\n    'welcome.action',\n    'echo',\n    'proxy',\n    'super-proxy',\n    'gdpr',\n    'case-studies',\n    'use-cases',\n    'how-to',\n    'kb',\n    'cookies',\n    'cookie-policy',\n    'cookies-policy',\n    'powered-by',\n    'run',\n    'runs',\n    'actor',\n    'actors',\n    'act',\n    'acts',\n    'success-stories',\n    'roadmap',\n    'join-marketplace',\n    'presskit',\n    'press-kit',\n    'covid-19',\n    'covid',\n    'covid19',\n    'matfyz',\n    'ideas',\n    'public-actors',\n    'resources',\n    'partners',\n    'affiliate',\n    'industries',\n    'web-scraping',\n    'custom-solutions',\n    'solution-provider',\n    'alternatives',\n    'platform',\n    'freelancers',\n    'freelancer',\n    'partner',\n    'preview',\n    'templates',\n    'data-for-generative-ai',\n    'discord',\n    'praguecrawl',\n    'prague-crawl',\n    'bob',\n    'ai-agents',\n    'reel',\n    'video-reel',\n    'mcp',\n    'mcpc',\n    'model-context-protocol',\n    'modelcontextprotocol',\n    // 'apify.com' intentionally unescaped so \".\" matches any character, also blocking variants like \"apify_com\" or \"apifyxcom\"\n    'apify.com',\n    'design-kit',\n    'press-kit',\n    'scrapers',\n    'professional-services',\n    'challenge',\n    'challange',\n    '1m-challenge',\n    '1m-usd-challenge',\n    'contact-sales',\n    'creator',\n    'creators',\n    'creator-plan',\n    'request-an-integration',\n    'whitepaper',\n    'adviser',\n    'crawlee',\n    'ultimate-scraper',\n    'agent-skills',\n\n    // Apify platform resources\n    'key-value-store',\n    'request-queue',\n    'request-queues',\n    'build',\n    'builds',\n    'dataset',\n    'datasets',\n    'schedule',\n    'standby',\n    'pay-per-event',\n    'pay-per-result',\n    'pay-per-usage',\n    'ppe',\n    'ppr',\n    'compute-unit',\n    'compute-units',\n\n    // AI / LLM related\n    'agent',\n    'agents',\n    'agentic',\n    'llms',\n    'llm',\n    'openai',\n    'anthropic',\n    'claude',\n    'copilot',\n    'mistral',\n    'gemini',\n    'llama',\n    'chatbot',\n    'chatgpt',\n    'prompt',\n    'prompts',\n    'embeddings',\n    'vectors',\n    'rag',\n\n    // Agentic protocols / agentic payments / agent identity\n    'agentic-commerce',\n    'agentic-economy',\n    'agentic-payments',\n    'a2a',\n    'a2b',\n    'a2p',\n    'ap2',\n    'b2a',\n    'acp',\n    'ucp',\n    'mpp',\n    'x402',\n    'l402',\n    'anp',\n    'agp',\n    'erc-8004',\n    'kya',\n    'kyapay',\n\n    // Trust / verification / anti-impersonation handles\n    // (entries containing 'apify' are already blocked by USERNAME.RESTRICTED_REGEX)\n    'official',\n    'verified',\n    'certified',\n    'authorized',\n    'partner-official',\n    'gold-partner',\n    'premium-partner',\n    'staff',\n    'moderator',\n    'apify-admin',\n\n    // Apify subdomain / service names (current and future)\n    'console',\n    'cli',\n    'studio',\n    'gateway',\n    'workbench',\n    'agents-marketplace',\n    'agents-store',\n    'mcp-server',\n    'mcp-servers',\n    'mcp-gateway',\n\n    // Region / locale codes (3+ chars only; 1-2 char codes are blocked by USERNAME.MIN_LENGTH)\n    'asia',\n    'latam',\n    'emea',\n    'apac',\n    'i18n',\n    'l10n',\n    'localization',\n    'localisation',\n\n    // Currency / payment generics (open standards, not company brands)\n    'usd',\n    'eur',\n    'gbp',\n    'jpy',\n    'cny',\n    'usdc',\n    'usdt',\n    'btc',\n    'eth',\n    'sol',\n    'crypto',\n    'fiat',\n    'stablecoin',\n    'stablecoins',\n    'payment',\n    'payments',\n    'payout',\n    'payouts',\n    'invoice',\n    'invoices',\n    'wallet',\n\n    // Compliance / certifications\n    'soc',\n    'soc2',\n    'iso',\n    'iso-27001',\n    'hipaa',\n    'ccpa',\n    'pci',\n    'pci-dss',\n    'dpa',\n    'dpia',\n    'dmca',\n    'sla',\n    'eula',\n    'aml',\n    'kyc',\n\n    // Open-source / community roles\n    'contributor',\n    'contributors',\n    'maintainer',\n    'maintainers',\n    'core-team',\n    'oss',\n    'open-source',\n    'opensource',\n    'open-source-software',\n\n    // Anti-abuse / scam-bait names (frequently used in account fraud)\n    'spam',\n    'scam',\n    'phishing',\n    'malware',\n    'hack',\n    'hacked',\n    'giveaway',\n    'airdrop',\n    'bitcoin-giveaway',\n    'free-credits',\n    'free-money',\n\n    // Apify marketing / campaign slugs\n    'launch',\n    'launches',\n    'webinar',\n    'webinars',\n    'meetup',\n    'meetups',\n    'summit',\n    'conference',\n    'conferences',\n\n    // Organizations / workspaces / permissions\n    'org',\n    'orgs',\n    'organisation',\n    'workspace',\n    'workspaces',\n    'tenant',\n    'tenants',\n    'role',\n    'roles',\n    'permission',\n    'permissions',\n\n    // Auth / security\n    'saml',\n    'scim',\n    'token',\n    'tokens',\n    'apikey',\n    'api-key',\n    'api-keys',\n    'keys',\n    'secret',\n    'secrets',\n\n    // Billing / commerce\n    'coupon',\n    'coupons',\n    'discount',\n    'discounts',\n    'promos',\n    'refund',\n    'refunds',\n    'credit',\n    'credits',\n    'billing-portal',\n\n    // Infrastructure / environments\n    'production',\n    'prod',\n    'canary',\n    'internal',\n    'restricted',\n\n    // Communication\n    'conversations',\n    'reactions',\n    'mentions',\n    'channel',\n    'channels',\n    'inbox',\n    'no-reply',\n    'noreply',\n\n    // Legal / trust / web standards\n    'accessibility',\n    'imprint',\n    'impressum',\n    'trust',\n    'trust-center',\n    'security-center',\n\n    // Brand protection / impersonation prevention\n    'brand',\n    'branding',\n    'support-team',\n    'abuse',\n\n    // Incidents / updates\n    'outage',\n    'incident',\n    'incidents',\n    'what-is-new',\n    'whatsnew',\n\n    // Special files\n    'index',\n    'index\\\\.html',\n    '(favicon\\\\.[a-z]+)',\n    'BingSiteAuth.xml',\n    '(google.+\\\\.html)',\n    'robots\\\\.txt',\n    '(sitemap\\\\.[a-z]+)',\n    '(apple-touch-icon.*)',\n    'security-whitepaper\\\\.pdf',\n    'security\\\\.txt',\n    'llms\\\\.txt',\n    'llms-full\\\\.txt',\n    'AGENTS\\\\.md',\n    'CLAUDE\\\\.md',\n    'auth\\\\.md',\n\n    // All hidden files\n    '(\\\\..*)',\n\n    // Username starting with xxx-\n    '(xxx-.*)',\n\n    // Usernames containing inappropriate/adult content keywords.\n    // Each entry requires non-letter boundaries on both sides so the keyword only\n    // matches as a whole word — this avoids false positives like Akshit (shit),\n    // Hancock (cock), Nudelman (nude), Uranus (anus), pussycat (pussy),\n    // snaked (naked), scunthorpe (cunt), christoph-dick-media (dick — legitimate\n    // German surname, not blocked), etc.\n    '((.+[^a-z]|)porn([^a-z].+|))',\n    '((.+[^a-z]|)vagina([^a-z].+|))',\n    '((.+[^a-z]|)dildo([^a-z].+|))',\n    '((.+[^a-z]|)nsfw([^a-z].+|))',\n    '((.+[^a-z]|)hentai([^a-z].+|))',\n    '((.+[^a-z]|)cunt([^a-z].+|))',\n    '((.+[^a-z]|)fuck([^a-z].+|))',\n    '((.+[^a-z]|)shit([^a-z].+|))',\n    '((.+[^a-z]|)bitch([^a-z].+|))',\n    '((.+[^a-z]|)slut([^a-z].+|))',\n    '((.+[^a-z]|)whore([^a-z].+|))',\n    '((.+[^a-z]|)boob([^a-z].+|))',\n    '((.+[^a-z]|)tits([^a-z].+|))',\n    '((.+[^a-z]|)cock([^a-z].+|))',\n    '((.+[^a-z]|)anus([^a-z].+|))',\n    '((.+[^a-z]|)pussy([^a-z].+|))',\n    '((.+[^a-z]|)nude([^a-z].+|))',\n    '((.+[^a-z]|)penis([^a-z].+|))',\n    '((.+[^a-z]|)naked([^a-z].+|))',\n\n    // Username starting with install-cli. (see https://docs.apify.com/cli/docs/installation)\n    '(install-cli\\\\..*)',\n\n    // Strings not starting with letter or number\n    '([^0-9a-z].*)',\n\n    // Strings not ending with letter or number\n    '(.*[^0-9a-z])',\n\n    // Strings where there's more than one underscore, comma or dash in row\n    '(.*[_.\\\\-]{2}.*)',\n\n    // Reserved usernames from https://github.com/shouldbee/reserved-usernames/blob/master/reserved-usernames.json\n    '0',\n    'about',\n    'access',\n    'account',\n    'accounts',\n    'activate',\n    'activities',\n    'activity',\n    'ad',\n    'add',\n    'address',\n    'adm',\n    'admin',\n    'administration',\n    'administrator',\n    'ads',\n    'adult',\n    'advertising',\n    'affiliate',\n    'affiliates',\n    'ajax',\n    'all',\n    'alpha',\n    'analysis',\n    'analytics',\n    'android',\n    'anon',\n    'anonymous',\n    'api',\n    'app',\n    'apps',\n    'archive',\n    'archives',\n    'article',\n    'asct',\n    'asset',\n    'atom',\n    'auth',\n    'authentication',\n    'avatar',\n    'backup',\n    'balancer-manager',\n    'banner',\n    'banners',\n    'beta',\n    'billing',\n    'bin',\n    'blog',\n    'blogs',\n    'board',\n    'book',\n    'bookmark',\n    'bot',\n    'bots',\n    'bug',\n    'business',\n    'cache',\n    'cadastro',\n    'calendar',\n    'call',\n    'campaign',\n    'cancel',\n    'captcha',\n    'career',\n    'careers',\n    'cart',\n    'categories',\n    'category',\n    'cgi',\n    'cgi-bin',\n    'changelog',\n    'chat',\n    'check',\n    'checking',\n    'checkout',\n    'client',\n    'cliente',\n    'clients',\n    'code',\n    'codereview',\n    'comercial',\n    'comment',\n    'comments',\n    'communities',\n    'community',\n    'company',\n    'compare',\n    'compras',\n    'config',\n    'configuration',\n    'connect',\n    'contact',\n    'contact-us',\n    'contact_us',\n    'contactus',\n    'contest',\n    'contribute',\n    'corp',\n    'create',\n    'css',\n    'dashboard',\n    'data',\n    'db',\n    'default',\n    'delete',\n    'demo',\n    'design',\n    'designer',\n    'destroy',\n    'dev',\n    'devel',\n    'developer',\n    'developers',\n    'diagram',\n    'diary',\n    'dict',\n    'dictionary',\n    'die',\n    'dir',\n    'direct_messages',\n    'directory',\n    'dist',\n    'doc',\n    'docs',\n    'documentation',\n    'domain',\n    'download',\n    'downloads',\n    'ecommerce',\n    'edit',\n    'editor',\n    'edu',\n    'education',\n    'email',\n    'employment',\n    'empty',\n    'end',\n    'enterprise',\n    'entries',\n    'entry',\n    'error',\n    'errors',\n    'eval',\n    'event',\n    'events',\n    'exit',\n    'explore',\n    'facebook',\n    'faq',\n    'favorite',\n    'favorites',\n    'feature',\n    'features',\n    'feed',\n    'feedback',\n    'feeds',\n    'file',\n    'files',\n    'first',\n    'flash',\n    'fleet',\n    'fleets',\n    'flog',\n    'follow',\n    'followers',\n    'following',\n    'forgot',\n    'form',\n    'forum',\n    'forums',\n    'founder',\n    'free',\n    'friend',\n    'friends',\n    'ftp',\n    'gadget',\n    'gadgets',\n    'game',\n    'games',\n    'get',\n    'gift',\n    'gifts',\n    'gist',\n    'github',\n    'graph',\n    'group',\n    'groups',\n    'guest',\n    'guests',\n    'help',\n    'home',\n    'homepage',\n    'host',\n    'hosting',\n    'hostmaster',\n    'hostname',\n    'howto',\n    'hpg',\n    'html',\n    'http',\n    'httpd',\n    'https',\n    'i',\n    'iamges',\n    'icon',\n    'icons',\n    'id',\n    'idea',\n    'ideas',\n    'image',\n    'images',\n    'imap',\n    'img',\n    'index',\n    'indice',\n    'info',\n    'information',\n    'inquiry',\n    'instagram',\n    'intranet',\n    'invitations',\n    'invite',\n    'ipad',\n    'iphone',\n    'irc',\n    'is',\n    'issue',\n    'issues',\n    'it',\n    'item',\n    'items',\n    'java',\n    'javascript',\n    'job',\n    'jobs',\n    'join',\n    'js',\n    'json',\n    'jump',\n    'knowledgebase',\n    'language',\n    'languages',\n    'last',\n    'ldap-status',\n    'legal',\n    'license',\n    'link',\n    'links',\n    'linux',\n    'list',\n    'lists',\n    'log',\n    'log-in',\n    'log-out',\n    'log_in',\n    'log_out',\n    'login',\n    'logout',\n    'logs',\n    'm',\n    'mac',\n    'mail',\n    'mail1',\n    'mail2',\n    'mail3',\n    'mail4',\n    'mail5',\n    'mailer',\n    'mailing',\n    'maintenance',\n    'manager',\n    'manual',\n    'map',\n    'maps',\n    'marketing',\n    'master',\n    'me',\n    'media',\n    'member',\n    'members',\n    'message',\n    'messages',\n    'messenger',\n    'microblog',\n    'microblogs',\n    'mine',\n    'mis',\n    'mob',\n    'mobile',\n    'movie',\n    'movies',\n    'mp3',\n    'msg',\n    'msn',\n    'music',\n    'musicas',\n    'mx',\n    'my',\n    'mysql',\n    'name',\n    'named',\n    'nan',\n    'navi',\n    'navigation',\n    'net',\n    'network',\n    'new',\n    'news',\n    'newsletter',\n    'nick',\n    'nickname',\n    'notes',\n    'noticias',\n    'notification',\n    'notifications',\n    'notify',\n    'ns',\n    'ns1',\n    'ns10',\n    'ns2',\n    'ns3',\n    'ns4',\n    'ns5',\n    'ns6',\n    'ns7',\n    'ns8',\n    'ns9',\n    'null',\n    'oauth',\n    'oauth_clients',\n    'offer',\n    'offers',\n    'official',\n    'old',\n    'online',\n    'openid',\n    'operator',\n    'order',\n    'orders',\n    'organization',\n    'organizations',\n    'overview',\n    'owner',\n    'owners',\n    'page',\n    'pager',\n    'pages',\n    'panel',\n    'password',\n    'payment',\n    'perl',\n    'phone',\n    'photo',\n    'photoalbum',\n    'photos',\n    'php',\n    'phpmyadmin',\n    'phppgadmin',\n    'phpredisadmin',\n    'pic',\n    'pics',\n    'ping',\n    'plan',\n    'plans',\n    'plugin',\n    'plugins',\n    'policy',\n    'pop',\n    'pop3',\n    'popular',\n    'portal',\n    'post',\n    'postfix',\n    'postmaster',\n    'posts',\n    'pr',\n    'premium',\n    'press',\n    'price',\n    'pricing',\n    'privacy',\n    'privacy-policy',\n    'privacy_policy',\n    'privacypolicy',\n    'private',\n    'product',\n    'products',\n    'profile',\n    'project',\n    'projects',\n    'promo',\n    'pub',\n    'public',\n    'purpose',\n    'put',\n    'python',\n    'query',\n    'random',\n    'ranking',\n    'read',\n    'readme',\n    'recent',\n    'recruit',\n    'recruitment',\n    'register',\n    'registration',\n    'release',\n    'remove',\n    'replies',\n    'report',\n    'reports',\n    'repositories',\n    'repository',\n    'req',\n    'request',\n    'requests',\n    'reset',\n    'roc',\n    'root',\n    'rss',\n    'ruby',\n    'rule',\n    'sag',\n    'sale',\n    'sales',\n    'sample',\n    'samples',\n    'save',\n    'school',\n    'script',\n    'scripts',\n    'search',\n    'secure',\n    'security',\n    'self',\n    'send',\n    'server',\n    'server-info',\n    'server-status',\n    'service',\n    'services',\n    'session',\n    'sessions',\n    'setting',\n    'settings',\n    'setup',\n    'share',\n    'shop',\n    'show',\n    'sign-in',\n    'sign-up',\n    'sign_in',\n    'sign_up',\n    'signin',\n    'signout',\n    'signup',\n    'site',\n    'sitemap',\n    'sites',\n    'smartphone',\n    'smtp',\n    'soporte',\n    'source',\n    'spec',\n    'special',\n    'sql',\n    'src',\n    'ssh',\n    'ssl',\n    'ssladmin',\n    'ssladministrator',\n    'sslwebmaster',\n    'staff',\n    'stage',\n    'staging',\n    'start',\n    'stat',\n    'state',\n    'static',\n    'stats',\n    'status',\n    'store',\n    'stores',\n    'stories',\n    'style',\n    'styleguide',\n    'stylesheet',\n    'stylesheets',\n    'subdomain',\n    'subscribe',\n    'subscription',\n    'subscriptions',\n    'suporte',\n    'support',\n    'svn',\n    'swf',\n    'sys',\n    'sysadmin',\n    'sysadministrator',\n    'system',\n    'tablet',\n    'tablets',\n    'tag',\n    'talk',\n    'task',\n    'tasks',\n    'team',\n    'teams',\n    'tech',\n    'telnet',\n    'term',\n    'terms',\n    'terms-of-service',\n    'terms_of_service',\n    'termsofservice',\n    'test',\n    'test1',\n    'test2',\n    'test3',\n    'teste',\n    'testing',\n    'tests',\n    'theme',\n    'themes',\n    'thread',\n    'threads',\n    'tmp',\n    'todo',\n    'tool',\n    'tools',\n    'top',\n    'topic',\n    'topics',\n    'tos',\n    'tour',\n    'translations',\n    'trends',\n    'tutorial',\n    'tux',\n    'tv',\n    'twitter',\n    'undef',\n    'unfollow',\n    'unsubscribe',\n    'update',\n    'upload',\n    'uploads',\n    'url',\n    'usage',\n    'user',\n    'username',\n    'users',\n    'usuario',\n    'vendas',\n    'ver',\n    'version',\n    'video',\n    'videos',\n    'visitor',\n    'watch',\n    'weather',\n    'web',\n    'webhook',\n    'webhooks',\n    'webmail',\n    'webmaster',\n    'website',\n    'websites',\n    'welcome',\n    'widget',\n    'widgets',\n    'wiki',\n    'win',\n    'windows',\n    'word',\n    'work',\n    'works',\n    'workshop',\n    'ww',\n    'wws',\n    'www',\n    'www1',\n    'www2',\n    'www3',\n    'www4',\n    'www5',\n    'www6',\n    'www7',\n    'wwws',\n    'wwww',\n    'xfn',\n    'xml',\n    'xmpp',\n    'xpg',\n    'xxx',\n    'yaml',\n    'year',\n    'yml',\n    'you',\n    'yourdomain',\n    'yourname',\n    'yoursite',\n    'yourusername',\n];\n\n// Regex matching forbidden usernames.\nconst FORBIDDEN_REGEXP = new RegExp(`^(${ANONYMOUS_USERNAME}|${FORBIDDEN_USERNAMES_REGEXPS.join('|')})$`, 'i');\n\n/**\n * Checks whether username is listed in the forbidden username list\n * or looks like an Apify ID.\n *\n * NOTE: The forbidden list may expand over time, so a username that was\n * previously permitted may later become forbidden. Use this function only\n * when validating a username change, not as part of normal authentication\n * or authorization flow.\n */\nexport function isForbiddenUsername(username: string): boolean {\n    return !!username.match(APIFY_ID_REGEX) || !!username.match(FORBIDDEN_REGEXP);\n}\n","import log from '@apify/log';\n\nimport { delayPromise } from './utilities';\n\nexport class RetryableError extends Error {\n    readonly error: Error;\n\n    constructor(error: Error, ...args: unknown[]) {\n        super(...(args as [string]));\n        this.error = error;\n    }\n}\n\nexport async function retryWithExpBackoff<T>(params: {\n    func: (...args: unknown[]) => T | Promise<T>;\n    expBackoffMillis: number;\n    expBackoffMaxRepeats: number;\n}): Promise<T> {\n    const { func, expBackoffMillis, expBackoffMaxRepeats } = params;\n\n    if (typeof func !== 'function') {\n        throw new Error('Parameter \"func\" should be a function.');\n    }\n\n    if (typeof expBackoffMillis !== 'number') {\n        throw new Error('Parameter \"expBackoffMillis\" should be a number.');\n    }\n\n    if (typeof expBackoffMaxRepeats !== 'number') {\n        throw new Error('Parameter \"expBackoffMaxRepeats\" should be a number.');\n    }\n\n    for (let i = 0; ; i++) {\n        let error;\n\n        try {\n            return await func();\n        } catch (e) {\n            error = e;\n        }\n\n        if (!(error instanceof RetryableError)) {\n            throw error;\n        }\n\n        if (i >= expBackoffMaxRepeats - 1) {\n            throw error.error;\n        }\n\n        const waitMillis = expBackoffMillis * 2 ** i;\n        const rand = (from: number, to: number) => from + Math.floor(Math.random() * (to - from + 1));\n        const randomizedWaitMillis = rand(waitMillis, waitMillis * 2);\n\n        if (i === Math.round(expBackoffMaxRepeats / 2)) {\n            log.warning(`Retry failed ${i} times and will be repeated in ${randomizedWaitMillis}ms`, {\n                originalError: error.error.message,\n                errorDetails: Reflect.get(error.error, 'details'),\n            });\n        }\n\n        await delayPromise(randomizedWaitMillis);\n    }\n}\n","import { cryptoRandomObjectId, timeoutPromise } from './utilities';\n\nexport enum CHECK_TYPES {\n    MONGODB_PING = 'MONGODB_PING',\n    MONGODB_READ = 'MONGODB_READ',\n    MONGODB_WRITE = 'MONGODB_WRITE',\n    REDIS = 'REDIS', // Old alias for 'REDIS_WRITE', deprecated\n    REDIS_PING = 'REDIS_PING',\n    REDIS_WRITE = 'REDIS_WRITE',\n}\n\ntype CheckType<T extends Record<string, any> = Record<string, any>> = { client: T; type: CHECK_TYPES };\n\ninterface HealthCheckerOptions {\n    checks: CheckType[];\n    redisPrefix?: string;\n    redisTtlSecs?: number;\n    checkTimeoutMillis?: number;\n    mongoDbWriteTestCollection?: string;\n    mongoDbWriteTestRemoveOlderThanSecs?: number;\n}\n\n/**\n * Provides health-checking functionality to ensure that connection to Redis and MongoDB is working.\n *\n * Example use:\n *\n * ```javascript\n * const redis = new Redis();\n * const mongo = await MongoClient.connect('mongodb://127.0.0.1:3001/my-db');\n *\n * const checks = [{\n *     client: redis,\n *     type: HealthChecker.CHECK_TYPES.REDIS,\n * }, {\n *     client: mongo.db('my-db'),\n *     type: HealthChecker.CHECK_TYPES.MONGODB_READ,\n * }];\n *\n * const checker = new HealthChecker({ checks });\n * setInterval(() => checker.ensureIsHealthy().then(() => console.log('ok'), err => console.log(err)), 5000);\n * ```\n */\nexport class HealthChecker {\n    static readonly CHECK_TYPES = CHECK_TYPES;\n\n    checks: CheckType[];\n\n    redisPrefix: string;\n\n    redisTtlSecs: number;\n\n    checkTimeoutMillis: number;\n\n    mongoDbWriteTestCollection: string;\n\n    mongoDbWriteTestRemoveOlderThanSecs: number;\n\n    constructor(private readonly options: HealthCheckerOptions) {\n        const {\n            checks,\n            redisPrefix = 'health-check',\n            redisTtlSecs = 15,\n            checkTimeoutMillis = 15000,\n            mongoDbWriteTestCollection = 'healthCheckPlayground',\n            mongoDbWriteTestRemoveOlderThanSecs = 15,\n        } = options;\n\n        if (!Array.isArray(checks)) throw new Error('Parameter \"check\" must be an array');\n        checks.map((check) => this._validateCheck(check));\n\n        this.checks = checks;\n        this.redisPrefix = redisPrefix;\n        this.redisTtlSecs = redisTtlSecs;\n        this.checkTimeoutMillis = checkTimeoutMillis;\n        this.mongoDbWriteTestCollection = mongoDbWriteTestCollection;\n        this.mongoDbWriteTestRemoveOlderThanSecs = mongoDbWriteTestRemoveOlderThanSecs;\n    }\n\n    async ensureIsHealthy() {\n        for (const check of this.checks) {\n            try {\n                const checkPromise = this._performCheck(check);\n                await timeoutPromise(checkPromise, this.checkTimeoutMillis, 'Check has timed-out');\n            } catch (_err) {\n                const err = _err as Error;\n                throw new Error(`Health check test \"${check.type}\" failed with an error: ${err.message}\"`);\n            }\n        }\n    }\n\n    _validateCheck(check: CheckType): void {\n        if (!(check.type in CHECK_TYPES)) throw new Error(`Check type \"${check.type}\" is invalid`);\n        if (typeof check.client !== 'object')\n            throw new Error(`Check client must be an object got \"${typeof check.client}\" instead`);\n    }\n\n    async _performCheck(check: CheckType): Promise<void> {\n        switch (check.type) {\n            case CHECK_TYPES.MONGODB_PING:\n                return this._testMongoDbPing(check);\n            case CHECK_TYPES.MONGODB_READ:\n                return this._testMongoDbRead(check);\n            case CHECK_TYPES.MONGODB_WRITE:\n                return this._testMongoDbWrite(check);\n            case CHECK_TYPES.REDIS_PING:\n                return this._testRedisPing(check);\n            case CHECK_TYPES.REDIS:\n            case CHECK_TYPES.REDIS_WRITE:\n                return this._testRedisWrite(check);\n            default:\n                throw new Error('Unknown check type');\n        }\n    }\n\n    async _testMongoDbPing({ client }: CheckType) {\n        const response = await client.command({ ping: 1 });\n        if (response.ok !== 1) throw new Error(`Got ${response.ok} instead of 1!`);\n    }\n\n    async _testMongoDbRead({ client }: CheckType) {\n        const response = await client.listCollections().toArray();\n        if (!Array.isArray(response)) throw new Error(`Got ${typeof response} instead of an array!`);\n    }\n\n    async _testMongoDbWrite({ client }: CheckType) {\n        const id = cryptoRandomObjectId();\n        const collection = client.collection(this.mongoDbWriteTestCollection);\n\n        // Remove old test items.\n        await collection.deleteMany({\n            createdAt: {\n                $lt: new Date(Date.now() - this.mongoDbWriteTestRemoveOlderThanSecs * 1000),\n            },\n        });\n\n        // Insert and read some item.\n        await collection.insertOne({\n            _id: id,\n            createdAt: new Date(),\n        });\n        const retrieved = await collection.findOne({ _id: id });\n        if (!retrieved) throw new Error(`Item with ID \"${id}\" not found!`);\n    }\n\n    async _testRedisPing({ client }: CheckType) {\n        const response = await client.ping();\n        if (response !== 'PONG') throw new Error(`Got \"${response}\" instead of \"PONG\"!`);\n    }\n\n    async _testRedisWrite({ client }: CheckType) {\n        const key = `${this.redisPrefix}:${cryptoRandomObjectId()}`;\n        const expected = 'OK';\n\n        // Set some value in Redis and try to read it.\n        await client.set(key, expected, 'EX', this.redisTtlSecs);\n        const given = await client.get(key);\n        if (given !== expected) throw new Error(`Returned value \"${given}\" is not equal to \"${expected}\"!`);\n    }\n}\n","import type { TransformCallback } from 'node:stream';\nimport { Transform } from 'node:stream';\n\n// TODO: Fix the issue with the separate 'data' and 'object' event - see below.\n// For example, we could just have 'data' and it would just pass the object.\n// For that, you can use the 'objectMode' param\n\n/**\n * A transforming stream which accepts string/Buffer data with JSON Lines objects on input\n * and emits 'object' event for every parsed JavaScript objects.\n * The stream passes through the original data.\n * Each JSON object is expected to be on a separate line, some lines might be empty or contain whitespace.\n * After each JSON object there needs to be '\\n' or end of stream.\n * This stream is especially useful for processing stream from Docker engine, such as:\n *\n * <pre>\n *  {\"status\":\"Preparing\",\"progressDetail\":{},\"id\":\"e0380bb6c0bb\"}\n *  {\"status\":\"Preparing\",\"progressDetail\":{},\"id\":\"9f8566ee5135\"}\n *  {\"errorDetail\":{\"message\":\"no basic auth credentials\"},\"error\":\"no basic auth credentials\"}\n * </pre>\n *\n * **WARNING**: You still need to consume the `data` event from the transformed stream,\n * otherwise the internal buffers will get full and the stream might be corked.\n */\nexport class ParseJsonlStream extends Transform {\n    private pendingChunk: string | null = null;\n\n    parseLineAndEmitObject(line: string): void {\n        line = line.trim();\n\n        if (!line) {\n            return;\n        }\n\n        try {\n            const obj = JSON.parse(line);\n            this.emit('object', obj);\n        } catch (e) {\n            throw new Error(`Cannot parse JSON stream data ('${String(line)}'): ${String(e)}`);\n        }\n    }\n\n    _transform(chunk: any, encoding: BufferEncoding, callback: TransformCallback): void {\n        let allData;\n        if (this.pendingChunk) {\n            allData = this.pendingChunk + chunk;\n            this.pendingChunk = null;\n        } else {\n            allData = chunk;\n        }\n\n        const lines = allData.toString().split('\\n');\n\n        // One line can span multiple chunks, so if the new chunk doesn't end with '\\n',\n        // store the last part and later concat it with the new chunk\n        if (lines[lines.length - 1] !== '') {\n            this.pendingChunk = lines.pop();\n        }\n\n        try {\n            for (let i = 0; i < lines.length; i++) {\n                this.parseLineAndEmitObject(lines[i]);\n            }\n        } catch (err) {\n            callback(err as Error, null);\n            return;\n        }\n\n        callback(null, chunk);\n    }\n\n    // This function is called right after stream.end() is called by the writer.\n    // It just tries to process the pending chunk and returns an error if that fails.\n    _flush(callback: TransformCallback): void {\n        if (this.pendingChunk) {\n            try {\n                this.parseLineAndEmitObject(this.pendingChunk);\n                this.pendingChunk = null;\n            } catch (err) {\n                callback(err as Error, null);\n                return;\n            }\n        }\n        callback();\n    }\n}\n","import type { PassThrough, Readable } from 'node:stream';\n\n/**\n * Concat data from stream to Buffer\n */\nexport async function concatStreamToBuffer(stream: Readable | PassThrough): Promise<Buffer> {\n    return new Promise((resolve, reject) => {\n        const chunks: Uint8Array[] = [];\n        stream\n            .on('data', (chunk) => {\n                chunks.push(chunk);\n            })\n            .on('error', (e) => reject(e))\n            .on('end', () => {\n                const buffer = Buffer.concat(chunks);\n                return resolve(buffer);\n            });\n    });\n}\n\n/**\n * Flushes the provided stream into a Buffer and transforms\n * it to a String using the provided encoding or utf-8 as default.\n */\nexport async function readStreamToString(stream: Readable | PassThrough, encoding?: BufferEncoding): Promise<string> {\n    const buffer = await concatStreamToBuffer(stream);\n    return buffer.toString(encoding);\n}\n","import { jsonStringifyExtended, JsonVariable } from './utilities.client';\n\nclass WebhookPayloadTemplateError extends Error {\n    constructor(message?: string) {\n        super(message);\n        this.name = this.constructor.name;\n        if (typeof Error.captureStackTrace === 'function') {\n            Error.captureStackTrace(this, this.constructor);\n        }\n    }\n}\n\nexport class InvalidJsonError extends WebhookPayloadTemplateError {\n    constructor(originalError: Error) {\n        super(originalError.message);\n    }\n}\nexport class InvalidVariableError extends Error {\n    constructor(variable?: string) {\n        super(`Invalid payload template variable: ${variable}`);\n    }\n}\n\ninterface ParsePosition {\n    isInsideString: boolean;\n    openBraceIndex: number;\n    closeBraceIndex: number;\n}\n\n/**\n * WebhookPayloadTemplate enables creation and parsing of webhook payload template strings.\n * Template strings are JSON that may include template variables enclosed in double\n * curly brackets: `{{variable}}`. When the template is parsed, variables are replaced\n * with values from a provided context.\n *\n * This is useful to create dynamic webhook payloads where a template is saved on webhook\n * creation and then variables are dynamically added on webhook dispatch.\n *\n * **Example:**\n * ```js\n * const payloadTemplate = `{\n *    \"id\": \"some-id\",\n *    \"createdAt\": \"2019-05-08T15:22:21.095Z\",\n *    \"dataToSend\": {{data}}\n * }`\n *\n * const data = {\n *     status: 200,\n *     body: 'hello world'\n * }\n *\n * const payloadObject = WebhookPayloadTemplate.parse(payloadTemplate, null, { data })\n * ```\n *\n * **Produces:**\n * ```js\n * {\n *     id: \"some-id\",\n *    createdAt: '2019-05-08T15:22:21.095Z',\n *    dataToSend: {\n *        status: 200,\n *        body: 'hello world'\n *    }\n * }\n * ```\n * @hideconstructor\n */\nexport class WebhookPayloadTemplate {\n    private payload: string;\n\n    readonly replacedVariables: { variableName: string; replacement: string }[] = [];\n\n    constructor(\n        private readonly template: string,\n        private readonly allowedVariables: Set<string> | null = null,\n        private readonly context: Record<string, any> = {},\n    ) {\n        this.payload = template;\n    }\n\n    /**\n     * Parse existing webhook payload template string into an object, replacing\n     * template variables using the provided context.\n     *\n     * Parse also validates the template structure, so it can be used\n     * to check validity of the template JSON and usage of allowedVariables.\n     */\n    static parse(\n        payloadTemplate: string,\n        allowedVariables: Set<string> | null = null,\n        context: Record<string, any> = {},\n        options: { interpolateStrings?: boolean } = {},\n    ): Record<string, any> {\n        const type = typeof payloadTemplate;\n        if (type !== 'string') throw new Error(`Cannot parse a ${type} payload template.`);\n        const template = new WebhookPayloadTemplate(payloadTemplate, allowedVariables, context);\n        const data = template._parse(); // eslint-disable-line no-underscore-dangle\n        if (options.interpolateStrings) {\n            return template._interpolate(data); // eslint-disable-line no-underscore-dangle\n        }\n        return data;\n    }\n\n    /**\n     * Stringify an object into a webhook payload template.\n     * Values created using `getTemplateVariable('foo.bar')`\n     * will be stringified to `{{foo.bar}}` template variable.\n     */\n    static stringify(objectTemplate: Record<string, any>, replacer?: ((_: any) => string) | null, indent = 2): string {\n        const type = typeof objectTemplate;\n        if (!objectTemplate || type !== 'object') throw new Error(`Cannot stringify a ${type} payload template.`);\n        return jsonStringifyExtended(objectTemplate, replacer, indent);\n    }\n\n    /**\n     * Produces an instance of a template variable that can be used\n     * in objects and will be stringified into `{{variableName}}` syntax.\n     *\n     * **Example:**\n     * ```js\n     * const resourceVariable = WebhookPayloadTemplate.getVariable('resource');\n     * const objectTemplate = {\n     *     foo: 'foo',\n     *     bar: ['bar'],\n     *     res: resourceVariable,\n     * }\n     *\n     * const payloadTemplate = WebhookPayloadTemplate.stringify(objectTemplate);\n     * ```\n     *\n     * **Produces:**\n     * ```json\n     * {\n     *     \"foo\": \"foo\",\n     *     \"bar\": [\"bar\"],\n     *     \"res\": {{resource}},\n     * }\n     * ```\n     */\n    static getVariable(variableName: string): JsonVariable {\n        return new JsonVariable(variableName);\n    }\n\n    private _parse() {\n        let currentIndex = 0;\n\n        while (true) {\n            try {\n                return JSON.parse(this.payload);\n            } catch (err) {\n                const position = this._findPositionOfNextVariable(currentIndex);\n                // When we catch an error from JSON.parse, but there's no remaining variable, we must have an invalid JSON.\n                if (!position) {\n                    throw new InvalidJsonError(err as Error);\n                }\n                if (!position.isInsideString) {\n                    this._replaceVariable(position);\n                }\n                currentIndex = position.openBraceIndex + 1;\n            }\n        }\n    }\n\n    private _interpolate(value: any): any {\n        if (typeof value === 'string') {\n            return this._interpolateString(value);\n        }\n        // Array needs to go before object!\n        if (Array.isArray(value)) {\n            return this._interpolateArray(value);\n        }\n        if (typeof value === 'object' && value !== null) {\n            return this._interpolateObject(value);\n        }\n        // We can't interpolate anything else\n        return value;\n    }\n\n    private _interpolateString(value: string): string {\n        // If the string matches exactly, we return the variable value including the type\n        if (value.match(/^\\{\\{([a-zA-Z0-9.]+)\\}\\}$/)) {\n            // This just strips the {{ and }}\n            const variableName = value.substring(2, value.length - 2);\n            this._validateVariableName(variableName);\n            return this._getVariableValue(variableName);\n        }\n        // If it's just a part of substring, we replace the respective variables with their string variants\n        return value.replace(/\\{\\{([a-zA-Z0-9.]+)\\}\\}/g, (match, variableName) => {\n            this._validateVariableName(variableName);\n            const variableValue = this._getVariableValue(variableName);\n            return `${variableValue}`;\n        });\n    }\n\n    private _interpolateObject(value: Record<string, any>): Record<string, any> {\n        const result = {} as Record<string, any>;\n        Object.entries(value).forEach(([key, v]) => {\n            result[key] = this._interpolate(v);\n        });\n        return result;\n    }\n\n    private _interpolateArray(value: any[]): any[] {\n        return value.map(this._interpolate.bind(this));\n    }\n\n    private _findPositionOfNextVariable(startIndex = 0): ParsePosition | null {\n        const openBraceIndex = this.payload.indexOf('{{', startIndex);\n        const closeBraceIndex = this.payload.indexOf('}}', openBraceIndex) + 1;\n        const someVariableMaybeExists = openBraceIndex > -1 && closeBraceIndex > -1;\n        if (!someVariableMaybeExists) return null;\n        const isInsideString = this._isVariableInsideString(openBraceIndex);\n        return { isInsideString, openBraceIndex, closeBraceIndex };\n    }\n\n    private _isVariableInsideString(openBraceIndex: number): boolean {\n        const unescapedQuoteCount = this._countUnescapedDoubleQuotesUpToIndex(openBraceIndex);\n        return unescapedQuoteCount % 2 === 1;\n    }\n\n    private _countUnescapedDoubleQuotesUpToIndex(index: number): number {\n        const payloadSection = this.payload.substring(0, index);\n        let unescapedQuoteCount = 0;\n        for (let i = 0; i < payloadSection.length; i++) {\n            const char = payloadSection[i];\n            const prevChar = payloadSection[i - 1];\n            if (char === '\"' && prevChar !== '\\\\') {\n                unescapedQuoteCount++;\n            }\n        }\n        return unescapedQuoteCount;\n    }\n\n    private _replaceVariable({ openBraceIndex, closeBraceIndex }: ParsePosition): void {\n        const variableName = this.payload.substring(openBraceIndex + 2, closeBraceIndex - 1);\n        this._validateVariableName(variableName);\n        const replacement = this._getVariableReplacement(variableName)!;\n        this.replacedVariables.push({ variableName, replacement });\n        this.payload =\n            this.payload.substring(0, openBraceIndex) + replacement + this.payload.substring(closeBraceIndex + 1);\n    }\n\n    private _validateVariableName(variableName: string): void {\n        if (this.allowedVariables === null) return;\n        const [variable] = variableName.split('.');\n\n        // Properties of the variable are not validated on purpose\n        // as they will later be set to null if not found.\n        // This serves to enable dynamic variable structures.\n        const isVariableValid = this.allowedVariables.has(variable);\n\n        if (!isVariableValid) throw new InvalidVariableError(variableName);\n    }\n\n    private _getVariableValue(variableName: string): any {\n        const [variable, ...properties] = variableName.split('.');\n        const context = this.context[variable];\n        const value = properties.reduce((ctx, prop) => {\n            if (!ctx || typeof ctx !== 'object') return null;\n            return ctx[prop];\n        }, context);\n        return value;\n    }\n\n    private _getVariableReplacement(variableName: string): string | null {\n        const value = this._getVariableValue(variableName);\n        return value ? JSON.stringify(value) : null;\n    }\n}\n","import type { KeyObject } from 'node:crypto';\nimport crypto from 'node:crypto';\n\nimport { cryptoRandomObjectId } from './utilities';\n\nconst ENCRYPTION_ALGORITHM = 'aes-256-gcm';\nconst ENCRYPTION_KEY_LENGTH = 32;\nconst ENCRYPTION_IV_LENGTH = 16;\nconst ENCRYPTION_AUTH_TAG_LENGTH = 16;\n\ntype DecryptOptions = {\n    privateKey: KeyObject;\n    encryptedPassword: string;\n    encryptedValue: string;\n};\n\ntype EncryptOptions = {\n    publicKey: KeyObject;\n    value: string;\n};\n\n/**\n * It encrypts the given value using AES cipher and the password for encryption using the public key.\n * NOTE: The encryption password is a string of encryption key and initial vector used for cipher.\n * It returns the encrypted password and encrypted value in BASE64 format.\n *\n * @param publicKey {KeyObject} Public key used for encryption\n * @param value {string} Value to be encrypted\n * @returns {Object<encryptedPassword, encryptedValue>}\n */\nexport function publicEncrypt({ publicKey, value }: EncryptOptions) {\n    const key = cryptoRandomObjectId(ENCRYPTION_KEY_LENGTH);\n    const initVector = cryptoRandomObjectId(ENCRYPTION_IV_LENGTH);\n    const cipher = crypto.createCipheriv(ENCRYPTION_ALGORITHM, key, initVector);\n\n    const bufferFromValue = Buffer.from(value, 'utf-8');\n    const bufferFromKey = Buffer.from(key, 'utf-8');\n    const bufferFromInitVector = Buffer.from(initVector, 'utf-8');\n    const passwordBuffer = Buffer.concat([bufferFromKey, bufferFromInitVector]);\n\n    // NOTE: Auth Tag is appended to the end of the encrypted data, it has length of 16 bytes and ensures integrity of the data.\n    const encryptedValue = Buffer.concat([cipher.update(bufferFromValue), cipher.final(), cipher.getAuthTag()]);\n    const encryptedPassword = crypto.publicEncrypt(publicKey, passwordBuffer);\n\n    return {\n        encryptedPassword: encryptedPassword.toString('base64'),\n        encryptedValue: encryptedValue.toString('base64'),\n    };\n}\n\n/**\n * It decrypts encrypted password using private key\n * and uses the password(consists of encrypted key and initial vector)\n * to decrypt the encrypted value.\n *\n * @param privateKey {KeyObject} Private key used for decryption\n * @param encryptedPassword {string} Password in Base64 encrypted using private key\n * @param encryptedValue {string} Content in Base64 encrypted using AES cipher\n * @returns {string}\n */\nexport function privateDecrypt({ privateKey, encryptedPassword, encryptedValue }: DecryptOptions): string {\n    const encryptedValueBuffer = Buffer.from(encryptedValue, 'base64');\n    const encryptedPasswordBuffer = Buffer.from(encryptedPassword, 'base64');\n\n    const passwordBuffer = crypto.privateDecrypt(privateKey, encryptedPasswordBuffer);\n    if (passwordBuffer.length !== ENCRYPTION_KEY_LENGTH + ENCRYPTION_IV_LENGTH) {\n        throw new Error('privateDecrypt: Decryption failed, invalid password length!');\n    }\n\n    // Slice Auth tag from the final value cipher\n    const authTagBuffer = encryptedValueBuffer.slice(encryptedValueBuffer.length - ENCRYPTION_AUTH_TAG_LENGTH);\n    const encryptedDataBuffer = encryptedValueBuffer.slice(0, encryptedValueBuffer.length - ENCRYPTION_AUTH_TAG_LENGTH);\n\n    const encryptionKeyBuffer = passwordBuffer.slice(0, ENCRYPTION_KEY_LENGTH);\n    const initVectorBuffer = passwordBuffer.slice(ENCRYPTION_KEY_LENGTH);\n    const decipher = crypto.createDecipheriv(ENCRYPTION_ALGORITHM, encryptionKeyBuffer, initVectorBuffer);\n    decipher.setAuthTag(authTagBuffer);\n\n    return Buffer.concat([decipher.update(encryptedDataBuffer), decipher.final()]).toString('utf-8');\n}\n","/**\n * Extract import statements from the code.\n */\nexport function separateImports(code: string): { code: string; imports: string } {\n    const lines = code.split('\\n');\n    return {\n        code: lines.filter((line) => !line.trim().startsWith('import')).join('\\n'),\n        imports: lines.filter((line) => line.trim().startsWith('import')).join('\\n'),\n    };\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nexport enum CodeHashMetaKey {\n    VERSION = 'v',\n    USER = 'u',\n}\n\n/**\n * Allows hashing of an Actor input together with some metadata into a shareable link for the \"Run on Apify\" button.\n * Uses a common secret for checking the signatures.\n *\n * The hash consists of 3 parts separated by a dot, as in `ABC.DEF.GHI`, each being a base64url encoded string:\n *  - `meta` object with the `version` and `user` properties.\n *  - `data` data object (the one that gets encoded)\n *  - `signature` used for verification of the URL hash, computed from the `meta` and `data` objects\n */\nexport class CodeHashManager {\n    static readonly SECTION_SEPARATOR = '.';\n    static readonly VERSION = 1;\n\n    constructor(private readonly secret: string) {}\n\n    /**\n     * Encodes object (e.g. input for actor) to a string hash and uses the `secret` to sign the hash.\n     */\n    encode<T extends object>(data: T, userId: string) {\n        const meta = {\n            [CodeHashMetaKey.USER]: userId,\n            [CodeHashMetaKey.VERSION]: CodeHashManager.VERSION,\n        };\n        const metaBase64 = this.toBase64(JSON.stringify(meta));\n        const inputBase64 = this.toBase64(JSON.stringify(data));\n        const dataToSign = [metaBase64, inputBase64].join(CodeHashManager.SECTION_SEPARATOR);\n        const signature = this.generateSignature(dataToSign);\n        const signatureBase64 = this.toBase64(signature);\n        const parts = [metaBase64, inputBase64, signatureBase64];\n\n        return parts.join(CodeHashManager.SECTION_SEPARATOR);\n    }\n\n    decode(urlHash: string) {\n        const parts = urlHash.split(CodeHashManager.SECTION_SEPARATOR);\n        const dataToSign = parts.slice(0, 2).join(CodeHashManager.SECTION_SEPARATOR);\n        const meta = JSON.parse(this.fromBase64(parts[0]).toString());\n        const data = JSON.parse(this.fromBase64(parts[1]).toString());\n        const signature = this.fromBase64(parts[2]);\n        const expectedSignature = this.generateSignature(dataToSign);\n        const isSignatureValid = timingSafeEqual(signature, expectedSignature);\n\n        return {\n            data,\n            meta: {\n                userId: meta[CodeHashMetaKey.USER],\n                version: meta[CodeHashMetaKey.VERSION],\n                isSignatureValid,\n            },\n        };\n    }\n\n    private toBase64(data: string | Buffer) {\n        return Buffer.from(data as Buffer).toString('base64url');\n    }\n\n    private fromBase64(encoded: string) {\n        return Buffer.from(encoded, 'base64url');\n    }\n\n    private generateSignature(data: string) {\n        return createHmac('sha256', this.secret).update(data).digest();\n    }\n}\n","import crypto from 'node:crypto';\n\nconst CHARSET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\n\n/**\n * Encodes BigInt to base62.\n */\nfunction encodeBase62(num: bigint) {\n    if (num === 0n) {\n        return CHARSET[0];\n    }\n\n    let res = '';\n    while (num > 0n) {\n        res = CHARSET[Number(num % 62n)] + res;\n        num /= 62n;\n    }\n    return res;\n}\n\n/**\n * Generates an HMAC signature and encodes it using Base62.\n * Base62 encoding reduces the signature length.\n *\n * @param secretKey {string} Secret key used for signing signatures\n * @param message {string} Message to be signed\n * @returns string\n * @deprecated Use {@link createHmacSignatureAsync} instead, which uses Web Crypto API and\n * is available in both Node.js and browsers without the need for polyfills.\n */\nexport function createHmacSignature(secretKey: string, message: string): string {\n    const signature = crypto.createHmac('sha256', secretKey).update(message).digest('hex').substring(0, 30);\n\n    return encodeBase62(BigInt(`0x${signature}`));\n}\n\nlet subtleCrypto = globalThis.crypto?.subtle;\n\nasync function ensureSubtleCryptoExists() {\n    if (!subtleCrypto) {\n        try {\n            // eslint-disable-next-line typescript/no-require-imports -- Backward compatibility for Node.js versions < 19\n            subtleCrypto = require('node:crypto')?.webcrypto?.subtle;\n            if (subtleCrypto) return;\n        } catch {\n            // Ignore require error\n        }\n\n        try {\n            subtleCrypto = (await import('node:crypto'))?.webcrypto?.subtle as SubtleCrypto;\n        } catch {\n            // Ignore import error\n        }\n\n        if (!subtleCrypto) {\n            throw new Error(`SubtleCrypto is not available in this environment.\nPlease ensure you're running in an environment that supports Web Crypto API,\nor submit an issue to https://github.com/apify/apify-shared-js so we can help you further.`);\n        }\n    }\n}\n\n/**\n * Generates an HMAC signature and encodes it using Base62.\n * Base62 encoding reduces the signature length.\n *\n * @param secretKey {string} Secret key used for signing signatures\n * @param message {string} Message to be signed\n * @returns Promise<string>\n */\nexport async function createHmacSignatureAsync(secretKey: string, message: string): Promise<string> {\n    await ensureSubtleCryptoExists();\n    const encoder = new TextEncoder();\n\n    const key = await subtleCrypto.importKey(\n        'raw',\n        encoder.encode(secretKey),\n        { name: 'HMAC', hash: 'SHA-256' },\n        false,\n        ['sign'],\n    );\n\n    const signatureBuffer = await subtleCrypto.sign('HMAC', key, encoder.encode(message));\n\n    const signatureArray = new Uint8Array(signatureBuffer);\n    const signatureHex = Array.from(signatureArray)\n        .map((b) => b.toString(16).padStart(2, '0'))\n        .join('')\n        .substring(0, 30);\n\n    return encodeBase62(BigInt(`0x${signatureHex}`));\n}\n","import { createHmacSignature, createHmacSignatureAsync } from './hmac';\n\n/**\n * Creates a secure signature for a resource like a dataset or key-value store.\n * This signature is used to generate a signed URL for authenticated access, which can be expiring or permanent.\n * The signature is created using HMAC with the provided secret key and includes the resource ID, expiration time, and version.\n *\n * Note: expiresInMillis is optional. If not provided, the signature will not expire.\n *\n * @deprecated Use {@link createStorageContentSignatureAsync} instead, which uses Web Crypto API and\n * is available in both Node.js and browsers without the need for polyfills.\n */\nexport function createStorageContentSignature({\n    resourceId,\n    urlSigningSecretKey,\n    expiresInMillis,\n    version = 0,\n}: {\n    resourceId: string;\n    urlSigningSecretKey: string;\n    expiresInMillis?: number;\n    version?: number;\n}) {\n    const expiresAt = expiresInMillis ? new Date().getTime() + expiresInMillis : 0;\n    const hmac = createHmacSignature(urlSigningSecretKey, `${version}.${expiresAt}.${resourceId}`);\n    return Buffer.from(`${version}.${expiresAt}.${hmac}`).toString('base64url');\n}\n\nfunction typedArrayToBase64Url(typedArray: Uint8Array): string {\n    let binary = '';\n    for (let i = 0; i < typedArray.length; i++) {\n        binary += String.fromCharCode(typedArray[i]);\n    }\n    const base64 = btoa(binary);\n    return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n/**\n * Creates a secure signature for a resource like a dataset or key-value store.\n * This signature is used to generate a signed URL for authenticated access, which can be expiring or permanent.\n * The signature is created using HMAC with the provided secret key and includes the resource ID, expiration time, and version.\n *\n * Note: expiresInMillis is optional. If not provided, the signature will not expire.\n */\nexport async function createStorageContentSignatureAsync({\n    resourceId,\n    urlSigningSecretKey,\n    expiresInMillis,\n    version = 0,\n}: {\n    resourceId: string;\n    urlSigningSecretKey: string;\n    expiresInMillis?: number;\n    version?: number;\n}): Promise<string> {\n    const expiresAt = expiresInMillis ? new Date().getTime() + expiresInMillis : 0;\n    const hmac = await createHmacSignatureAsync(urlSigningSecretKey, `${version}.${expiresAt}.${resourceId}`);\n    return typedArrayToBase64Url(new TextEncoder().encode(`${version}.${expiresAt}.${hmac}`));\n}\n","/**\n * Strictly parses a value to a boolean, returning `null` if the value is invalid.\n * - Returns `true` for: `true`, `1`, `'1'`, `'true'` (case-insensitive).\n * - Returns `false` for: `false`, `0`, `'0'`, `'false'` (case-insensitive).\n * - Returns `null` for any other value.\n *\n * @param value - The value to parse (unknown type).\n * @returns {boolean | null} The parsed boolean or null if the input is invalid.\n */\nexport const parseBooleanOrNull = (value: unknown): boolean | null => {\n    if (value === true || value === 1) return true;\n    if (value === false || value === 0) return false;\n\n    if (typeof value === 'string') {\n        const lowerValue = value.trim().toLowerCase();\n        if (lowerValue === 'true' || lowerValue === '1') return true;\n        if (lowerValue === 'false' || lowerValue === '0') return false;\n    }\n\n    // Return null for invalid/ambiguous input\n    return null;\n};\n"],"mappings":"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A,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAGA,IAAM,mBAAmB,IAAI,OAAO,KAAK,iCAAkB,IAAI,4BAA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","names":["crypto","log","import_consts","import_log","log","CHECK_TYPES","import_node_crypto","crypto","import_node_crypto","CodeHashMetaKey","import_node_crypto","crypto"]}