needle-cloud 1.5.1 → 1.5.2-rc.c396e37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/web/polyfill.js","../src/web/auth.config.js","../src/web/auth.js","../src/web/web-components/LoginButton.js","../../needle-share-sdk/src/api.auth.js","../../needle-share-sdk/src/utils.fetch.js","../../needle-share-sdk/src/api.account.js","../../needle-share-sdk/src/api.js","../../needle-share-sdk/node_modules/axios/lib/helpers/bind.js","../../needle-share-sdk/node_modules/axios/lib/utils.js","../../needle-share-sdk/node_modules/axios/lib/core/AxiosError.js","../../needle-share-sdk/node_modules/axios/lib/helpers/toFormData.js","../../needle-share-sdk/node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../../needle-share-sdk/node_modules/axios/lib/helpers/buildURL.js","../../needle-share-sdk/node_modules/axios/lib/core/InterceptorManager.js","../../needle-share-sdk/node_modules/axios/lib/defaults/transitional.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/index.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/classes/FormData.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/classes/Blob.js","../../needle-share-sdk/node_modules/axios/lib/platform/common/utils.js","../../needle-share-sdk/node_modules/axios/lib/platform/index.js","../../needle-share-sdk/node_modules/axios/lib/helpers/formDataToJSON.js","../../needle-share-sdk/node_modules/axios/lib/defaults/index.js","../../needle-share-sdk/node_modules/axios/lib/helpers/toURLEncodedForm.js","../../needle-share-sdk/node_modules/axios/lib/helpers/parseHeaders.js","../../needle-share-sdk/node_modules/axios/lib/core/AxiosHeaders.js","../../needle-share-sdk/node_modules/axios/lib/core/transformData.js","../../needle-share-sdk/node_modules/axios/lib/cancel/isCancel.js","../../needle-share-sdk/node_modules/axios/lib/cancel/CanceledError.js","../../needle-share-sdk/node_modules/axios/lib/core/settle.js","../../needle-share-sdk/node_modules/axios/lib/helpers/progressEventReducer.js","../../needle-share-sdk/node_modules/axios/lib/helpers/speedometer.js","../../needle-share-sdk/node_modules/axios/lib/helpers/throttle.js","../../needle-share-sdk/node_modules/axios/lib/helpers/isURLSameOrigin.js","../../needle-share-sdk/node_modules/axios/lib/helpers/cookies.js","../../needle-share-sdk/node_modules/axios/lib/core/buildFullPath.js","../../needle-share-sdk/node_modules/axios/lib/helpers/isAbsoluteURL.js","../../needle-share-sdk/node_modules/axios/lib/helpers/combineURLs.js","../../needle-share-sdk/node_modules/axios/lib/core/mergeConfig.js","../../needle-share-sdk/node_modules/axios/lib/helpers/resolveConfig.js","../../needle-share-sdk/node_modules/axios/lib/adapters/xhr.js","../../needle-share-sdk/node_modules/axios/lib/helpers/parseProtocol.js","../../needle-share-sdk/node_modules/axios/lib/helpers/composeSignals.js","../../needle-share-sdk/node_modules/axios/lib/helpers/trackStream.js","../../needle-share-sdk/node_modules/axios/lib/adapters/fetch.js","../../needle-share-sdk/node_modules/axios/lib/adapters/adapters.js","../../needle-share-sdk/node_modules/axios/lib/helpers/null.js","../../needle-share-sdk/node_modules/axios/lib/core/dispatchRequest.js","../../needle-share-sdk/node_modules/axios/lib/env/data.js","../../needle-share-sdk/node_modules/axios/lib/helpers/validator.js","../../needle-share-sdk/node_modules/axios/lib/core/Axios.js","../../needle-share-sdk/node_modules/axios/lib/cancel/CancelToken.js","../../needle-share-sdk/node_modules/axios/lib/helpers/HttpStatusCode.js","../../needle-share-sdk/node_modules/axios/lib/axios.js","../../needle-share-sdk/node_modules/axios/lib/helpers/spread.js","../../needle-share-sdk/node_modules/axios/lib/helpers/isAxiosError.js","../../needle-share-sdk/node_modules/axios/index.js","../../needle-share-sdk/src/api.jobs.js","../../needle-share-sdk/node_modules/js-md5/src/md5.js","../../needle-share-sdk/node_modules/file-type-mime/dist/index.mjs","../../needle-share-sdk/src/file.utils.js","../../needle-share-sdk/src/utils.js","../../needle-share-sdk/src/utils.optimization.js","../../needle-share-sdk/src/api.upload.validate.js","../../needle-share-sdk/src/utils.upload.js","../../needle-share-sdk/src/api.upload.js","../../needle-share-sdk/src/file.archive.js","../../needle-share-sdk/src/logto.js","../src/web/functions/utils.js","../src/web/functions/upload.js","../src/web/functions/get.js","../src/list.js","../../needle-share-sdk/src/api.list.js","../src/web/functions/checkout.js"],"sourcesContent":["import { Buffer } from \"buffer\";\n/** @ts-ignore */\nglobalThis[\"Buffer\"] = Buffer;\n","import { UserScope } from \"@logto/browser\";\n\n\nexport const AuthScopes = {\n Basic: [\n UserScope.Profile,\n UserScope.Email,\n ],\n /** Scopes required for license retrieval and payment */\n Payment: [\n \"read:accounting\", \"write:accounting\" // necessary to get or buy licenses\n ],\n All: [\n UserScope.Profile,\n UserScope.Email,\n UserScope.Roles,\n UserScope.CustomData,\n UserScope.Organizations,\n UserScope.OrganizationRoles,\n ...[\"all\", \"read\", \"write\", \"delete\", \"invite\", \"download\", \"create:org\", \"write:org\", \"delete:org\", \"read:accounting\", \"write:accounting\", \"read:usage\"]\n ]\n}\n\n\n\n/** Needle Product License names */\nexport const Licenses = {\n /** All licenses that make up Needle Pro. Having any of these products is considered PRO */\n NeedlePro: [\"Needle Engine\"], // See import(\"@api/types/stripe\").License[\"type\"]\n}","/**\n * @typedef {import(\"@logto/browser\").UserInfoResponse} UserInfoResponse\n * @typedef {\"https://cloud.needle.tools/api\" | ({} & string)} ResourceUrl\n * \n * @typedef {Object} AuthInitOpts\n * @property {string} [appId]\n * @property {string[] | \"payment\" | \"all\"} [scopes] User scopes. If an empty array is passed\n * @property {boolean} [debug]\n */\n\nimport LogtoClient, { UserScope } from \"@logto/browser\";\nimport { api_endpoint } from \"../constants.js\";\nimport { AuthScopes } from \"./auth.config.js\";\n\nconst endpoint = 'https://auth.needle.tools/';\n\n/** @type {string | undefined} */\nlet appId = undefined; // assigned in init()\n\n/** @type {Array<string>} */\nlet scopes = [];\n\n/** @type {boolean} */\nlet _isAuthenticated;\n/** @type {UserInfoResponse|null} */\nlet _userInfo = null;\n/** @type {Promise<boolean>|null} */\nlet _init = null;\n/** @type {Promise<UserInfoResponse|null>|null} */\nlet requestUserInfoPromise = null;\n/** @type {LogtoClient|null} */\nlet _client = null;\n\n// /** @type {Array<Function>} */\nconst changedListeners = new Array();\n\nfunction invokeChange() {\n changedListeners.forEach(callback => {\n try { callback(); } catch (err) { console.error(err) }\n });\n}\n\nlet debug = false;\n\nexport const Auth = {\n\n /** @param {boolean} _debug */\n setDebug(_debug) {\n debug = _debug;\n },\n\n baseUrl: window.location.origin, // e.g. https://localhost:3000\n\n /**\n * The URL to redirect to after sign-in. This should not be changed in production.\n */\n redirectUri: window.location.origin,\n\n postSignOutRedirectUri: window.location.origin,\n\n /**\n * Register a callback to be called when the authentication state changes\n * @param {Function} callback - The callback to register\n * @returns {Function} - A function to unregister the callback\n */\n onChanged(callback) {\n if (!changedListeners.includes(callback)) {\n changedListeners.push(callback);\n }\n return () => {\n while (true) {\n const index = changedListeners.indexOf(callback);\n if (index >= 0) {\n changedListeners.splice(index, 1);\n }\n else break;\n }\n };\n },\n\n /**\n * Returns a promise that resolves when Auth is initialized\n * @returns {Promise<boolean>}\n */\n ready() {\n if (!_init) return Promise.reject(new Error(\"Auth not initialized\"));\n return _init.then(() => true);\n },\n\n /**\n * Initialize the Auth system\n * @internal\n * @param {AuthInitOpts} [opts] - Initialization options\n * @returns {Promise<boolean>}\n */\n init(opts) {\n if (_init) return _init;\n return _init = internalInit(opts);\n },\n\n /**\n * Check if the user is currently authenticated\n * @returns {boolean}\n */\n isAuthenticated() {\n return _isAuthenticated;\n },\n\n /**\n * Check authentication status with the server\n * @returns {Promise<boolean>}\n */\n checkIsAuthenticated() {\n return client().isAuthenticated().then(res => {\n _isAuthenticated = res;\n return res;\n });\n },\n\n /**\n * Get the current user information (if fetched previously)\n * @returns {UserInfoResponse|null}\n */\n getUserInfo() {\n return _userInfo;\n },\n\n /**\n * Get the current user ID (sub)\n * @returns {string|null}\n */\n getUserId() {\n if (!_userInfo) return null;\n return _userInfo.sub;\n },\n\n /**\n * Get the user's name or username (if available)\n * @returns {string|null}\n */\n getName() {\n if (!_userInfo) return null;\n if (_userInfo.username) {\n return _userInfo.username;\n }\n if (_userInfo.name) {\n return _userInfo.name;\n }\n if (_userInfo.email) {\n return _userInfo.email.split('@')[0];\n }\n return null;\n },\n\n /**\n * Request user information from the server\n * @returns {Promise<UserInfoResponse|null>}\n */\n requestUserInfo() {\n if (requestUserInfoPromise) return requestUserInfoPromise;\n return requestUserInfoPromise = Auth.checkIsAuthenticated().then(res => {\n if (!res) {\n _userInfo = null;\n invokeChange();\n return null;\n }\n return client().fetchUserInfo()\n .then(res => {\n if (debug && res?.sub != _userInfo?.sub) console.debug(\"UserInfo\", res);\n _userInfo = res;\n invokeChange();\n return res;\n })\n .catch(err => {\n console.error(err);\n _userInfo = null;\n invokeChange();\n return null;\n })\n });\n },\n\n /**\n * Request an access token for the configured resource\n * @param {string | undefined | null} [org_id] - The organization ID (optional). If none is provided the user access token will be requested.\n * @returns {Promise<string>}\n */\n requestAccessToken(org_id) {\n if (debug) console.debug(\"requestAccessToken\", { org_id });\n if (org_id) {\n return client().getOrganizationToken(org_id);\n }\n return client().getAccessToken(api_endpoint, org_id || undefined);\n },\n\n /**\n * Initiate the sign-in process\n */\n signIn() {\n return Auth.checkIsAuthenticated().then(res => {\n if (res == false) {\n if (!appId?.length) {\n throw new Error(\"App ID is not set: Make sure to call 'init' first\");\n }\n saveQueryParamsDuringAuth();\n client().signIn(Auth.redirectUri);\n }\n });\n },\n\n /**\n * Sign out the current user\n */\n signOut() {\n requestUserInfoPromise = null;\n return Auth.checkIsAuthenticated().then(res => {\n if (res == true) {\n if (!appId?.length) {\n throw new Error(\"App ID is not set: Make sure to call 'init' first\");\n }\n saveQueryParamsDuringAuth();\n client().signOut(Auth.postSignOutRedirectUri);\n }\n });\n }\n};\n\n/**\n * @param {AuthInitOpts} [opts]\n * @returns {Promise<boolean>}\n */\nasync function internalInit(opts) {\n if (opts?.debug) debug = opts.debug;\n\n if (debug) console.debug(\"Auth.init\", opts);\n\n if (opts?.scopes) {\n switch (opts.scopes) {\n case \"all\":\n opts.scopes = AuthScopes.All;\n break;\n case \"payment\":\n opts.scopes = AuthScopes.Payment;\n break;\n }\n scopes = opts.scopes;\n }\n // Default scopes if nothing is configured\n if (scopes.length <= 0) {\n scopes.push(\n ...AuthScopes.Basic,\n ...AuthScopes.Payment\n );\n }\n if (debug) console.debug(\"Auth.init\", \"Use scopes\", scopes);\n\n if (opts?.appId) {\n appId = opts.appId;\n // Reset the client if the appId has changed\n if (_client?.logtoConfig.appId !== appId) {\n if (debug) console.debug(\"Auth.init\", \"App ID changed, resetting client\");\n _client = null;\n }\n }\n else {\n // This is the default app id\n appId = \"2x82zzh5xuudmiotdy2ux\";\n if (debug) console.debug(\"Auth.init\", \"Use default app ID\", appId);\n }\n\n const sign_int = handleSignin();\n if (sign_int instanceof Promise) await sign_int.then(_ => true);\n\n const query = restoreQueryParamsDuringAuth(true);\n if (query) {\n const url = new URL(window.location.href);\n url.search = query;\n window.history.replaceState({}, '', url.href);\n }\n else {\n return Auth.checkIsAuthenticated()\n .then(res => {\n // fetch userinfo immediately if the user is authenticated\n if (res) return Auth.requestUserInfo().then(() => true);\n return true;\n });\n }\n return Promise.resolve(true);\n}\n\n/**\n * Save current query parameters during auth flow\n */\nfunction saveQueryParamsDuringAuth() {\n sessionStorage.setItem('needle-auth:query', window.location.search);\n}\n\n/**\n * Restore query parameters that were saved during auth flow\n * @param {boolean} [del=true] - Whether to delete the saved query after restoring\n * @returns {string} The saved query string\n */\nfunction restoreQueryParamsDuringAuth(del = true) {\n const query = sessionStorage.getItem('needle-auth:query');\n if (query) {\n if (del)\n sessionStorage.removeItem('needle-auth:query');\n return query;\n }\n return '';\n}\n\n/**\n * Get the LogtoClient instance\n * @returns {LogtoClient}\n */\nfunction client() {\n if (!_client) {\n if (!appId) throw new Error(\"App ID is not set: Make sure to call 'init' first\");\n\n /** @type {import(\"@logto/browser\").LogtoConfig} */\n const config = {\n endpoint,\n appId,\n scopes: scopes,\n resources: [api_endpoint]\n }\n\n if (debug) console.warn(\"Creating auth client:\", debug, config);\n _client = new LogtoClient(config);\n }\n return _client;\n}\n\n/**\n * Handle the sign-in redirect process\n * @returns {Promise<void>|void}\n */\nfunction handleSignin() {\n // TODO: use client().isSignInRedirected(url.href) instead \n const url = new URL(window.location.href);\n if (url.searchParams.has('code') && url.searchParams.has('state')) {\n if (url.searchParams.get(\"iss\")?.includes(\"https://auth.needle.tools/\")) {\n return client().handleSignInCallback(url.href).then(() => {\n const newUrl = new URL(window.location.href);\n newUrl.pathname = newUrl.pathname.replace('callback', '');\n newUrl.searchParams.delete('code');\n newUrl.searchParams.delete('state');\n newUrl.searchParams.delete('iss');\n const query = restoreQueryParamsDuringAuth();\n if (query) {\n console.log('Restore query before login', query, \"Current:\", newUrl.search);\n newUrl.search = query;\n }\n // change query parameters without reload\n window.history.replaceState({}, '', newUrl.href);\n }).catch(err => {\n console.error(err);\n });\n }\n }\n}","import { Auth } from \"../auth.js\";\n\n/**\n * Basic web component for login/logout\n */\nexport class NeedleLoginButton extends HTMLButtonElement {\n constructor() {\n super();\n this.addEventListener(\"click\", () => {\n if (Auth.isAuthenticated()) {\n Auth.signOut();\n }\n else {\n Auth.signIn();\n }\n });\n }\n connectedCallback() {\n console.debug(\"Login button connected...\");\n this.__update();\n this.__unsubscribeOnChange = Auth.onChanged(() => {\n this.__update();\n });\n }\n disconnectedCallback() {\n this.__unsubscribeOnChange?.();\n }\n\n __update() {\n this.innerHTML = Auth.isAuthenticated() ? \"Logout\" : \"Login\";\n }\n}\n\ncustomElements.define(\"needle-login-button\", NeedleLoginButton, { extends: \"button\" });","\n\n\n\n\n/**\n * Create the headers for an authenticated request\n * @param {import(\"../types\").AuthData} authData\n * @returns {import(\"../types\").AuthHeaders}\n */\nexport function createAuthHeaders(authData) {\n /**\n * @type {import(\"../types\").AuthHeaders}\n */\n const authHeaders = {\n authorization: \"Bearer \" + authData.authToken,\n }\n if (authData.org)\n authHeaders[\"x-needle-cloud-org\"] = authData.org;\n if (authData.roles) {\n authHeaders.roles = authData.roles.join(\",\");\n }\n if (authData.roles_org) {\n authHeaders.roles_org = authData.roles_org.join(\",\");\n }\n return authHeaders;\n}\n\n\n/**\n * @param {import(\"../types\").Action} type\n * @param {import(\"../types\").Permission[] | undefined} permissions\n * @returns {boolean}\n */\nexport function checkPermissions(type, permissions) {\n if (!permissions?.length)\n return false;\n\n switch (type) {\n case \"write\":\n return permissions.some(p => p == \"all\" || p == \"write\");\n case \"read\":\n return permissions.some(p => p == \"all\" || p == \"read\");\n case \"upload\":\n return permissions.some(p => p == \"all\" || p == \"upload\");\n case \"download\":\n return permissions.some(p => p == \"all\" || p == \"download\");\n case \"delete\":\n return permissions.some(p => p == \"all\" || p == \"delete\");\n case \"invite\":\n return permissions.some(p => p == \"all\" || p == \"invite\");\n case \"create:org\":\n return permissions.some(p => p == \"all\" || p == \"create:org\");\n case \"write:org\":\n return permissions.some(p => p == \"all\" || p == \"write:org\");\n case \"delete:org\":\n return permissions.some(p => p == \"all\" || p == \"delete:org\");\n case \"read:accounting\":\n return permissions.some(p => p == \"all\" || p == \"read:accounting\");\n case \"write:accounting\":\n return permissions.some(p => p == \"all\" || p == \"write:accounting\");\n case \"read:usage\": \n return permissions.some(p => p == \"all\" || p == \"read:usage\");\n case \"read:needle\":\n // TODO: we should introduce a new permission for reading internal data that doesnt require \"all\" permissions\n return permissions.some(p => p == \"all\");\n\n }\n\n throw new Error(\"Unknown action type: \" + type);\n\n}","\n\n/**\n * @type {RequestInit}\n */\nexport const DEFAULT_FETCH_INIT = {\n credentials: \"omit\"\n}","import { createAuthHeaders } from \"./api.auth.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\n\n\n/**\n * @param {{ baseUrl?: null | string, pathname?:string, account_id?:string|null, license?:import(\"../types/api.payment.js\").NeedleEngineLicenseIdentifier, return_url?: string|null, checkout_if_possible?: boolean, show_all_cards?:boolean, affiliate_id?: string, tracking_id?:string }} [opts]\n * @returns {URL | null} the URL to the purchase intent page (null if the URL cannot be created)\n */\nexport function getPurchaseIntentUrl(opts) {\n opts = opts || {};\n\n const location = typeof window !== \"undefined\" ? window.location : null;\n\n if (opts.baseUrl === \"current_page\") {\n opts.baseUrl = location?.href;\n }\n let path = opts.pathname || location?.pathname;\n let baseUrl = opts.baseUrl || location?.href;\n if (!path || !baseUrl) {\n return null;\n }\n const url = new URL(path, baseUrl);\n\n // Keep existing URL parameters\n if (location) {\n url.search = location.search;\n }\n if (!opts.license) {\n opts.license = \"needle-engine:pro\";\n }\n url.searchParams.set(\"purchase_intent\", opts.license);\n if (opts.account_id) {\n url.searchParams.set(\"account_id\", opts.account_id);\n }\n if (opts.return_url) {\n url.searchParams.set(\"return_url\", opts.return_url);\n }\n if (opts.checkout_if_possible) {\n url.searchParams.set(\"checkout_if_possible\", \"true\");\n }\n if (opts.show_all_cards) {\n url.searchParams.set(\"show_all_cards\", \"true\");\n }\n if (opts.affiliate_id) {\n url.searchParams.set(\"affiliate_id\", opts.affiliate_id);\n }\n if (opts.tracking_id) {\n url.searchParams.set(\"tracking_id\", opts.tracking_id);\n }\n return url;\n}\n\n/**\n * @param {\"edu\" | \"startup\"} license\n * @returns {string} the URL to apply for a license\n */\nexport function getApplyForLicenseUrl(license) {\n switch (license) {\n case \"edu\":\n return \"https://cloud.needle.tools/apply/edu\"\n case \"startup\":\n return \"https://cloud.needle.tools/apply/startup\"\n default:\n return \"https://cloud.needle.tools/apply\"\n }\n}\n\n/**\n * Get the licenses this user has access to\n * @param {{baseUrl:string} & import(\"../types/index.js\").AuthData} args\n * @param {import(\"../types/api.payment.js\").GetLicensesRequestHeaders} options\n * @returns {Promise<Array<import(\"../../needle-share/types/stripe.js\").License>>}\n */\nexport async function getLicenses(args, options) {\n\n const url = args.baseUrl + ShareApiEndpoints.account.get_licenses;\n\n /**\n * @type {import(\"../types/api.payment.js\").GetLicensesRequestHeaders}\n */\n const licensesRequestHeaders = {\n ...options\n }\n\n const headers = {\n ...licensesRequestHeaders,\n ...createAuthHeaders(args),\n }\n const res = await fetch(url,\n {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers: headers\n }\n ).catch(err => {\n console.error(err);\n return null;\n });\n\n if (!res) {\n return [];\n }\n\n if (!res.ok) {\n console.error(res.statusText, await res.text());\n return [];\n }\n\n /**\n * @type {import(\"../types/api.payment.js\").GetLicensesResponse}\n */\n const json = await res.json();\n return json.licenses;\n}\n\n\n","\n\n/**\n * @type {Omit<import(\"../types\").ShareApiEndpoints, \"baseUrl\">}\n */\nexport const ShareApiEndpoints = {\n status: \"/v1/status\",\n version: \"/v1/version\",\n api: \"/v1/api\",\n usage: {\n get: \"/v1/usage\",\n },\n affiliate:{\n get: \"/v1/affiliate/get\",\n link_clicked: \"/v1/affiliate/link_clicked\",\n },\n account: {\n public_key: \"/v1/account/public_key\",\n post_machine: \"/v1/account/machine\",\n connect: \"/v1/account/connect\",\n get_licenses: \"/v1/account/get/licenses\",\n set_license_active: \"/v1/account/set_license_active\",\n set_licenses_active: \"/v1/account/set_licenses_active\",\n buy_licenses: \"/v1/account/buy_licenses\",\n // upgrade_license: \"/v1/account/upgrade_license\",\n update_licenses: \"/v1/account/update_licenses\",\n update_payment_method: \"/v1/account/update_payment_method\",\n get_billing: \"/v1/account/get_billing\",\n resume_subscription: \"/v1/account/resume_subscription\",\n cancel_subscription: \"/v1/account/cancel_subscription\",\n\n start_billingportal_session: \"/v1/account/start_billingportal_session\",\n // get_credits: \"/v1/account/get_credits\",\n // buy_credits: \"/v1/account/buy_credits\",\n },\n ai: {\n llmstxt: \"/v1/ai/llmstxt\",\n chat: \"/v1/ai/chat\",\n list_chats: \"/v1/ai/chat/list\",\n ask: \"/v1/ai/ask\",\n },\n organizations: {\n get: \"/v1/organizations/get\",\n orgs_details: \"/v1/organizations/details\",\n licenses: \"/v1/organizations/licenses\",\n get_invitations: \"/v1/organizations/get_invitations\",\n },\n events: {\n get: \"/v1/events/get\",\n post: \"/v1/events/post\",\n list: \"/v1/events/list\",\n },\n reports: {\n get: \"/v1/reports/get\",\n post: \"/v1/reports/post\",\n },\n questionnaire: {\n get: \"/v1/questionnaires/get\",\n post: \"/v1/questionnaires/post\",\n },\n roadmap: {\n get: \"/v1/roadmap/get\",\n post_vote: \"/v1/roadmap/post\",\n },\n tokens: {\n create: \"/v1/tokens/create\",\n delete: \"/v1/tokens/delete\",\n // get: \"/v1/tokens/get\",\n list: \"/v1/tokens/list\",\n },\n get: {\n stats: \"/v1/get/stats\",\n jobs: \"/v1/list/jobs\",\n uploads: \"/v1/list/uploads\",\n uploads_deleted: \"/v1/list/uploads/deleted\",\n deployments: \"/v1/list/deployments\",\n discounts: \"/v1/get/discounts\",\n },\n urls: {\n public: \"/v1/public\",\n public_download_urls: \"/v1/public/download/urls\",\n },\n view: {\n get: \"/v1/view\",\n get_analytics: \"/v1/view/analytics\",\n get_public_info: \"/v1/view/public/info\",\n post_version: \"/v1/view/post_version\",\n update: \"/v1/view/update\",\n delete: \"/v1/view/delete\",\n restore: \"/v1/view/restore\",\n },\n // deployment: {\n // get_latest: \"/v1/deployment/get/latest\",\n // },\n upload: {\n request: \"/v1/upload/request\",\n request_put_url: \"/v1/upload/put\",\n update_results: \"/v1/upload/results\",\n done: \"/v1/upload/done\",\n cancel: \"/v1/upload/cancel\",\n },\n optimize: {\n get_optimize_id: \"/v1/optimize/get_id\",\n request: \"/v1/optimize/request\",\n },\n jobs: {\n request_start: \"/v1/jobs/request_start\",\n request_download_url: \"/v1/download/get_presigned_url\",\n request_download_urls: \"/v1/download/get_presigned_urls\",\n request_restart: \"/v1/jobs/restart\",\n delete: \"/v1/jobs/delete\",\n post_update: \"/v1/jobs/update\",\n post_meta: \"/v1/jobs/meta\",\n post_results_stats: \"/v1/jobs/results_stats\",\n get_status: \"/v1/jobs/status\",\n get_org: \"/v1/jobs/org\",\n query: \"/v1/jobs/query\",\n request_job_that_needs_stats: \"/v1/jobs/job_needs_stats\",\n },\n worker: {\n ping: \"/v1/worker/ping\",\n get_available_count: \"/v1/worker/get_available_count\",\n post_available_info: \"/v1/worker/post_available_info\",\n get_available_info: \"/v1/worker/get_available_info\",\n },\n local_projects: {\n get: {\n user: \"/v1/local_projects/user\",\n by_id: \"/v1/local_projects/\",\n },\n post: \"/v1/local_projects\",\n },\n}\n","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isHeaders(header)) {\n for (const [key, value] of header.entries()) {\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n let contentType;\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // Let the browser set it\n } else if ((contentType = headers.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst composeSignals = (signals, timeout) => {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (cancel) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = cancel instanceof Error ? cancel : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal &&\n (signal.removeEventListener ? signal.removeEventListener('abort', onabort) : signal.unsubscribe(onabort));\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal && signal.addEventListener && signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = unsubscribe;\n\n return [signal, () => {\n timer && clearTimeout(timer);\n timer = null;\n }];\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize, encode) {\n for await (const chunk of iterable) {\n yield* streamChunk(ArrayBuffer.isView(chunk) ? chunk : (await encode(String(chunk))), chunkSize);\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish, encode) => {\n const iterator = readBytes(stream, chunkSize, encode);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = utils.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if(utils.isBlob(body)) {\n return body.size;\n }\n\n if(utils.isSpecCompliantForm(body)) {\n return (await new Request(body).arrayBuffer()).byteLength;\n }\n\n if(utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n}\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n}\n\nexport default isFetchSupported && (async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let [composedSignal, stopTimeout] = (signal || cancelToken || timeout) ?\n composeSignals([signal, cancelToken], timeout) : [];\n\n let finished, request;\n\n const onFinish = () => {\n !finished && setTimeout(() => {\n composedSignal && composedSignal.unsubscribe();\n });\n\n finished = true;\n }\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush, encodeText);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: withCredentials\n });\n\n let response = await fetch(request);\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || isStreamResponse)) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n isStreamResponse && onFinish();\n }, encodeText),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && onFinish();\n\n stopTimeout && stopTimeout();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n onFinish();\n\n if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\n\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.7.4\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy;\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n","import { createAuthHeaders } from \"./api.auth.js\";\nimport { isInternalFile } from \"./api.jobs.results.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\n\n\n\n/** \n * @param {string} jobid\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args,\n * @param {import(\"../types\").JobRequestRestartBody} body\n * @returns {Promise<boolean>}\n*/\nexport async function requestRestart(jobid, args, body) {\n\n const url = args.baseUrl + ShareApiEndpoints.jobs.request_restart;\n /**\n * @type {import(\"../types\").JobRequestRestartRequestHeaders}\n */\n const headers = {\n ...createAuthHeaders(args),\n job_id: jobid\n }\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers,\n body: JSON.stringify(body)\n }).catch(err => {\n console.error(err);\n return null;\n });\n if (!res) return false;\n return res.ok;\n}\n\n\n/** \n * @param {Pick<import(\"../types\").JobModel, \"identifier\" | \"status\" | \"status_message\" | \"error\" | \"progress\">} job\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args \n * @returns {Promise<boolean>}\n*/\nexport async function updateJobStatus(job, args) {\n\n const url = args.baseUrl + ShareApiEndpoints.jobs.post_update;\n /**\n * @type {import(\"../types\").JobPostStatusRequestHeaders}\n */\n const headers = {\n ...createAuthHeaders(args),\n job_id: job.identifier,\n status: job.status,\n }\n\n /**\n * @type {import(\"../types\").JobPostStatusRequestBody}\n */\n const body = {\n status_message: job.status_message,\n error: job.error,\n progress: job.progress\n }\n\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n /** @type {any} */\n headers: headers,\n body: JSON.stringify(body)\n }).catch(err => {\n console.error(err);\n return null;\n });\n if (!res) return false;\n return res.ok;\n}\n\n\n/**\n * @param {string} jobid\n * @param {{baseUrl:string} & import(\"../types\").AuthData & { org: string }} args\n */\nexport async function getJobStatus(jobid, args) {\n\n const url = args.baseUrl + ShareApiEndpoints.jobs.get_status;\n\n\n /** @type {import(\"../types\").JobGetStatusRequestHeaders} */\n const headers = {\n ...createAuthHeaders(args),\n job_id: jobid,\n org: args.org,\n }\n\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers: headers\n }).catch(err => {\n console.error(err);\n return null;\n });\n if (!res) return null;\n if (!res.ok) {\n console.error(\"Failed to get status\", res.status, await res.text());\n return null;\n }\n /**\n * @type {import(\"../types\").JobGetStatusRequestResponse}\n */\n const data = await res.json();\n return data;\n}\n\n\n/**\n * @param {Pick<import(\"../types\").JobModel, \"results\">} job\n * @param {{include_internal?:boolean}} options\n * @returns {{mainAssetSize:number, additionalAssets:number}} file sizes in bytes\n */\nexport function calculateFileSize(job, options = { include_internal: false }) {\n let mainAssetSize = 0;\n let additionalAssets = 0;\n\n if (job.results) {\n mainAssetSize =\n job.results.files.find(\n (file) => file.filename == job.results?.entrypoint,\n )?.content_length || 0;\n additionalAssets = job.results.files.reduce((acc, file) => {\n if (file.filename != job.results?.entrypoint) {\n // if we don't explictly include internal files - skip them\n if (options?.include_internal !== true) {\n if (isInternalFile(file.filename)) {\n return acc;\n }\n }\n return acc + file.content_length;\n }\n return acc;\n }, 0);\n }\n return {\n mainAssetSize,\n additionalAssets,\n };\n}\n\n\n\n/**\n * @template {import(\"../types\").JobModelKeys} T\n * @param {{baseUrl:string, identifier:string, fields:Array<T>} & import(\"../types\").AuthData} opts\n * @returns {Promise<null | (Pick<import(\"../types\").JobModel, T>)>}\n */\nexport async function getJob(opts) {\n\n if (!opts.identifier) return null;\n\n\n /**\n * @type {import(\"../types\").JobQueryRequestHeaders}\n */\n const headers = {\n ...createAuthHeaders(opts),\n };\n /**\n * @type {import(\"../types\").JobQueryRequestBody}\n */\n const body = {\n job_id: opts.identifier,\n fields: opts.fields\n }\n const url = opts.baseUrl + ShareApiEndpoints.jobs.query;\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers,\n body: JSON.stringify(body)\n }).catch(err => {\n console.error(err);\n return null;\n });\n\n if (res == null) {\n return null;\n }\n else if (!res.ok) {\n console.error(\"Failed to get job\", res.status, await res.text());\n return null;\n }\n\n /**\n * @type {import(\"../types\").JobQueryRequestResponse}\n */\n const response = await res.json().catch(err => {\n console.error(err);\n return null;\n });\n if (response == null) {\n return null;\n }\n\n /** @ts-ignore */\n return response.job;\n}\n\n\n\n\n/**\n * @param {{baseUrl:string, identifier:string} & import(\"../types\").AuthData} opts\n * @returns {Promise<null | object>}\n */\nexport async function getJobResultStats(opts) {\n\n const res = await getJob({\n ...opts,\n fields: [\"results_stats\"]\n });\n if (res?.results_stats) {\n return res.results_stats;\n }\n return null;\n};\n","/**\n * [js-md5]{@link https://github.com/emn178/js-md5}\n *\n * @namespace md5\n * @version 0.8.3\n * @author Chen, Yi-Cyuan [emn178@gmail.com]\n * @copyright Chen, Yi-Cyuan 2014-2023\n * @license MIT\n */\n(function () {\n 'use strict';\n\n var INPUT_ERROR = 'input is invalid type';\n var FINALIZE_ERROR = 'finalize already called';\n var WINDOW = typeof window === 'object';\n var root = WINDOW ? window : {};\n if (root.JS_MD5_NO_WINDOW) {\n WINDOW = false;\n }\n var WEB_WORKER = !WINDOW && typeof self === 'object';\n var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;\n if (NODE_JS) {\n root = global;\n } else if (WEB_WORKER) {\n root = self;\n }\n var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;\n var AMD = typeof define === 'function' && define.amd;\n var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';\n var HEX_CHARS = '0123456789abcdef'.split('');\n var EXTRA = [128, 32768, 8388608, -2147483648];\n var SHIFT = [0, 8, 16, 24];\n var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];\n var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n var blocks = [], buffer8;\n if (ARRAY_BUFFER) {\n var buffer = new ArrayBuffer(68);\n buffer8 = new Uint8Array(buffer);\n blocks = new Uint32Array(buffer);\n }\n\n var isArray = Array.isArray;\n if (root.JS_MD5_NO_NODE_JS || !isArray) {\n isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n }\n\n var isView = ArrayBuffer.isView;\n if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !isView)) {\n isView = function (obj) {\n return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n };\n }\n\n // [message: string, isString: bool]\n var formatMessage = function (message) {\n var type = typeof message;\n if (type === 'string') {\n return [message, true];\n }\n if (type !== 'object' || message === null) {\n throw new Error(INPUT_ERROR);\n }\n if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n return [new Uint8Array(message), false];\n }\n if (!isArray(message) && !isView(message)) {\n throw new Error(INPUT_ERROR);\n }\n return [message, false];\n }\n\n /**\n * @method hex\n * @memberof md5\n * @description Output hash as hex string\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} Hex string\n * @example\n * md5.hex('The quick brown fox jumps over the lazy dog');\n * // equal to\n * md5('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method digest\n * @memberof md5\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.digest('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method array\n * @memberof md5\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.array('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method arrayBuffer\n * @memberof md5\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.arrayBuffer('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method buffer\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\n * @memberof md5\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.buffer('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method base64\n * @memberof md5\n * @description Output hash as base64 string\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} base64 string\n * @example\n * md5.base64('The quick brown fox jumps over the lazy dog');\n */\n var createOutputMethod = function (outputType) {\n return function (message) {\n return new Md5(true).update(message)[outputType]();\n };\n };\n\n /**\n * @method create\n * @memberof md5\n * @description Create Md5 object\n * @returns {Md5} Md5 object.\n * @example\n * var hash = md5.create();\n */\n /**\n * @method update\n * @memberof md5\n * @description Create and update Md5 object\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Md5} Md5 object.\n * @example\n * var hash = md5.update('The quick brown fox jumps over the lazy dog');\n * // equal to\n * var hash = md5.create();\n * hash.update('The quick brown fox jumps over the lazy dog');\n */\n var createMethod = function () {\n var method = createOutputMethod('hex');\n if (NODE_JS) {\n method = nodeWrap(method);\n }\n method.create = function () {\n return new Md5();\n };\n method.update = function (message) {\n return method.create().update(message);\n };\n for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n var type = OUTPUT_TYPES[i];\n method[type] = createOutputMethod(type);\n }\n return method;\n };\n\n var nodeWrap = function (method) {\n var crypto = require('crypto')\n var Buffer = require('buffer').Buffer;\n var bufferFrom;\n if (Buffer.from && !root.JS_MD5_NO_BUFFER_FROM) {\n bufferFrom = Buffer.from;\n } else {\n bufferFrom = function (message) {\n return new Buffer(message);\n };\n }\n var nodeMethod = function (message) {\n if (typeof message === 'string') {\n return crypto.createHash('md5').update(message, 'utf8').digest('hex');\n } else {\n if (message === null || message === undefined) {\n throw new Error(INPUT_ERROR);\n } else if (message.constructor === ArrayBuffer) {\n message = new Uint8Array(message);\n }\n }\n if (isArray(message) || isView(message) ||\n message.constructor === Buffer) {\n return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');\n } else {\n return method(message);\n }\n };\n return nodeMethod;\n };\n\n /**\n * @namespace md5.hmac\n */\n /**\n * @method hex\n * @memberof md5.hmac\n * @description Output hash as hex string\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} Hex string\n * @example\n * md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');\n * // equal to\n * md5.hmac('key', 'The quick brown fox jumps over the lazy dog');\n */\n\n /**\n * @method digest\n * @memberof md5.hmac\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method array\n * @memberof md5.hmac\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method arrayBuffer\n * @memberof md5.hmac\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method buffer\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\n * @memberof md5.hmac\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method base64\n * @memberof md5.hmac\n * @description Output hash as base64 string\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} base64 string\n * @example\n * md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');\n */\n var createHmacOutputMethod = function (outputType) {\n return function (key, message) {\n return new HmacMd5(key, true).update(message)[outputType]();\n };\n };\n\n /**\n * @method create\n * @memberof md5.hmac\n * @description Create HmacMd5 object\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @returns {HmacMd5} HmacMd5 object.\n * @example\n * var hash = md5.hmac.create('key');\n */\n /**\n * @method update\n * @memberof md5.hmac\n * @description Create and update HmacMd5 object\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {HmacMd5} HmacMd5 object.\n * @example\n * var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');\n * // equal to\n * var hash = md5.hmac.create('key');\n * hash.update('The quick brown fox jumps over the lazy dog');\n */\n var createHmacMethod = function () {\n var method = createHmacOutputMethod('hex');\n method.create = function (key) {\n return new HmacMd5(key);\n };\n method.update = function (key, message) {\n return method.create(key).update(message);\n };\n for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n var type = OUTPUT_TYPES[i];\n method[type] = createHmacOutputMethod(type);\n }\n return method;\n };\n\n /**\n * Md5 class\n * @class Md5\n * @description This is internal class.\n * @see {@link md5.create}\n */\n function Md5(sharedMemory) {\n if (sharedMemory) {\n blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n this.blocks = blocks;\n this.buffer8 = buffer8;\n } else {\n if (ARRAY_BUFFER) {\n var buffer = new ArrayBuffer(68);\n this.buffer8 = new Uint8Array(buffer);\n this.blocks = new Uint32Array(buffer);\n } else {\n this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n }\n }\n this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;\n this.finalized = this.hashed = false;\n this.first = true;\n }\n\n /**\n * @method update\n * @memberof Md5\n * @instance\n * @description Update hash\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Md5} Md5 object.\n * @see {@link md5.update}\n */\n Md5.prototype.update = function (message) {\n if (this.finalized) {\n throw new Error(FINALIZE_ERROR);\n }\n\n var result = formatMessage(message);\n message = result[0];\n var isString = result[1];\n var code, index = 0, i, length = message.length, blocks = this.blocks;\n var buffer8 = this.buffer8;\n\n while (index < length) {\n if (this.hashed) {\n this.hashed = false;\n blocks[0] = blocks[16];\n blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n }\n\n if (isString) {\n if (ARRAY_BUFFER) {\n for (i = this.start; index < length && i < 64; ++index) {\n code = message.charCodeAt(index);\n if (code < 0x80) {\n buffer8[i++] = code;\n } else if (code < 0x800) {\n buffer8[i++] = 0xc0 | (code >>> 6);\n buffer8[i++] = 0x80 | (code & 0x3f);\n } else if (code < 0xd800 || code >= 0xe000) {\n buffer8[i++] = 0xe0 | (code >>> 12);\n buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);\n buffer8[i++] = 0x80 | (code & 0x3f);\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n buffer8[i++] = 0xf0 | (code >>> 18);\n buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);\n buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);\n buffer8[i++] = 0x80 | (code & 0x3f);\n }\n }\n } else {\n for (i = this.start; index < length && i < 64; ++index) {\n code = message.charCodeAt(index);\n if (code < 0x80) {\n blocks[i >>> 2] |= code << SHIFT[i++ & 3];\n } else if (code < 0x800) {\n blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else if (code < 0xd800 || code >= 0xe000) {\n blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n }\n }\n }\n } else {\n if (ARRAY_BUFFER) {\n for (i = this.start; index < length && i < 64; ++index) {\n buffer8[i++] = message[index];\n }\n } else {\n for (i = this.start; index < length && i < 64; ++index) {\n blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];\n }\n }\n }\n this.lastByteIndex = i;\n this.bytes += i - this.start;\n if (i >= 64) {\n this.start = i - 64;\n this.hash();\n this.hashed = true;\n } else {\n this.start = i;\n }\n }\n if (this.bytes > 4294967295) {\n this.hBytes += this.bytes / 4294967296 << 0;\n this.bytes = this.bytes % 4294967296;\n }\n return this;\n };\n\n Md5.prototype.finalize = function () {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n var blocks = this.blocks, i = this.lastByteIndex;\n blocks[i >>> 2] |= EXTRA[i & 3];\n if (i >= 56) {\n if (!this.hashed) {\n this.hash();\n }\n blocks[0] = blocks[16];\n blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n }\n blocks[14] = this.bytes << 3;\n blocks[15] = this.hBytes << 3 | this.bytes >>> 29;\n this.hash();\n };\n\n Md5.prototype.hash = function () {\n var a, b, c, d, bc, da, blocks = this.blocks;\n\n if (this.first) {\n a = blocks[0] - 680876937;\n a = (a << 7 | a >>> 25) - 271733879 << 0;\n d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;\n d = (d << 12 | d >>> 20) + a << 0;\n c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;\n c = (c << 17 | c >>> 15) + d << 0;\n b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;\n b = (b << 22 | b >>> 10) + c << 0;\n } else {\n a = this.h0;\n b = this.h1;\n c = this.h2;\n d = this.h3;\n a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;\n b = (b << 22 | b >>> 10) + c << 0;\n }\n\n a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;\n b = (b << 20 | b >>> 12) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[5] - 378558;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[8] - 2022574463;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[11] + 1839030562;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[14] - 35309556;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[1] - 1530992060;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[4] + 1272893353;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[7] - 155497632;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[10] - 1094730640;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[13] + 681279174;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[0] - 358537222;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[3] - 722521979;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[6] + 76029189;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[9] - 640364487;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[12] - 421815835;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[15] + 530742520;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[2] - 995338651;\n b = (b << 23 | b >>> 9) + c << 0;\n a += (c ^ (b | ~d)) + blocks[0] - 198630844;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[7] + 1126891415;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[14] - 1416354905;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[5] - 57434055;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[12] + 1700485571;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[3] - 1894986606;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[10] - 1051523;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[1] - 2054922799;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[8] + 1873313359;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[15] - 30611744;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[6] - 1560198380;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[13] + 1309151649;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[4] - 145523070;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[11] - 1120210379;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[2] + 718787259;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[9] - 343485551;\n b = (b << 21 | b >>> 11) + c << 0;\n\n if (this.first) {\n this.h0 = a + 1732584193 << 0;\n this.h1 = b - 271733879 << 0;\n this.h2 = c - 1732584194 << 0;\n this.h3 = d + 271733878 << 0;\n this.first = false;\n } else {\n this.h0 = this.h0 + a << 0;\n this.h1 = this.h1 + b << 0;\n this.h2 = this.h2 + c << 0;\n this.h3 = this.h3 + d << 0;\n }\n };\n\n /**\n * @method hex\n * @memberof Md5\n * @instance\n * @description Output hash as hex string\n * @returns {String} Hex string\n * @see {@link md5.hex}\n * @example\n * hash.hex();\n */\n Md5.prototype.hex = function () {\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\n\n return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +\n HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +\n HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +\n HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +\n HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +\n HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +\n HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +\n HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +\n HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +\n HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +\n HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +\n HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +\n HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +\n HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +\n HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +\n HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];\n };\n\n /**\n * @method toString\n * @memberof Md5\n * @instance\n * @description Output hash as hex string\n * @returns {String} Hex string\n * @see {@link md5.hex}\n * @example\n * hash.toString();\n */\n Md5.prototype.toString = Md5.prototype.hex;\n\n /**\n * @method digest\n * @memberof Md5\n * @instance\n * @description Output hash as bytes array\n * @returns {Array} Bytes array\n * @see {@link md5.digest}\n * @example\n * hash.digest();\n */\n Md5.prototype.digest = function () {\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\n return [\n h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,\n h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,\n h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,\n h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF\n ];\n };\n\n /**\n * @method array\n * @memberof Md5\n * @instance\n * @description Output hash as bytes array\n * @returns {Array} Bytes array\n * @see {@link md5.array}\n * @example\n * hash.array();\n */\n Md5.prototype.array = Md5.prototype.digest;\n\n /**\n * @method arrayBuffer\n * @memberof Md5\n * @instance\n * @description Output hash as ArrayBuffer\n * @returns {ArrayBuffer} ArrayBuffer\n * @see {@link md5.arrayBuffer}\n * @example\n * hash.arrayBuffer();\n */\n Md5.prototype.arrayBuffer = function () {\n this.finalize();\n\n var buffer = new ArrayBuffer(16);\n var blocks = new Uint32Array(buffer);\n blocks[0] = this.h0;\n blocks[1] = this.h1;\n blocks[2] = this.h2;\n blocks[3] = this.h3;\n return buffer;\n };\n\n /**\n * @method buffer\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\n * @memberof Md5\n * @instance\n * @description Output hash as ArrayBuffer\n * @returns {ArrayBuffer} ArrayBuffer\n * @see {@link md5.buffer}\n * @example\n * hash.buffer();\n */\n Md5.prototype.buffer = Md5.prototype.arrayBuffer;\n\n /**\n * @method base64\n * @memberof Md5\n * @instance\n * @description Output hash as base64 string\n * @returns {String} base64 string\n * @see {@link md5.base64}\n * @example\n * hash.base64();\n */\n Md5.prototype.base64 = function () {\n var v1, v2, v3, base64Str = '', bytes = this.array();\n for (var i = 0; i < 15;) {\n v1 = bytes[i++];\n v2 = bytes[i++];\n v3 = bytes[i++];\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\n BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +\n BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +\n BASE64_ENCODE_CHAR[v3 & 63];\n }\n v1 = bytes[i];\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\n BASE64_ENCODE_CHAR[(v1 << 4) & 63] +\n '==';\n return base64Str;\n };\n\n /**\n * HmacMd5 class\n * @class HmacMd5\n * @extends Md5\n * @description This is internal class.\n * @see {@link md5.hmac.create}\n */\n function HmacMd5(key, sharedMemory) {\n var i, result = formatMessage(key);\n key = result[0];\n if (result[1]) {\n var bytes = [], length = key.length, index = 0, code;\n for (i = 0; i < length; ++i) {\n code = key.charCodeAt(i);\n if (code < 0x80) {\n bytes[index++] = code;\n } else if (code < 0x800) {\n bytes[index++] = (0xc0 | (code >>> 6));\n bytes[index++] = (0x80 | (code & 0x3f));\n } else if (code < 0xd800 || code >= 0xe000) {\n bytes[index++] = (0xe0 | (code >>> 12));\n bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));\n bytes[index++] = (0x80 | (code & 0x3f));\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));\n bytes[index++] = (0xf0 | (code >>> 18));\n bytes[index++] = (0x80 | ((code >>> 12) & 0x3f));\n bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));\n bytes[index++] = (0x80 | (code & 0x3f));\n }\n }\n key = bytes;\n }\n\n if (key.length > 64) {\n key = (new Md5(true)).update(key).array();\n }\n\n var oKeyPad = [], iKeyPad = [];\n for (i = 0; i < 64; ++i) {\n var b = key[i] || 0;\n oKeyPad[i] = 0x5c ^ b;\n iKeyPad[i] = 0x36 ^ b;\n }\n\n Md5.call(this, sharedMemory);\n\n this.update(iKeyPad);\n this.oKeyPad = oKeyPad;\n this.inner = true;\n this.sharedMemory = sharedMemory;\n }\n HmacMd5.prototype = new Md5();\n\n HmacMd5.prototype.finalize = function () {\n Md5.prototype.finalize.call(this);\n if (this.inner) {\n this.inner = false;\n var innerHash = this.array();\n Md5.call(this, this.sharedMemory);\n this.update(this.oKeyPad);\n this.update(innerHash);\n Md5.prototype.finalize.call(this);\n }\n };\n\n var exports = createMethod();\n exports.md5 = exports;\n exports.md5.hmac = createHmacMethod();\n\n if (COMMON_JS) {\n module.exports = exports;\n } else {\n /**\n * @method md5\b\n * @description Md5 hash function, export to global in browsers.\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} md5 hashes\n * @example\n * md5(''); // d41d8cd98f00b204e9800998ecf8427e\n * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6\n * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0\n *\n * // It also supports UTF-8 encoding\n * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07\n *\n * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`\n * md5([]); // d41d8cd98f00b204e9800998ecf8427e\n * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e\n */\n root.md5 = exports;\n if (AMD) {\n define(function () {\n return exports;\n });\n }\n }\n})();\n","function getUint16(buffer, offset = 0) {\n const view = getBufferView(buffer, offset, 2);\n return view.getUint16(0, true);\n}\nfunction getUint32(buffer, offset = 0) {\n const view = getBufferView(buffer, offset, 4);\n return view.getUint32(0, true);\n}\nfunction getString(buffer, offset = 0, length = buffer.byteLength) {\n const slice = buffer.slice(offset, offset + length);\n return decoder.decode(new Uint8Array(slice));\n}\nfunction compareBytes(source, sample, offset = 0) {\n if (source.length < sample.length + offset) {\n return false;\n }\n for (const [i, element] of sample.entries()) {\n if (element === null)\n continue;\n if (element !== source[i + offset]) {\n return false;\n }\n }\n return true;\n}\nfunction getBufferView(buffer, offset, length) {\n const slice = buffer.slice(offset, offset + length);\n return new DataView(new Uint8Array(slice).buffer);\n}\nconst decoder = new TextDecoder(\"utf8\");\n\nconst signatures = [\n [\n \"db\",\n \"application/vnd.sqlite3\",\n [\n 83,\n 81,\n 76,\n 105,\n 116,\n 101,\n 32,\n 102,\n 111,\n 114,\n 109,\n 97,\n 116,\n 32,\n 51,\n 0\n ]\n ],\n [\"woff\", \"font/woff\", [119, 79, 70, 70]],\n [\"woff2\", \"font/woff2\", [119, 79, 70, 50]],\n [\"bmp\", \"image/bmp\", [66, 77]],\n [\"gif\", \"image/gif\", [71, 73, 70, 56, 55, 97]],\n [\"gif\", \"image/gif\", [71, 73, 70, 56, 57, 97]],\n [\n \"heic\",\n \"image/heic\",\n [102, 116, 121, 112, 104, 101, 105],\n { offset: 4 }\n ],\n [\"heic\", \"image/heic\", [102, 116, 121, 112, 109], { offset: 4 }],\n [\"ico\", \"image/x-icon\", [0, 0, 1, 0]],\n [\"jpg\", \"image/jpeg\", [255, 216, 255]],\n [\"pdf\", \"application/pdf\", [37, 80, 68, 70, 45]],\n [\"png\", \"image/png\", [137, 80, 78, 71, 13, 10, 26, 10]],\n [\"7z\", \"application/x-7z-compressed\", [55, 122, 188, 175, 39, 28]],\n [\n \"rar\",\n \"application/x-rar-compressed\",\n [82, 97, 114, 33, 26, 7, 0]\n ],\n [\n \"rar\",\n \"application/x-rar-compressed\",\n [82, 97, 114, 33, 26, 7, 1, 0]\n ],\n [\"rtf\", \"application/rtf\", [123, 92, 114, 116, 102, 49]],\n [\"bz2\", \"application/x-bzip2\", [66, 90, 104]],\n [\"gz\", \"application/gzip\", [31, 139]],\n [\n \"tar\",\n \"application/x-tar\",\n [117, 115, 116, 97, 114, 0, 48, 48],\n { offset: 257 }\n ],\n [\n \"tar\",\n \"application/x-tar\",\n [117, 115, 116, 97, 114, 32, 32, 0],\n { offset: 257 }\n ],\n [\"tif\", \"image/tiff\", [73, 73, 42, 0]],\n [\"tiff\", \"image/tiff\", [77, 77, 0, 42]],\n [\"zip\", \"application/zip\", [80, 75, 3, 4], { exact: false }],\n [\"zip\", \"application/zip\", [80, 75, 5, 6]],\n [\"mp3\", \"audio/mp3\", [255, 251]],\n [\"mp3\", \"audio/mp3\", [255, 243]],\n [\"mp3\", \"audio/mp3\", [255, 242]],\n [\"mp3\", \"audio/mp3\", [73, 68, 51]],\n [\n \"mp4\",\n \"video/mp4\",\n [102, 116, 121, 112, 105, 115, 111, 109],\n { offset: 4 }\n ],\n [\n \"avi\",\n \"video/x-msvideo\",\n [82, 73, 70, 70, null, null, null, null, 65, 86, 73, 32]\n ],\n [\n \"wav\",\n \"audio/wav\",\n [82, 73, 70, 70, null, null, null, null, 87, 65, 86, 69]\n ],\n [\n \"ogx\",\n \"application/ogg\",\n [79, 103, 103, 83],\n { exact: false },\n [\n [\"oga\", \"audio/ogg\", [127, 70, 76, 65, 67], { offset: 28 }],\n [\n \"ogg\",\n \"audio/ogg\",\n [1, 118, 111, 114, 98, 105, 115],\n { offset: 28 }\n ],\n [\n \"ogm\",\n \"video/ogg\",\n [1, 118, 105, 100, 101, 111, 0],\n { offset: 28 }\n ],\n [\n \"ogv\",\n \"video/ogg\",\n [128, 116, 104, 101, 111, 114, 97],\n { offset: 28 }\n ]\n ]\n ],\n [\n \"webp\",\n \"image/webp\",\n [82, 73, 70, 70, null, null, null, null, 87, 69, 66, 80]\n ],\n [\"psd\", \"image/vnd.adobe.photoshop\", [56, 66, 80, 83]],\n [\"flac\", \"audio/x-flac\", [102, 76, 97, 67]],\n [\"wasm\", \"application/wasm\", [0, 97, 115, 109]],\n [\n \"deb\",\n \"application/x-deb\",\n [33, 60, 97, 114, 99, 104, 62, 10]\n ],\n [\"exe\", \"application/x-msdownload\", [77, 90]],\n [\"exe\", \"application/x-msdownload\", [90, 77]],\n [\"class\", \"application/java-vm\", [202, 254, 186, 190]]\n];\n\nfunction isText(data) {\n for (let i = 0; i < data.length; i++) {\n try {\n const code = data.charCodeAt(i);\n if (code === 65533 || code <= 8) {\n return false;\n }\n } catch {\n return false;\n }\n }\n return true;\n}\nfunction parseTxtLikeFiles(buffer) {\n try {\n const data = getString(buffer);\n if (!isText(data)) {\n return void 0;\n }\n try {\n JSON.parse(data);\n return { ext: \"json\", mime: \"application/json\" };\n } catch {\n return { ext: \"txt\", mime: \"text/plain\" };\n }\n } catch {\n return void 0;\n }\n}\n\nfunction getUpperLimit(signatures) {\n return flatten(signatures).map(([_ext, _mime, sample, { offset = 0 } = {}]) => sample.length + offset).reduce((lim, val) => val > lim ? val : lim, 0);\n}\nfunction flatten(signatures) {\n return signatures.flatMap(\n ([ext, mime, bytes, options = {}, subSignatures = []]) => [\n [ext, mime, bytes, options],\n ...subSignatures\n ]\n );\n}\nfunction findMatches(signatures, { ext, mime }) {\n if (!(ext || mime))\n return [];\n return flatten(signatures).filter(\n (signature) => signature[0] === ext || signature[1] === mime\n );\n}\n\nfunction parseZipLikeFiles(buffer, result) {\n const size = getUint16(buffer, 26);\n const name = getString(buffer, 30, size);\n const [identifier] = name.split(\"/\");\n const xmlFormat = name.endsWith(\".xml\");\n if (identifier === \"META-INF\") {\n return {\n ext: \"jar\",\n mime: \"application/java-archive\"\n };\n }\n if (identifier === \"ppt\" && xmlFormat) {\n return {\n ext: \"pptx\",\n mime: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n };\n }\n if (identifier === \"word\" && xmlFormat) {\n return {\n ext: \"docx\",\n mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n };\n }\n if (identifier === \"xl\" && xmlFormat) {\n return {\n ext: \"xlsx\",\n mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n };\n }\n if (identifier === \"mimetype\") {\n return parseOpenDocumentFile(buffer, size) ?? result;\n }\n return result;\n}\nfunction parseOpenDocumentFile(buffer, offset) {\n const compressedSize = getUint32(buffer, 18);\n const uncompressedSize = getUint32(buffer, 22);\n const extraFieldLength = getUint16(buffer, 28);\n if (compressedSize === uncompressedSize) {\n const mime = getString(\n buffer,\n 30 + offset + extraFieldLength,\n compressedSize\n );\n if (mime === \"application/vnd.oasis.opendocument.presentation\") {\n return {\n ext: \"odp\",\n mime\n };\n }\n if (mime === \"application/vnd.oasis.opendocument.spreadsheet\") {\n return {\n ext: \"ods\",\n mime\n };\n }\n if (mime === \"application/vnd.oasis.opendocument.text\") {\n return {\n ext: \"odt\",\n mime\n };\n }\n if (mime === \"application/epub+zip\") {\n return {\n ext: \"epub\",\n mime\n };\n }\n }\n return void 0;\n}\n\nconst UPPER_LIMIT = getUpperLimit(signatures);\nfunction parse(buffer, { extra = false, hint } = {}) {\n const bytes = new Uint8Array(buffer.slice(0, UPPER_LIMIT));\n if (hint) {\n const matches = findMatches(signatures, hint);\n if (matches.length > 0) {\n const result2 = parseBytes(bytes, matches);\n if (result2 !== void 0) {\n return result2;\n }\n }\n }\n const result = parseBytes(bytes, signatures);\n if (result) {\n return result;\n }\n if (extra) {\n return parseExtraTypes(buffer);\n }\n return void 0;\n}\nfunction parseBytes(bytes, signatures) {\n for (const [\n ext,\n mime,\n sample,\n { exact = true, offset = 0 } = {},\n subSignatures = []\n ] of signatures) {\n if (compareBytes(bytes, sample, offset)) {\n if (ext === \"zip\" && !exact) {\n return parseZipLikeFiles(bytes.buffer, { ext, mime });\n }\n if (!exact && subSignatures.length) {\n for (const [ext2, mime2, sample2, { offset: offset2 = 0 } = {}] of subSignatures) {\n if (compareBytes(bytes, sample2, offset2)) {\n return { ext: ext2, mime: mime2 };\n }\n }\n }\n return { ext, mime };\n }\n }\n return void 0;\n}\nfunction parseExtraTypes(buffer) {\n return parseTxtLikeFiles(buffer);\n}\n\nexport { parse };\n","import { md5 } from 'js-md5';\nimport { parse } from \"file-type-mime\";\n\n/**\n * @param {string} str\n * @param {string} search\n * @param {string} replacement\n * @returns {string}\n */\nfunction replaceAll(str, search, replacement) {\n let lastIndex = 0;\n while (true) {\n let index = str.indexOf(search, lastIndex)\n if (index === -1) {\n break;\n }\n lastIndex = index + search.length;\n str = str.replace(search, replacement);\n }\n return str;\n}\n\n/**\n * @param {string} filepath\n * @param {ArrayBuffer} buffer\n * @param {undefined | {type?:string}} opts\n */\nexport function toFile(filepath, buffer, opts = undefined) {\n\n const name = replaceAll(filepath, \"\\\\\", \"/\").split(\"/\").pop() || filepath;\n const mimetype = opts?.type || getFileMimeType(buffer, filepath);\n const file = /** @type { import('../types').FileWithPath } */ (/** @type {unknown} */ (new File([buffer], name, { type: mimetype })));\n file.path = filepath;\n return file;\n}\n\n/**\n * Convert a dataURL to a blob\n * @param {string} dataURL\n * @returns {Blob | null} blob\n */\nexport function dataURLToBlob(dataURL) {\n const BASE64_MARKER = ';base64,';\n if (dataURL.indexOf(BASE64_MARKER) === -1) {\n return null;\n }\n const parts = dataURL.split(BASE64_MARKER);\n const contentType = parts[0].split(':')[1];\n const raw = window.atob(parts[1]);\n const rawLength = raw.length;\n const array = new Uint8Array(new ArrayBuffer(rawLength));\n for (let i = 0; i < raw.length; i++) {\n array[i] = raw.charCodeAt(i);\n }\n return new Blob([array], { type: contentType });\n}\n\n/**\n * Convert a dataURL to a file\n * @param {string} dataURL\n * @param {string} filename\n * @returns {File | null} file\n */\nexport function dataURLToFile(dataURL, filename) {\n const blob = dataURLToBlob(dataURL);\n if (!blob) return null;\n return new File([blob], filename, { type: blob.type });\n\n}\n\n\n/**\n * Get a md5 hash for presigning URLs (S3 content-md5)\n * @param {ArrayBuffer} buffer\n * @returns {string} hash\n */\nexport function hashContentMD5(buffer) {\n const hash = md5.create();\n hash.update(buffer);\n return hash.base64();\n}\n\n/**\n * Create a md5 hash from a string\n * @param {string} str\n */\nexport function hashStringMD5(str) {\n return md5(str);\n}\n\n\n\n/**\n * @param {DataTransfer} datatransfer \n * @returns {Promise<import('../types').FileWithPath[]>} files\n */\nexport async function getAllFiles(datatransfer) {\n /**\n * @type {import('../types').FileWithPath[]}\n */\n const arr = [];\n const items = [];\n if (datatransfer instanceof DataTransfer) {\n for (let i = 0; i < datatransfer.items.length; i++) {\n items.push(datatransfer.items[i]);\n }\n }\n\n const promises = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n const prom = getAllFilesFromDirectory(item, arr);\n promises.push(prom);\n }\n else {\n const _item = items[i];\n if (_item.type == \"text/uri-list\") {\n const prom = new Promise((resolve, reject) => {\n _item.getAsString(async (url) => {\n arr.push({\n path: url,\n name: url.split(\"/\").pop(),\n });\n resolve();\n })\n });\n promises.push(prom);\n }\n }\n }\n await Promise.all(promises);\n return arr;\n}\n\n/**\n * @param {FileSystemEntry | FileSystemDirectoryEntry} fileOrDirectorySystemEntry\n * @param {import('../types').FileWithPath[]} target\n * @returns {Promise<void>}\n */\nasync function getAllFilesFromDirectory(fileOrDirectorySystemEntry, target, path = \"\") {\n\n if (fileOrDirectorySystemEntry.isFile) {\n /** @ts-ignore @type {FileSystemFileEntry} */\n const fe = fileOrDirectorySystemEntry;\n const file = await getFile(fe, path);\n if (file) target.push(file);\n return;\n }\n else if (!fileOrDirectorySystemEntry.isDirectory) {\n console.error(\"Unknown entry type\", fileOrDirectorySystemEntry);\n }\n\n /** @ts-ignore @type {FileSystemDirectoryEntry} */\n const directory = fileOrDirectorySystemEntry;\n path += directory.name + \"/\";\n const reader = directory.createReader();\n return new Promise(async (resolve, reject) => {\n // We need to continue calling readEntries until the length of the result is 0\n while (true) {\n const res = await read().catch(reject);\n if (!res) {\n resolve();\n break;\n }\n }\n });\n\n /**\n * @returns {Promise<boolean>} hasMore\n */\n function read() {\n return new Promise((resolve, reject) => {\n reader.readEntries(async (entries) => {\n if (entries.length <= 0) {\n resolve(false);\n return;\n }\n console.debug(\"Read\", entries.length);\n for (const entry of entries) {\n if (entry.isFile) {\n /** @ts-ignore @type {FileSystemFileEntry} */\n const fe = entry;\n const file = await getFile(fe, path);\n if (file) target.push(file);\n }\n else if (entry.isDirectory) {\n /** @ts-ignore @type {FileSystemDirectoryEntry} */\n const directoryEntry = entry;\n await getAllFilesFromDirectory(directoryEntry, target, path);\n }\n else {\n console.error(\"Unknown entry type\", entry);\n }\n };\n resolve(true);\n }, err => {\n console.error(err);\n reject(err);\n });\n });\n }\n\n /**\n * @param {FileSystemFileEntry} fe\n * @param {string} dir\n * @returns {Promise<import('../types').FileWithPath>}\n */\n function getFile(fe, dir = \"\") {\n return new Promise((resolve, reject) => {\n fe.file(file => {\n resolve(toFileWithPath(file, dir));\n }, err => {\n console.error(err);\n reject(err);\n });\n });\n }\n\n}\n\n\n/**\n * @param {File | import('../types').FileLike} file\n * @param {string | null} dir\n * @returns {import('../types').FileWithPath}\n */\nexport function toFileWithPath(file, dir = null) {\n if (isFileLike(file)) {\n let mimeType = file.mimetype || getFileMimeTypeFromName(file.name);\n file = new File([file.buffer], file.name, { type: mimeType });\n }\n // see Note: https://developer.mozilla.org/en-US/docs/Web/API/Blob/type\n // we need to determine the mimetype for e.g. https://linear.app/needle/issue/NE-6404\n else if (!file.type) {\n file = new File([file], file.name, { type: getFileMimeTypeFromName(file.name) });\n }\n\n const myFile = /** @type {import('../types').FileWithPath} */ ( /** @type {any} */ (file));\n if (dir == null) {\n dir = file.webkitRelativePath || \"\";\n }\n myFile.path = dir + file.name;\n\n return myFile;\n}\n\n/**\n * @param {any} val\n * @returns {val is import('../types').FileLike}\n */\nexport const isFileLike = (val) => typeof val === \"object\" && typeof val.name === \"string\" && typeof val.mimetype === \"string\";\n\n/**\n * @param {FileList} files\n * @returns {Promise<import('../types').FileWithPath[]>} files\n */\nexport async function toFilesWithPath(files) {\n\n /** @type {import('../types').FileWithPath[]} */\n const list = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const prom = toFileWithPath(file);\n list.push(prom);\n }\n return list;\n}\n\n/**\n * Get the file type from the header\n * @param {ArrayBuffer} file\n * @param {string|undefined} filename\n * @returns {string} type\n */\nexport function getFileMimeType(file, filename = undefined) {\n\n const res = parse(file);\n if (res) return res.mime;\n\n const arr = (new Uint8Array(file)).subarray(0, 4);\n let header = \"\";\n for (var i = 0; i < arr.length; i++) {\n header += arr[i].toString(16);\n }\n\n // https://stackoverflow.com/questions/18299806/how-to-check-file-mime-type-with-javascript-before-upload\n // https://en.wikipedia.org/wiki/List_of_file_signatures\n // https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern\n let type = \"unknown\";\n switch (header) {\n case \"676c5446\":\n type = \"model/gltf-binary\";\n break;\n case \"89504e47\":\n type = \"image/png\";\n break;\n case \"ffd8ffe0\":\n case \"ffd8ffe1\":\n case \"ffd8ffe2\":\n case \"ffd8ffe3\":\n case \"ffd8ffe8\":\n type = \"image/jpeg\";\n break;\n default:\n type = \"unknown\"; // Or you can use the blob.type as fallback\n break;\n }\n\n if (type === \"unknown\" && typeof filename === \"string\") {\n type = getFileMimeTypeFromName(filename);\n }\n\n return type\n}\n\n/** \n * @param {string} filename\n */\nexport function getFileMimeTypeFromName(filename) {\n const lcname = filename.toLowerCase();\n let type = \"\";\n if (lcname.endsWith(\".html\")) type = \"text/html\";\n else if (lcname.endsWith(\".html.gz\")) type = \"text/html\"; // even if the file is gzipped we want to deliver the file as html\n else if (lcname.endsWith(\".js\")) type = \"application/javascript\";\n else if (lcname.endsWith(\".js.gz\")) type = \"application/javascript\"; // even if the file is gzipped we want to deliver the file as javascript\n else if (lcname.endsWith(\".wasm\")) type = \"application/wasm\";\n else if (lcname.endsWith(\".css\")) type = \"text/css\";\n else if (lcname.endsWith(\".json\")) type = \"application/json\";\n else if (lcname.endsWith(\".txt\")) type = \"text/plain\";\n else if (lcname.endsWith(\".bin\")) type = \"application/octet-stream\";\n else if (lcname.endsWith(\".png\")) type = \"image/png\";\n else if (lcname.endsWith(\".jpg\") || lcname.endsWith(\".jpeg\")) type = \"image/jpeg\";\n else if (lcname.endsWith(\".gif\")) type = \"image/gif\";\n else if (lcname.endsWith(\".webp\")) type = \"image/webp\";\n else if (lcname.endsWith(\".svg\")) type = \"image/svg+xml\";\n\n // models\n else if (lcname.endsWith(\".glb\")) type = \"model/gltf-binary\";\n else if (lcname.endsWith(\".gltf\")) type = \"model/gltf+json\";\n else if (lcname.endsWith(\".vrm\")) type = \"model/gltf-binary\";\n else if (lcname.endsWith(\".usdz\")) type = \"model/vnd.usdz+zip\";\n else if (lcname.endsWith(\".usda\")) type = \"model/vnd.usd-usda\";\n else if (lcname.endsWith(\".usdc\")) type = \"model/vnd.usd-usdc\";\n else if (lcname.endsWith(\".usd\")) type = \"model/vnd.usd-usd\";\n else if (lcname.endsWith(\".mtl\")) type = \"model/mtl\";\n else if (lcname.endsWith(\".obj\")) type = \"model/obj\";\n else if (lcname.endsWith(\".fbx\")) type = \"model/vnd.autodesk.fbx\";\n else if (lcname.endsWith(\".stl\")) type = \"model/stl\";\n return type;\n}\n\n/**\n * For deployments we need to make sure that the file type is the actual content type and the filename does not contain the .gz or .br extension\n * @link https://linear.app/needle/issue/NE-5525\n * @param {string} filename\n * @param {string} mimetype\n * @returns {{filename:string, mimetype:string} | null}\n */\nexport function getUncompressedFileMimeType(filename, mimetype) {\n\n const nameLowercase = filename.toLowerCase();\n\n if (mimetype === \"application/gzip\" || mimetype === \"application/brotli\") {\n // Make sure the type is the actual content type\n if (nameLowercase.endsWith(\".html.gz\") || nameLowercase.endsWith(\".html.br\")) {\n mimetype = \"text/html\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".js.gz\") || nameLowercase.endsWith(\".js.br\")) {\n mimetype = \"application/javascript\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mjs.gz\") || nameLowercase.endsWith(\".mjs.br\")) {\n mimetype = \"application/javascript\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".cjs.gz\") || nameLowercase.endsWith(\".cjs.br\")) {\n mimetype = \"application/javascript\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".css.gz\") || nameLowercase.endsWith(\".css.br\")) {\n mimetype = \"text/css\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".json.gz\") || nameLowercase.endsWith(\".json.br\")) {\n mimetype = \"text/json\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".txt.gz\") || nameLowercase.endsWith(\".txt.br\")) {\n mimetype = \"text/plain\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".wasm.gz\") || nameLowercase.endsWith(\".wasm.br\")) {\n mimetype = \"application/wasm\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".bin.gz\") || nameLowercase.endsWith(\".bin.br\")) {\n mimetype = \"application/octet-stream\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".png.gz\") || nameLowercase.endsWith(\".png.br\")) {\n mimetype = \"image/png\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".jpg.gz\") || nameLowercase.endsWith(\".jpg.br\") || nameLowercase.endsWith(\".jpeg.gz\") || nameLowercase.endsWith(\".jpeg.br\")) {\n mimetype = \"image/jpeg\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".gif.gz\") || nameLowercase.endsWith(\".gif.br\")) {\n mimetype = \"image/gif\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".webp.gz\") || nameLowercase.endsWith(\".webp.br\")) {\n mimetype = \"image/webp\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".svg.gz\") || nameLowercase.endsWith(\".svg.br\")) {\n mimetype = \"image/svg+xml\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".ico.gz\") || nameLowercase.endsWith(\".ico.br\")) {\n mimetype = \"image/x-icon\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n // VIDEO FILES\n else if (nameLowercase.endsWith(\".webm.gz\") || nameLowercase.endsWith(\".webm.br\")) {\n mimetype = \"video/webm\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mp4.gz\") || nameLowercase.endsWith(\".mp4.br\")) {\n mimetype = \"video/mp4\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mov.gz\") || nameLowercase.endsWith(\".mov.br\")) {\n mimetype = \"video/quicktime\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n\n // AUDIO FILES\n else if (nameLowercase.endsWith(\".mp3.gz\") || nameLowercase.endsWith(\".mp3.br\")) {\n mimetype = \"audio/mpeg\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".wav.gz\") || nameLowercase.endsWith(\".wav.br\")) {\n mimetype = \"audio/wave\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".ogg.gz\") || nameLowercase.endsWith(\".ogg.br\")) {\n mimetype = \"audio/ogg\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".flac.gz\") || nameLowercase.endsWith(\".flac.br\")) {\n mimetype = \"audio/flac\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n\n // MODEL FILES\n else if (nameLowercase.endsWith(\".glb.gz\") || nameLowercase.endsWith(\".glb.br\")) {\n mimetype = \"model/gltf-binary\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".gltf.gz\") || nameLowercase.endsWith(\".gltf.br\")) {\n mimetype = \"model/gltf+json\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".vrm.gz\") || nameLowercase.endsWith(\".vrm.br\")) {\n mimetype = \"model/gltf-binary\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".usdz.gz\") || nameLowercase.endsWith(\".usdz.br\")) {\n mimetype = \"model/vnd.usdz+zip\";\n filename = filename.substring(0, filename.length - 3);\n }\n // TODO: verify....\n // else if (nameLowercase.endsWith(\".fbx.gz\") || nameLowercase.endsWith(\".fbx.br\")) {\n // mimetype = \"model/vnd.autodesk.fbx\";\n // filename = filename.substring(0, filename.length - 3);\n // }\n else if (nameLowercase.endsWith(\".obj.gz\") || nameLowercase.endsWith(\".obj.br\")) {\n mimetype = \"model/obj\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mtl.gz\") || nameLowercase.endsWith(\".mtl.br\")) {\n mimetype = \"model/mtl\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n\n return { filename, mimetype };\n }\n return null;\n}\n\n\n/**\n * Tests if a file has the correct extension and mimetype to be deployed\n * @param {string} filename\n * @param {string} mimetype\n */\nexport function validateFileForDeployment(filename, mimetype) {\n\n if (filename.endsWith(\".html\") || filename.endsWith(\".html.gz\") || filename.endsWith(\".html.br\")) {\n if (mimetype !== \"text/html\") {\n return false;\n }\n }\n else if (filename.endsWith(\".js\") || filename.endsWith(\".js.gz\") || filename.endsWith(\".js.br\")) {\n if (mimetype !== \"text/javascript\" && mimetype !== \"application/javascript\") {\n return false;\n }\n }\n else if (filename.endsWith(\".css\") || filename.endsWith(\".css.gz\") || filename.endsWith(\".css.br\")) {\n if (mimetype !== \"text/css\") {\n return false;\n }\n }\n\n return true;\n}\n\n\n/**\n * @param {string} type\n */\nexport function isglTFOrGLBMimeType(type) {\n return type === \"model/gltf-binary\" || type === \"model/gltf+json\";\n}\n/**\n * @param {string} filename\n */\nexport function hasglTFOrGLBExtension(filename) {\n const lowercaseName = filename.toLowerCase();\n return lowercaseName.endsWith(\".glb\") ||\n lowercaseName.endsWith(\".glb.gz\") || lowercaseName.endsWith(\".glb.br\") ||\n lowercaseName.endsWith(\".gltf\") ||\n lowercaseName.endsWith(\".gltf.gz\") || lowercaseName.endsWith(\".gltf.br\") ||\n lowercaseName.endsWith(\".vrm\") ||\n lowercaseName.endsWith(\".vrm.gz\") || lowercaseName.endsWith(\".vrm.br\");\n}\n\n\n\n/**\n * Takes a file path or directory path and returns the directory path\n * @param {string} path\n */\nexport function getDirectory(path) {\n const str = replaceAll(path, \"\\\\\", \"/\");\n const parts = str.split(\"/\");\n const lastPart = parts[parts.length - 1];\n // check if the last part is a file\n if (lastPart.includes(\".\")) {\n // remove the file part\n parts.pop();\n }\n return parts.join(\"/\");\n}\n\n\n/**\n * @param {string} filename\n * @param {string} newExtension e.g. \".glb\"\n */\nexport function changeExtension(filename, newExtension) {\n return filename.replace(/\\.[^/.]+$/, newExtension);\n}\n\n\n\n/**\n * @param {number} size\n * @param {number | undefined} precision\n */\nexport function toHumanReadableSizeString(size, precision = undefined, postfix = true) {\n const absoluteSize = Math.abs(size);\n if (absoluteSize >= 1024 * 1024 * 1024 * 1024) {\n let pp = postfix ? \" TB\" : \"\";\n const _precision = precision === undefined ? 2 : precision;\n return (size / (1024 * 1024 * 1024 * 1024)).toFixed(_precision) + pp;\n }\n else if (absoluteSize >= 1024 * 1024 * 1024) {\n let pp = postfix ? \" GB\" : \"\";\n const _precision = precision === undefined ? 2 : precision;\n return (size / (1024 * 1024 * 1024)).toFixed(_precision) + pp;\n }\n else if (absoluteSize >= 1024 * 1024) {\n let pp = postfix ? \" MB\" : \"\";\n const _precision = precision === undefined ? 1 : precision;\n return (size / (1024 * 1024)).toFixed(_precision) + pp;\n }\n else if (absoluteSize >= 1024) {\n let pp = postfix ? \" KB\" : \"\";\n const _precision = precision === undefined ? 0 : precision;\n return (size / 1024).toFixed(_precision) + pp;\n }\n let pp = postfix ? \" B\" : \"\";\n return size.toFixed(0) + pp;\n}\n\n\n/**\n * @param {string} str\n */\nexport function removeFilePaths(str) {\n // https://regex101.com/r/kHtERT/1\n const rgx = /(([\\d\\w\\-\\_\\:]+[\\\\|\\/]){2,})/g;\n // @ts-ignore\n return str.replaceAll(rgx, \"\");\n}\n\n\n// export function shortFilePath(str){\n// // https://regex101.com/r/TqFyc6/2\n// const rgx = /[a-zA-Z0-9\\-\\_]*?[\\\\\\/]\\w+\\.\\w{2,5}/g;\n// // remove\n// }\n\n\n\n/**\n * @param {string} path\n */\nexport function resolvePath(path) {\n return path.split('/')\n .reduce((a, v) => {\n if (v === '.') { } // do nothing\n else if (v === '..') a.pop();\n else if (v?.length) a.push(v);\n return a;\n }, [])\n .join('/');\n}","import { compareVersions } from 'compare-versions';\n\n\n/**\n * @param {number} ms\n */\nexport async function delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n\n/**\n * @param {string} str\n */\nexport function emailToDisplayName(str) {\n if (!str) return str;\n str = str.split(\"@\")[0];\n str = str.replace(/[^a-zA-Z0-9]/g, \" \");\n str = str.replace(/\\s+/g, \" \");\n // make first letter after space uppercase\n str = str.split(\" \").map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase()).join(\" \");\n return str;\n}\n\n\n/**\n * @param {string} semver1\n * @param {string} semver2\n */\nexport function compareSemVer(semver1, semver2) {\n return compareVersions(semver1, semver2);\n}\n\n\n/**\n * @param {Date | number} start\n * @param {Date | number} end\n * @param {{allowSimple?:boolean, prefix?:boolean, suffix?:boolean} | undefined} opts\n * @return {string}\n */\nexport function toHumanReadableTimeDifference(start, end, opts = undefined) {\n\n if (start instanceof Date) start = start.getTime();\n if (end instanceof Date) end = end.getTime();\n\n let diff = end - start;\n let isInThePast = diff > 0;\n const allowPrefix = opts?.prefix !== false;\n const prefix = !allowPrefix ? \"\" : isInThePast ? \"\" : \"in \";\n const allowSuffix = opts?.suffix !== false;\n const suffix = !allowSuffix ? \"\" : isInThePast ? \" ago\" : \"\";\n\n if (diff < 0) diff = -diff;\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(months / 12);\n if (years === 1) return `${prefix}1 year${suffix}`;\n if (years > 1) return `${prefix}${Math.floor(years)} years${suffix}`;\n if (months === 1) return `${prefix}1 month${suffix}`;\n if (months > 1) return `${prefix}${Math.floor(months)} months${suffix}`;\n if (days === 1) {\n if (isInThePast && opts?.allowSimple) return `yesterday`;\n return `${prefix}1 day${suffix}`;\n }\n if (days > 1) return `${prefix}${Math.floor(days)} days${suffix}`;\n if (hours === 1) return `${prefix}1 hour${suffix}`;\n if (hours > 1) return `${prefix}${Math.floor(hours)} hours${suffix}`;\n if (minutes === 1) return `${prefix}1 minute${suffix}`;\n if (minutes > 1) return `${prefix}${Math.floor(minutes)} minutes${suffix}`;\n if (opts?.allowSimple) {\n if (seconds < 10) return \"just now\";\n }\n return `${prefix}${seconds.toFixed(0)} seconds${suffix}`;\n}","import { compareSemVer } from \"./utils.js\";\n\n\nconst pipelinePackageName = \"@needle-tools/gltf-build-pipeline\";\nconst npmBaseUrl = \"https://registry.npmjs.org\";\n\n/**\n * @returns {Promise<string>}\n */\nexport async function getLatestPipelineVersion() {\n const url = `${npmBaseUrl}/${pipelinePackageName}`;\n const res = await fetch(url);\n const json = await res.json();\n const latestVersion = json[\"dist-tags\"].latest;\n return latestVersion;\n}\n\n\n/**\n * @param {import(\"../types/index.js\").JobModel} job\n * @returns {string|null}\n */\nfunction getUsedPipelineVersionFromJob(job) {\n if (job.type !== \"optimization\") return null;\n\n\n if (job.meta?.worker.name === \"@needle-tools/gltf-build-pipeline\") {\n const version = job.meta?.worker.version;\n if (version === \"*\") return null;\n return version;\n }\n\n const params = /** @type {import(\"../types/index.js\").OptimizationParameters} */ (job.parameters);\n const version = params.pipeline_version;\n if (version === \"*\") return null;\n return version || null;\n}\n\n\n/**\n * @typedef {{semver:string, index:number}} LatestVersionMapValue\n * This map contains the latest version of each job_parameter key\n * @type {Map<string, LatestVersionMapValue>}\n */\nconst latest_version_map = new Map();\n\n/**\n * @param {import(\"../types/index.js\").JobModel[]} jobs\n * @param {{pipeline_version:string}} opts\n */\nexport function getJobsThatCanBeRunAgain(jobs, opts) {\n\n // opts.pipeline_version = \"1.5.0-alpha.13\";\n\n latest_version_map.clear();\n\n /**\n * @type {import(\"../types/index.js\").JobModel[]}\n */\n const res = new Array();\n\n jobs.filter((job, index, arr) => {\n if (job.type === \"optimization\") {\n if (job.status == \"running\") {\n return false;\n }\n else if (job.status == \"pending\" || job.status == \"new\") {\n return false;\n }\n\n const job_pipeline_version = getUsedPipelineVersionFromJob(job);\n\n const isOld = !job_pipeline_version || compareSemVer(\n opts.pipeline_version,\n job_pipeline_version,\n ) > 0;\n if (isOld) {\n // if this job is using an old pipeline check if we have any other job that has the same input parameters that is using this pipeline\n const jobParamsWithoutPipeline = /** @type {Partial<import(\"../types/index.js\").OptimizationParameters>} */ ({ ...job.parameters });\n delete jobParamsWithoutPipeline.pipeline_version;\n const jobParamsWithoutPipelineStr = JSON.stringify(jobParamsWithoutPipeline);\n for (let k = 0, l = arr.length; k < l; k++) {\n const other = arr[k];\n if (other === job) continue;\n if (other.identifier === job.identifier) continue;\n if (other.type != \"optimization\") continue;\n // compare parameters without pipeline_version\n const otherParams = /** @type {Partial<import(\"../types/index.js\").OptimizationParameters>} */ ({ ...other.parameters });// as Partial<OptimizationParameters>;\n // ignore old jobs that don't have a pipeline version\n if (otherParams.pipeline_version == undefined) continue;\n\n delete otherParams.pipeline_version;\n const otherParamsStr = JSON.stringify(otherParams);\n if (otherParamsStr === jobParamsWithoutPipelineStr) {\n // console.log(\"COMPARE\\n\" + otherParamsStr + \"\\n\" + jobParamsWithoutPipelineStr, other, otherParamsStr === jobParamsWithoutPipelineStr);\n if (compareSemVer(\n opts.pipeline_version,\n ( /** @type {import(\"../types/index.js\").OptimizationParameters} */ (other.parameters)).pipeline_version,\n ) <= 0) {\n return false;\n }\n }\n }\n\n // Now check if there's already a job with the same parameters that was using a newer pipeline version (we only want to run the latest job again)\n\n const key = jobParamsWithoutPipelineStr;\n const index = res.length;\n\n if (!latest_version_map.get(key)) {\n latest_version_map.set(key, { semver: job_pipeline_version ?? \"\", index });\n }\n else {\n const latest = /** @type {LatestVersionMapValue} */ (latest_version_map.get(key));\n const semverCheck = compareSemVer(latest.semver, job_pipeline_version ?? \"\");\n if (semverCheck < 0) {\n // replace the previously added job with the latest one\n console.log(\"REPLACE\", latest.semver, \"with\", job_pipeline_version)\n res[latest.index] = job;\n latest.semver = job_pipeline_version ?? \"\";\n return false;\n }\n else {\n // ignore this job\n return false;\n }\n }\n\n // insert the new job\n res.push(job);\n return true;\n }\n }\n return false;\n });\n\n return res;\n}\n\n\n// https://regex101.com/r/QUJVbm/1\nconst lod_asset_filename_regex = /^image_(?<image_lod>\\d+)_|^mesh_lod_(?<mesh_lod>\\d+)_/;\n\n/**\n * @param {string | null | undefined} filename\n * @returns {boolean}\n */\nexport function isLODAssetFilename(filename) {\n if (!filename) return false;\n if (lod_asset_filename_regex.test(filename)) {\n return true;\n }\n return false;\n}\n\n/**\n * @param {string} filename\n * @returns {number | null}\n */\nexport function getLODAssetLevelFromFilename(filename) {\n const match = lod_asset_filename_regex.exec(filename);\n if (match) {\n const image_lod = match.groups?.image_lod;\n const mesh_lod = match.groups?.mesh_lod;\n if (image_lod) {\n return parseInt(image_lod);\n }\n if (mesh_lod) {\n return parseInt(mesh_lod);\n }\n }\n return null;\n}\n","import { resolvePath } from \"./file.utils.js\";\nimport { isLODAssetFilename } from \"./utils.optimization.js\";\n\n/** \n * @typedef GLTF\n * @property {{generator?:string,version:string,copyright?:string}} asset\n */\n\n/**\n * Validates files if they can be uploaded - e.g. if a glTF file references all resources\n * @param {import(\"../types\").FileWithPath[]} files\n * @returns {Promise<{success:boolean, vrm_count: number, gltf_count: number, glb_count: number} | {error:string}>}\n */\nexport async function validateFiles(files) {\n\n const maxFileNumber = 5_000;\n if (files.length > maxFileNumber) {\n return { success: false, error: `Too many files. Maximum filecount is ${maxFileNumber}` };\n }\n\n let totalSize = 0;\n const maxSizeInTotal = /** 1024 MB */ 1_024 * 1024 * 1024;\n let vrm_files = 0;\n let gltf_files = 0;\n let glb_files = 0;\n let glb_lod_files = 0;\n\n for (let i = files.length - 1; i >= 0; i--) {\n const file = files[i];\n\n totalSize += file.size;\n\n if (totalSize > maxSizeInTotal) {\n return {\n success: false, error: `Total file size exceeds limit of ${(maxSizeInTotal / 1024 / 1024).toFixed(0)} MB. Please reduce the size of your upload.`\n }\n }\n\n const lowercaseFilename = file.name.toLocaleLowerCase();\n if (lowercaseFilename === \".ds_store\") {\n // console.log(\"🚫 Remove .DS_Store file from upload\");\n files.splice(i, 1);\n continue;\n }\n else if (lowercaseFilename.endsWith(\".gltf\")) {\n gltf_files++;\n }\n else if (lowercaseFilename.endsWith(\".glb\")) {\n if (isLODAssetFilename(lowercaseFilename)) {\n glb_lod_files++;\n }\n else\n glb_files++;\n }\n else if (lowercaseFilename.endsWith(\".vrm\")) {\n vrm_files++;\n }\n\n // check if referenced files in the glTF are also included\n if (lowercaseFilename.endsWith(\".gltf\")) {\n gltf_files += 1;\n console.log(`Found glTF file ${file.name}. Will check if all dependencies are available\\n`, files);\n const content = await file.text();\n const uris = content.matchAll(/\"uri\"\\s*:\\s*\"(?<value>.*?)\"/g);\n if (!uris) {\n continue;\n }\n\n /** @type {GLTF} */\n const json = JSON.parse(content);\n if (json.asset.version !== \"2.0\") {\n console.warn(\"⚠ glTF version is not 2.0. This is currently not supported.\");\n return { success: false, error: `glTF version ${json.asset.version} is unsupported.Please use glTF 2.0.` };\n }\n\n const parts = file.path?.split(\"/\");\n const basePath = parts.splice(0, parts.length - 1).join(\"/\");\n for (const uri of uris) {\n const value = uri.groups?.value;\n if (value) {\n // TODO: check that no file is referenced OUTSIDE of the glTF directory\n let found = false;\n\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\") || value.startsWith(\"www.\")) {\n console.log(`✅ Found remote dependency ${value} `);\n break;\n }\n else if (value.startsWith(\"data:\")) {\n console.log(`✅ Found embedded dependency ${value} `);\n break;\n }\n else {\n const resourcePath = resolvePath(`${basePath}/${tryToDecodeFilename(value)}`);\n console.log(\"❓ Check if local dependency exists \\\"\" + resourcePath + \"\\\"\");\n for (const f of files) {\n if (f.webkitRelativePath === resourcePath || f.name == resourcePath) {\n found = true;\n console.log(`✅ Found dependency in name or webkit: ${f.name} || ${f.webkitRelativePath} `);\n break;\n }\n const fileWithPath = /** @type {import(\"../types\").FileWithPath} */ (f);\n if (fileWithPath.path === resourcePath) {\n found = true;\n console.log(`✅ Found dependency in path: ${f.path} `);\n break;\n }\n }\n }\n\n if (!found) {\n console.warn(\"⚠ Missing dependency \" + value, basePath);\n return { success: false, error: \"Missing resource: \" + value };\n }\n }\n }\n }\n }\n\n return {\n success: true,\n vrm_count: vrm_files,\n gltf_count: gltf_files,\n glb_count: glb_files\n };\n}\n\n/**\n * @param {string} filename\n */\nfunction tryToDecodeFilename(filename) {\n if (filename.includes(\"\\\\u\")) {\n return JSON.parse(`\"${filename}\"`);\n }\n return decodeURIComponent(filename);\n}\n\n\n\n/**\n * @param {import(\"../types\").FileWithPath[]} files\n * @returns {import(\"../types\").FileWithPath | {error:string}}\n */\nexport function tryDetermineEntrypoint(files) {\n\n let entryPointFile = null;\n let error = \"\";\n\n // for (const file of files) {\n\n // const ext = file.name.split(\".\").pop();\n // switch (ext?.toLowerCase()) {\n // case \"glb\":\n // case \"gltf\":\n // case \"vrm\":\n // case \"usdz\":\n // entryPointFile = file;\n // break;\n // }\n\n // }\n\n // TODO: this doesnt check if the file is loaded in the root\n const indexHtml = files.filter(f => f.name.toLowerCase() === \"index.html\" || f.name.toLowerCase() === \"index.html.gz\" || f.name.toLowerCase() === \"index.html.br\");\n if (indexHtml.length === 1) {\n entryPointFile = indexHtml[0];\n return entryPointFile;\n }\n // get HTML files\n const htmlFiles = files.filter(f => f.name.toLowerCase().endsWith(\".html\") || f.name.toLowerCase().endsWith(\".htm\") || f.name.toLowerCase().endsWith(\".html.gz\") || f.name.toLowerCase().endsWith(\".html.br\"));\n if (htmlFiles.length === 1) {\n return htmlFiles[0];\n }\n else if (htmlFiles.length > 1) {\n // It's now not really clear anymore which html file should be the entrypoint\n // We will split the files by directories\n // We then take the html files in the shortest directories (this can be the root or a subfolder)\n // If any of them is named index we take that one - otherwise we take the next best one\n /**\n * @type {Map<number, import(\"../types\").FileWithPath[]>}\n */\n const htmlFilesByDirectory = new Map();\n for (const file of htmlFiles) {\n const parts = file.path.split(\"/\");\n let bucket = htmlFilesByDirectory.get(parts.length);\n if (!bucket) {\n bucket = [];\n htmlFilesByDirectory.set(parts.length, bucket);\n }\n bucket.push(file);\n }\n // now we have the html files grouped by their directory depth\n const sortedKeys = Array.from(htmlFilesByDirectory.keys()).sort((a, b) => a - b);\n if (sortedKeys.length > 0) {\n for (const key of sortedKeys) {\n const bucket = htmlFilesByDirectory.get(key);\n if (!bucket) continue;\n // check if any of the files is named index.html\n const indexFile = bucket.find(f => f.name.toLowerCase() === \"index.html\" || f.name.toLowerCase() === \"index.html.gz\" || f.name.toLowerCase() === \"index.html.br\");\n if (indexFile) {\n entryPointFile = indexFile;\n return entryPointFile;\n }\n\n // otherwise just take the first file in this bucket\n entryPointFile = bucket[0];\n return entryPointFile;\n }\n }\n\n error = \"Invalid upload: Multiple HTML files found but could not determine root.\";\n console.error(error, htmlFiles.map(f => f.path || f.name));\n return { error }\n }\n\n const glTF_Files = files.filter(f => f.name.toLowerCase().endsWith(\".glb\") || f.name.toLowerCase().endsWith(\".gltf\") || f.name.toLowerCase().endsWith(\".vrm\"));\n if (glTF_Files.length > 1) {\n const opt = tryFindEntrypointGLTF(glTF_Files);\n if (opt) {\n entryPointFile = opt;\n return entryPointFile;\n }\n\n error = \"Invalid upload: Multiple glb/glTF/vrm files found. This is currently not supported.\";\n console.error(error, glTF_Files.map(f => f.path || f.name));\n return { error }\n }\n else if (glTF_Files.length === 1) {\n entryPointFile = glTF_Files[0];\n return entryPointFile;\n }\n\n\n const usdFiles = files.filter(f => f.name.toLowerCase().endsWith(\".usdz\") || f.name.toLowerCase().endsWith(\".usd\") || f.name.toLowerCase().endsWith(\".usda\") || f.name.toLowerCase().endsWith(\".usdc\"));\n if (usdFiles.length >= 1) {\n entryPointFile = findFileWithShortestPath(usdFiles);\n }\n\n const fbxFiles = files.filter(f => f.name.toLowerCase().endsWith(\".fbx\"));\n if (fbxFiles.length > 1) {\n error = \"Invalid upload: Multiple fbx files found. This is currently not supported.\";\n console.error(error, fbxFiles);\n return { error }\n }\n else if (fbxFiles.length === 1) {\n entryPointFile = fbxFiles[0];\n return entryPointFile;\n }\n\n const objFiles = files.filter(f => f.name.toLowerCase().endsWith(\".obj\"));\n if (objFiles.length > 1) {\n error = \"Invalid upload: Multiple obj files found. This is currently not supported.\";\n console.error(error, objFiles);\n return { error }\n }\n else if (objFiles.length === 1) {\n entryPointFile = objFiles[0];\n return entryPointFile;\n }\n\n const stlFiles = files.filter(f => f.name.toLowerCase().endsWith(\".stl\"));\n if (stlFiles.length > 1) {\n error = \"Invalid upload: Multiple stl files found. This is currently not supported.\";\n console.error(error, stlFiles);\n return { error }\n }\n else if (stlFiles.length === 1) {\n entryPointFile = stlFiles[0];\n return entryPointFile;\n }\n\n // Special case for dropped text/uri-list: there's only one file drop and that is an URL\n if (files.length === 1 && !files[0].arrayBuffer && files[0].path.toLowerCase().startsWith(\"http\")) {\n entryPointFile = files[0];\n return entryPointFile;\n }\n\n const packageJsons = files.filter(f => f.name.toLowerCase().endsWith(\"package.json\"));\n if (packageJsons.length === 1) {\n entryPointFile = packageJsons[0];\n return entryPointFile;\n }\n else if (packageJsons.length > 1) {\n error = \"Invalid upload: Multiple package.json files found. This is currently not supported.\";\n console.error(error, packageJsons);\n return { error }\n }\n\n if (!entryPointFile) {\n return { error: \"No supported file to upload found...\" };\n }\n\n return entryPointFile;\n\n}\n\n/**\n * @param {Array<import(\"../types\").FileLike | File | import(\"../types\").FileWithPath>} files\n */\nexport function containsHtmlFiles(files) {\n return files.some(f => {\n let name = f.name.toLowerCase();\n if (name.endsWith(\".html\") || name.endsWith(\".htm\") || name.endsWith(\".html.gz\") || name.endsWith(\".html.br\")) {\n return true;\n }\n else if (\"mimetype\" in f && f.mimetype === \"text/html\") {\n return true;\n }\n return false;\n })\n}\n\n\n/**\n * @param {import(\"../types\").FileWithPath[]} files\n */\nfunction tryFindEntrypointGLTF(files) {\n // lets ignore all the LOD mesh and texture files because they are never the entrypoint\n const candidates = new Array();\n const lodRegex = /(mesh_lod|image)_\\d_(.{1,50})/; // https://regex101.com/r/v0k6eB/1\n for (const file of files) {\n if (lodRegex.test(file.name)) continue;\n const name = file.name.toLowerCase();\n if (name.endsWith(\".gltf\") || name.endsWith(\".vrm\") || name.endsWith(\".glb\")) {\n candidates.push(file);\n }\n }\n if (candidates.length == 1) {\n return candidates[0];\n }\n return findFileWithShortestPath(candidates);\n}\n\n\n/**\n * @param {import(\"../types\").FileWithPath[]} options\n * @returns {import(\"../types\").FileWithPath | null}\n */\nfunction findFileWithShortestPath(options) {\n let index = -1;\n let shortest = Infinity;\n // TODO: this does currently not take into account that multiple files might have the same length\n // then just one will be chosen (e.g. 2 files at the same level)\n for (let i = 0; i < options.length; i++) {\n const f = options[i];\n if (f.path.split(\"/\").length < shortest) {\n shortest = f.path.split(\"/\").length;\n index = i;\n }\n }\n if (index < 0) return null;\n return options[index];\n}\n\n\n\n","export class UploadEstimator {\n /**\n * @param {number} totalFiles\n * @param {number} estimatedTotalSize\n */\n constructor(totalFiles, estimatedTotalSize) {\n this.totalFiles = totalFiles;\n this.estimatedTotalSize = estimatedTotalSize;\n this.uploadedSize = 0;\n this.startTime = Date.now();\n this.lastUpdateTime = this.startTime;\n this.lastUploadedSize = 0;\n this.speedEMA = null;\n this.emaFactor = 0.1; // Reduced for more stability\n this.smoothedRemainingTime = null;\n this.recentSpeeds = new Array();\n this.maxRecentSpeeds = 20; // Increased for better averaging\n this.initialEstimateThreshold = 0.05; // 5% progress threshold for initial estimate\n }\n\n /**\n * @param {number} totalUploadedSize\n */\n updateProgress(totalUploadedSize) {\n const now = Date.now();\n const timeDiff = (now - this.lastUpdateTime) / 1000; // in seconds\n const newlyUploadedSize = totalUploadedSize - this.lastUploadedSize;\n this.uploadedSize = totalUploadedSize;\n\n if (timeDiff > 0 && newlyUploadedSize > 0) {\n const instantSpeed = newlyUploadedSize / timeDiff;\n this.recentSpeeds.push(instantSpeed);\n if (this.recentSpeeds.length > this.maxRecentSpeeds) {\n this.recentSpeeds.shift();\n }\n const averageRecentSpeed = this.recentSpeeds.reduce((a, b) => a + b, 0) / this.recentSpeeds.length;\n this.speedEMA = this.speedEMA === null ? averageRecentSpeed : (this.emaFactor * averageRecentSpeed + (1 - this.emaFactor) * this.speedEMA);\n }\n\n this.lastUpdateTime = now;\n this.lastUploadedSize = totalUploadedSize;\n\n const progress = this.uploadedSize / this.estimatedTotalSize;\n const elapsedTime = (now - this.startTime) / 1000; // in seconds\n\n // Use EMA speed for estimation, fall back to average speed if EMA is not reliable\n const effectiveSpeed = (this.speedEMA && this.speedEMA > 0) ? this.speedEMA : (this.uploadedSize / elapsedTime);\n\n let remainingTime;\n if (effectiveSpeed > 0) {\n const remainingSize = this.estimatedTotalSize - this.uploadedSize;\n remainingTime = remainingSize / effectiveSpeed;\n } else {\n remainingTime = Infinity;\n }\n\n // Apply smoothing only after initial estimate threshold\n if (progress >= this.initialEstimateThreshold) {\n if (this.smoothedRemainingTime === null) {\n this.smoothedRemainingTime = remainingTime;\n } else {\n const smoothingFactor = 0.1; // Fixed smoothing factor for stability\n this.smoothedRemainingTime = (1 - smoothingFactor) * this.smoothedRemainingTime + smoothingFactor * remainingTime;\n }\n } else {\n // Before threshold, use a simple estimate based on current progress\n this.smoothedRemainingTime = (elapsedTime / progress) - elapsedTime;\n }\n\n // Ensure the estimate is not less than the time to upload at the current speed\n const minRemainingTime = (this.estimatedTotalSize - this.uploadedSize) / effectiveSpeed;\n this.smoothedRemainingTime = Math.max(this.smoothedRemainingTime, minRemainingTime);\n\n return {\n progress: progress * 100,\n estimatedTimeRemaining: Math.round(this.smoothedRemainingTime),\n estimatedTimeRemainingString: this.smoothedRemainingTime > 3 ? this.__formatTime(this.smoothedRemainingTime) : \"few seconds\"\n };\n }\n\n /**\n * @param {number} seconds\n */\n __formatTime(seconds) {\n if (!isFinite(seconds) || seconds > 24 * 60 * 60) return 'Calculating...';\n if (seconds < 60) return `${Math.round(seconds)}sec`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}min`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h ${minutes % 60}min`;\n }\n}","import axios, { CanceledError } from \"axios\";\nimport { updateJobStatus } from \"./api.jobs.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { getFileMimeType, getUncompressedFileMimeType, hashContentMD5, toHumanReadableSizeString } from \"./file.utils.js\";\nimport { delay } from \"./utils.js\";\nimport { tryDetermineEntrypoint, validateFiles } from \"./api.upload.validate.js\";\nimport { createAuthHeaders } from \"./api.auth.js\";\nimport { UploadEstimator } from \"./utils.upload.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\nimport { gzipCompress } from \"./file.archive.js\";\n\n/**\n * @typedef {Object} UploadFilesOptions\n * @property {import(\"../types\").TriggerType} triggered_by\n * @property {import(\"../types\").FileWithPath[]} files\n * @property {import(\"../types\").FileWithPath | undefined} entrypoint\n * @property {boolean | undefined} [experimental]\n * @property {boolean | undefined} [raw]\n */\n\n/**\n * @typedef {Object} UploadFilesResponse\n * @property {true} success If the upload was successful\n * @property {string} id The job id of the upload\n * @property {string} view_id The view id of the upload\n * @property {string | undefined | null} [url] The url of the upload\n * @property {boolean | undefined} uploadSkipped\n * @property {number} filesUploaded The number of files uploaded\n * @property {number} totalSize The total size of the uploaded files in bytes\n * @property {import(\"../types\").JobModel[\"type\"]} type The type of the upload \n */\n\n/**\n * List of currently running upload promises\n * @type {Array<Promise<any>>}\n */\nconst currentUploads = [];\n\n\n/** Is there currently an upload in progress?\n * @returns {boolean}\n */\nexport function isFileUploadInProgress() {\n return currentUploads.length > 0;\n}\n\n// TODO: the following jsdoc should probably be a type definition because we re-use it in multiple places\n/**\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args\n * @param {UploadFilesOptions} data\n * @param {import(\"../types\").UploadFilesOptions | undefined} options\n * @returns {Promise<{success:false, error:string} | UploadFilesResponse>}\n */\nexport async function uploadFiles(args, data, options = undefined) {\n const uploadPromise = internalUploadFiles(args, data, options);\n // register the upload promise to the list of current uploads\n currentUploads.push(uploadPromise);\n const result = await uploadPromise\n // make sure to remove the promise from the list of current uploads\n .finally(() => {\n const index = currentUploads.indexOf(uploadPromise);\n if (index >= 0) {\n currentUploads.splice(index, 1);\n }\n })\n return result;\n}\n\n\n/**\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args\n * @param {UploadFilesOptions} data\n * @param {import(\"../types\").UploadFilesOptions | undefined} options\n * @returns {Promise<{success:false, error:string, status?:number} | UploadFilesResponse>}\n */\nasync function internalUploadFiles(args, data, options = undefined) {\n\n const files = data.files;\n const loglevel = options?.loglevel || \"none\";\n\n if (!files.length) {\n if (loglevel != \"none\") console.error(\"No files to upload\");\n return { success: false, error: \"No files to upload\" };\n }\n\n if (!data.entrypoint) {\n const entrypoint = tryDetermineEntrypoint(files);\n if (entrypoint == null) {\n return { success: false, error: \"No entrypoint file found\" };\n }\n else if (typeof entrypoint === \"object\" && \"error\" in entrypoint) {\n const error = entrypoint;\n return { success: false, error: error.error };\n }\n if (loglevel === \"info\") console.log(\"Entrypoint: \" + entrypoint.name);\n data.entrypoint = entrypoint;\n }\n\n if (data.entrypoint && !files.includes(data.entrypoint)) {\n files.push(data.entrypoint);\n }\n\n const validation = await validateFiles(files);\n if (\"error\" in validation) {\n return { success: false, error: validation.error || \"Failed to validate files\" };\n }\n\n // if the files entrypoint is a HTML files we consider the upload a deployment\n // TODO: perhaps this is something the server should determine/validate\n if (data.entrypoint?.name.endsWith(\".htm\") || data.entrypoint?.name.endsWith(\".html\") || data.entrypoint?.name.endsWith(\".html.gz\") || data.entrypoint?.name.endsWith(\".html.br\")) {\n if (!options) options = {};\n options.type = \"deployment\";\n }\n // TODO: we allow more here again because we want to be able to deplay websites and run optimization. We need to count usage and prevent abuse in a different way\n else if (validation.vrm_count > 10) {\n return {\n success: false,\n error: \"Multiple model files found - this is not supported for asset uploads. Please upload a single model file only.\"\n };\n }\n\n // if we have uncompressed HTML/JS/CSS files we want to gzip them\n if(data.raw) {\n if (loglevel != \"none\") console.warn(\"Raw upload - skipping gzip compression of files\");\n }\n else {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const lowercaseName = file.name.toLowerCase();\n if (lowercaseName.endsWith(\".html\") || lowercaseName.endsWith(\".js\") || lowercaseName.endsWith(\".css\")) {\n if (options?.loglevel !== \"none\") console.log(`gZip compressing file: ${file.name}`);\n const compressedFile = await gzipCompress(file).catch(e => {\n return { error: `Error compressing ${file.name}: ${e.message}` }\n });\n if (compressedFile === null) {\n if (options?.loglevel !== \"none\") console.error(`Did not compress file: ${file.name}`);\n continue;\n }\n if (\"error\" in compressedFile) {\n return { success: false, error: compressedFile.error, status: 500 };\n }\n else if (!compressedFile) {\n return { success: false, error: `Failed to compress ${file.name}`, status: 500 };\n }\n const isEntrypoint = data.entrypoint === file;\n files[i] = compressedFile;\n if (isEntrypoint) {\n data.entrypoint = compressedFile;\n }\n if (options?.loglevel !== \"none\") console.log(`gZip compressed file: ${file.name} ${isEntrypoint ? \"(entrypoint)\" : \"\"}`);\n }\n }\n }\n\n // sort files so that `.needle` files are uploaded first\n files.sort((a, b) => {\n if (a.name.includes(\".needle\") && !b.name.includes(\".needle\")) return -1;\n if (!a.name.includes(\".needle\") && b.name.includes(\".needle\")) return 1;\n return 0;\n });\n\n const { baseUrl, authToken } = args;\n const authHeader = \"Bearer \" + authToken;\n /** @type {import(\"../types\").UploadBeginRequestHeaders} */\n const beginUploadHeaders = {\n ...createAuthHeaders(args),\n triggered_by: data.triggered_by,\n filename: `${encodeURIComponent(data.entrypoint.name)}`,\n \"total-files\": files.length.toString(),\n \"total-files-size\": files.reduce((acc, f) => acc + f.size, 0).toString(),\n }\n if (options?.view_id) {\n beginUploadHeaders.view_id = options.view_id;\n }\n if (options?.type) {\n beginUploadHeaders.type = options.type;\n }\n if (options?.name) {\n // ONLY pass in a name if it is explictly set. Otherwise the upload might be associated with a wrong view (since we use this name to find the view that this upload belongs to)\n beginUploadHeaders.name = encodeURIComponent(options.name);\n }\n if (options?.parent_job_id) {\n beginUploadHeaders.parent_job_id = options.parent_job_id;\n }\n\n /**\n * @type { import(\"../types\").UploadBeginRequestBody}\n */\n const beginRequestBody = {\n results: {\n entrypoint: data.entrypoint?.path || data.entrypoint?.name,\n files: [],\n }\n }\n /** @type {Array<ArrayBuffer>} */\n const fileBuffers = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n let fileName = file.path || file.webkitRelativePath || file.name;\n if (fileName?.includes(\":\")) {\n throw new Error(`Invalid filename: ${fileName}`);\n }\n\n let fileBuffer = await file.arrayBuffer();\n\n const filesize = file.size;\n let filetype = file.type;\n // If we don't have a file type\n if (!filetype?.length || filetype.toLowerCase() === \"unknown\") {\n filetype = getFileMimeType(fileBuffer, fileName);\n }\n\n // for a deployment we need to make sure to set the content type to the original file type\n if (options?.type === \"deployment\") {\n const uncompressedName = getUncompressedFileMimeType(fileName, filetype);\n if (uncompressedName) {\n fileName = uncompressedName.filename;\n filetype = uncompressedName.mimetype\n }\n }\n\n const md5 = hashContentMD5(fileBuffer);\n fileBuffers[i] = fileBuffer;\n beginRequestBody.results.files[i] = {\n filename: fileName,\n content_type: filetype,\n content_length: filesize,\n content_md5: md5,\n };\n }\n\n\n const res = await fetch(baseUrl + ShareApiEndpoints.upload.request, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: beginUploadHeaders,\n body: JSON.stringify(beginRequestBody),\n }).catch(err => {\n if (err.message == \"fetch failed\" || err.message == \"Failed to fetch\") {\n return `Network error. Make sure you are connected to the internet and ${baseUrl} is reachable.`;\n }\n console.error(\"Failed to begin upload\\n\", err);\n return null;\n });\n if (res === null || typeof res === \"string\") {\n return { success: false, error: res || \"Failed to begin upload\" };\n }\n if (!res.ok) {\n const text = await res.text();\n if (text.startsWith(\"{\")) {\n const json = JSON.parse(text);\n if (\"error\" in json) {\n return { success: false, status: res.status, error: json.error };\n }\n }\n if (loglevel != \"none\") console.error(\"Failed to begin upload\\n\", res.status, text);\n return { success: false, status: res.status, error: `${text}` };\n }\n\n /** @type { import(\"../types\").UploadBeginResponse} */\n const beginResponse = await res.json();\n if (loglevel === \"debug\") console.debug(\"BeginResponse\", beginResponse);\n\n const totalBytes = files.reduce((acc, f) => acc + f.size, 0);\n\n if (beginResponse.type === \"exists\") {\n if (loglevel != \"none\") console.log(\"Upload already exists\", beginResponse.id);\n return {\n success: true,\n uploadSkipped: true,\n id: beginResponse.id,\n type: beginResponse.job_type,\n view_id: beginResponse.view_id,\n filesUploaded: files.length,\n totalSize: totalBytes,\n url: beginResponse.url,\n };\n }\n\n const entrypointPath = data.entrypoint.webkitRelativePath || data.entrypoint.name;\n\n let uploadedBytes = 0;\n\n options?.abort?.addEventListener(\"abort\", async () => {\n console.log(\"Upload aborted: Cancelling upload\");\n await fetch(baseUrl + ShareApiEndpoints.upload.cancel, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: {\n authorization: authHeader,\n id: beginResponse.id,\n }\n });\n });\n\n /** This is set after a successful upload to ensure no async file upload that *might* be tangling is interfering */\n let uploadHasCompletedSuccessfully = false;\n let lastStatusUpdate = Date.now();\n /**\n * @param {string} message\n * @param {import(\"../types\").JobStatus} status\n */\n function updateStatus(message, status, force = false) {\n if (!force && Date.now() - lastStatusUpdate < 1000) return false;\n // safeguard to not override the status if it is already completed\n if (uploadHasCompletedSuccessfully && status !== \"completed\") {\n if (loglevel != \"none\") console.warn(\"Invalid status update...\");\n return;\n }\n lastStatusUpdate = Date.now();\n const progress = Math.floor(uploadedBytes / totalBytes * 100);\n if (loglevel === \"debug\") console.log(\"SET STATUS: \" + status, message, progress);\n updateJobStatus({\n identifier: beginResponse.id,\n status,\n status_message: message,\n progress,\n }, args);\n return true;\n }\n\n if (options?.onStart) {\n options.onStart(beginResponse.id, beginResponse.view_id);\n }\n\n const startTime = Date.now();\n const uploadEstimator = new UploadEstimator(files.length, totalBytes / 1024 / 1024);\n\n /** @type {Array<Promise<any>>} */\n const queue = new Array();\n const maxParallelUploads = 10;\n let anyUploadFailed = false;\n const filesCopy = [...files];\n const filesCount = files.length;\n for (let i = 0; i < filesCopy.length; i++) {\n if (options?.abort?.aborted) {\n console.debug(\"Upload aborted\");\n break;\n }\n else if (anyUploadFailed) {\n console.debug(\"Upload failed\");\n break;\n }\n if (queue.length < maxParallelUploads) {\n const file = files[i];\n console.debug(`Uploading file ${i}/${files.length}: ${file.name}`);\n let uploaded = 0;\n let lastUploaded = 0;\n const registeredFile = beginRequestBody.results.files[i];\n const fileName = registeredFile.filename;\n const fileBuffer = fileBuffers[i];\n const fileSize = registeredFile.content_length;\n const filetype = registeredFile.content_type;\n const originalFile = files[i];\n const contentEncoding = originalFile.name.endsWith(\".gz\") ? \"gzip\" : originalFile.name.endsWith(\".br\") ? \"br\" : undefined;\n const promise = performUpload({\n uploadId: beginResponse.id,\n uploadRequestPUTUrl: beginResponse.request_put_url,\n entrypointPath,\n file: files[i],\n fileName: fileName,\n fileMd5: registeredFile.content_md5,\n fileBuffer: fileBuffer,\n fileType: filetype,\n content_encoding: contentEncoding,\n fileSize,\n fileIndex: i,\n fileNumber: i + 1,\n fileCount: filesCount,\n loglevel,\n experimental: data.experimental,\n args,\n options,\n onProgress: progressEvent => {\n const fileProgress01 = progressEvent.progress || 0;\n uploaded = files[i].size * fileProgress01;\n const diff = uploaded - lastUploaded;\n lastUploaded = uploaded;\n uploadedBytes += diff;\n if (options?.progress) {\n const progress01 = uploadedBytes / totalBytes;\n const totalFiles = files.length;\n const fileSize = files[i].size;\n // let timeLeft = progressEvent.estimated ? \" (\" + progressEvent.estimated.toFixed(0) + \" seconds remaining)\" : \"\";\n const timePassedInSeconds = (Date.now() - startTime) / 1000;\n const estimation = uploadEstimator.updateProgress(uploadedBytes / 1024 / 1024);\n options.progress({\n uploadedBytes, totalBytes, progress01, fileName: files[i].name, fileSize, fileProgress01, fileIndex: i, totalFiles,\n estimatedTimeLeftDisplay: estimation.estimatedTimeRemainingString,\n estimatedTimeLeft: estimation.estimatedTimeRemaining,\n elapsedTime: timePassedInSeconds,\n });\n updateStatus(`Uploading file ${i + 1}/${totalFiles} (${fileName}): ${(fileProgress01 * 100).toFixed(0)}% of ${toHumanReadableSizeString(totalBytes)}. Finished in approx. ${estimation.estimatedTimeRemainingString}`,\n \"running\", false);\n }\n },\n }).then(_res => {\n if (_res !== true) {\n return _res;\n }\n for (let i = queue.length - 1; i >= 0; i--) {\n if (queue[i] === promise) {\n queue.splice(i, 1);\n }\n }\n let sizeString = toHumanReadableSizeString(uploadedBytes) + \" of \" + toHumanReadableSizeString(totalBytes);\n updateStatus(`Uploaded ${sizeString} for ${files[i].name}`, \"running\");\n }).catch(e => {\n if (options?.abort?.aborted) {\n console.warn(\"Upload aborted\");\n return;\n }\n console.error(e.message);\n anyUploadFailed = true;\n });\n queue.push(promise);\n }\n if (queue.length >= maxParallelUploads) {\n await Promise.race(queue);\n }\n }\n\n await Promise.all(queue).catch(e => {\n if (options?.abort?.aborted) {\n console.warn(\"Upload aborted\");\n return;\n }\n console.error(e.message);\n anyUploadFailed = true;\n });\n if (anyUploadFailed) {\n await updateJobStatus({\n identifier: beginResponse.id,\n status: \"failed\",\n error: \"Failed to upload files\",\n }, args);\n return { success: false, error: \"Failed to upload files\" };\n }\n if (options?.abort?.aborted) {\n await updateJobStatus({\n identifier: beginResponse.id,\n status: \"canceled\",\n status_message: \"Upload aborted\",\n error: \"Upload aborted\",\n }, args);\n return { success: false, error: \"Upload aborted\" };\n }\n\n uploadHasCompletedSuccessfully = true;\n\n console.log(`Upload Done: All files uploaded to ${beginResponse.id}`);\n /** @type {import(\"../types\").UploadDoneRequestHeaders}*/\n const doneRequestHeaders = {\n ...createAuthHeaders(args),\n id: beginResponse.id,\n }\n if (loglevel != \"none\") console.log(\"Completing upload - notify server\");\n\n /** @type {Response | null} */\n let doneResponse = null;\n const maxRetriesDone = 5;\n\n for (let i = 0; i < maxRetriesDone; i++) {\n await delay(i * 1000);\n const timeout = AbortSignal.timeout(20_000 + i * 1000);\n doneResponse = await fetch(baseUrl + ShareApiEndpoints.upload.done, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: doneRequestHeaders,\n signal: timeout,\n }).catch((e) => {\n console.error(`Failed to complete upload (${i + 1} / ${maxRetriesDone})`, e.message);\n return null;\n });\n // If the response is ok, we can break the loop\n if (doneResponse?.ok === true) {\n break;\n }\n if (loglevel != \"none\" && i < maxRetriesDone - 1) {\n console.warn(`Failed to complete upload (${doneResponse?.status || \"no status\"}): will retry in 1 second`);\n }\n }\n\n if (!doneResponse) {\n console.error(\"Failed to complete upload\");\n return { success: false, error: \"Failed to complete upload\" };\n }\n if (!doneResponse.ok) {\n if (doneResponse.status === 524) {\n console.error(\"Failed to complete upload: Gateway Timeout\");\n return { success: false, error: \"Failed to complete upload: Gateway Timeout\" };\n }\n else {\n const text = await doneResponse.text();\n console.error(`Failed to complete upload (${doneResponse.status}): ${text}`);\n return { success: false, error: \"Failed to complete upload\" };\n }\n }\n\n if (loglevel != \"none\") console.log(\"Upload complete\");\n\n /**\n * @type {import(\"../types\").UploadDoneRequestResponse}\n */\n const doneResponseJson = await doneResponse.json();\n return {\n success: true,\n type: doneResponseJson.type,\n uploadSkipped: false,\n id: doneResponseJson.id,\n view_id: doneResponseJson.view_id,\n url: doneResponseJson.url,\n filesUploaded: files.length,\n totalSize: totalBytes,\n };\n}\n\n\n\n\n/**\n * @param {{\n * uploadId:string,\n * uploadRequestPUTUrl:string,\n * entrypointPath:string,\n * file:import(\"../types\").FileWithPath,\n * fileName:string,\n * fileMd5:string,\n * fileBuffer:ArrayBuffer,\n * fileType:string,\n * fileSize:number,\n * fileNumber: number,\n * fileIndex:number,\n * fileCount:number,\n * content_encoding: undefined | \"gzip\" | \"br\",\n * loglevel: import(\"../types\").LogLevel,\n * args: {baseUrl:string} & import(\"../types\").AuthData,\n * options: import(\"../types\").UploadFilesOptions | undefined,\n * experimental: boolean | undefined,\n * onProgress: (evt:import(\"axios\").AxiosProgressEvent) => void,\n * }} params\n * @return {Promise<boolean>}\n */\nasync function performUpload(params) {\n const {\n uploadId,\n uploadRequestPUTUrl,\n entrypointPath,\n file,\n fileName,\n fileBuffer,\n fileMd5,\n fileSize,\n fileType,\n content_encoding,\n fileIndex,\n fileNumber,\n fileCount,\n loglevel,\n args,\n options,\n experimental,\n\n } = params;\n\n\n if (loglevel === \"info\") console.log(`Uploading file \\\"${file.name}\\\" type=${fileType} (${fileSize}) ${file.type} with hash ${fileMd5}`);\n /** @type {import(\"../types\").RequestPresignedUrlRequestHeaders} */\n const requestPresignedUrlHeaders = {\n ...createAuthHeaders(args),\n \"Content-Type\": \"application/json\",\n org: args.org,\n job_id: uploadId,\n filesize: fileSize.toString(),\n progress: (fileIndex / fileCount * 100).toFixed(0),\n }\n\n /**\n * @type {import(\"../types\").RequestPresignedUrlRequestBody}\n */\n const requestPresignedUrlBody = {\n filename: fileName,\n entrypoint: entrypointPath,\n \"content-type\": fileType,\n \"content-md5\": fileMd5,\n \"content-encoding\": content_encoding,\n }\n\n if (loglevel === \"debug\") {\n console.debug(\"Requesting presigned URL with headers\", requestPresignedUrlHeaders);\n }\n\n const jsonBody = JSON.stringify(requestPresignedUrlBody);\n\n /**\n * @type {null | import(\"../types\").RequestPutUrlResponse}\n */\n let json = null;\n let uploadErrorText = \"\";\n\n\n for (let k = 0; k < 5; k++) {\n if (json != null) break;\n if (options?.abort?.aborted) {\n throw new Error(\"Upload aborted\");\n }\n await delay(200 * k);\n json = await fetch(uploadRequestPUTUrl, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: requestPresignedUrlHeaders,\n body: jsonBody,\n }).then(async res => {\n if (!res.ok) {\n uploadErrorText = await res.text();\n const url = uploadRequestPUTUrl;\n console.log(url);\n console.warn(`Failed to get presigned url for \\\"${fileName}\\\" \\\"${fileType}\\\" (${res.status}).\\n→ Retrying...`);\n return null;\n }\n return await res.json();\n }).catch(err => {\n uploadErrorText = err.message;\n console.warn(\"Failed to get presigned url \" + err.message + \", retrying...\");\n return null;\n });\n }\n if (json == null) {\n throw new Error(`Failed to get presigned url for \\\"${fileName}\\\" \\\"${fileType}\\\" \\n${uploadErrorText}`);\n }\n\n const putUrl = json.presigned_url;\n var didUpload = false;\n /** @type {string | null} */\n let uploadError = null;\n for (let k = 0; k < 5; k++) {\n if (k > 0) {\n if (loglevel !== \"none\") console.log(`Retry PUT #${k} for file ${fileName}`);\n await delay(1000 * k);\n }\n if (options?.abort?.aborted) {\n throw new CanceledError(\"Upload aborted\");\n }\n /** @type {Record<string, string>} */\n const headers = {\n \"Content-Type\": fileType,\n \"Content-MD5\": fileMd5,\n }\n if (experimental) {\n headers[\"Content-Length\"] = fileSize.toString();\n }\n if (content_encoding) {\n headers[\"Content-Encoding\"] = content_encoding;\n }\n if (k === 0) {\n if (loglevel != \"none\") console.log(`Uploading file ${fileNumber}/${fileCount}: ${fileName}`);\n // else console.debug(`Uploading file ${fileNumber}/${fileCount}: ${fileName}`);\n }\n if (loglevel === \"debug\") {\n console.debug(\"PUT with headers\", headers);\n }\n const putResponse = await axios.put(putUrl, fileBuffer, {\n ...DEFAULT_FETCH_INIT,\n withCredentials: false,\n signal: options?.abort,\n headers,\n onUploadProgress: (progressEvent) => {\n params.onProgress(progressEvent);\n }\n }).catch((e) => {\n uploadError = e.message;\n if (!(e instanceof CanceledError)) {\n if (loglevel !== \"none\") {\n console.error(`Failed to upload file (PUT) (${fileNumber}, ${fileName}) \\\"${e.message}\\\"`);\n }\n if (loglevel === \"debug\") {\n console.log(headers, { fileSize });\n if (e.response) console.debug(e.response);\n else console.debug(e);\n }\n }\n return null;\n });\n if (!putResponse) {\n continue;\n }\n else if (putResponse.status !== 200) {\n uploadError = `${putResponse.statusText} (${putResponse.status})`;\n console.debug(`Failed (${putResponse.status} ${putResponse.status}) to upload file ${file.name} to \\\"${json.path}\\\". Retrying...`);\n continue;\n }\n else {\n didUpload = true;\n if (loglevel === \"info\") console.log(`Uploaded file ${fileNumber}/${fileCount} \"${fileName}\" (${fileType}, ${toHumanReadableSizeString(fileSize)})`);\n // else console.debug(`Uploaded file ${fileNumber}/${fileCount} \"${fileName}\" (${fileType}, ${toHumanReadableSizeString(fileSize)})`);\n break;\n }\n }\n if (!didUpload) {\n console.error(\"Failed to upload file \" + fileName);\n await updateJobStatus({\n identifier: uploadId,\n status: \"failed\",\n status_message: `Failed to upload file (${fileName}): ${uploadError?.substring(0, 200)}`,\n error: \"Failed to upload file \" + fileName,\n }, args);\n throw new Error(\"Failed to upload file \" + fileName);\n }\n\n return true;\n}","import { toFile } from \"./file.utils.js\";\n\n/**\n * @param {File | import(\"../types\").FileWithPath} file\n */\nexport function isZipFile(file) {\n return file.name.endsWith(\".zip\") ||\n file.type === \"application/zip\" ||\n file.type === \"application/x-zip-compressed\";\n}\n\n/**\n * Unzip all zip files found in an array of files - the unzipped files will be added to the array\n * @param {Array<File | import(\"../types\").FileWithPath>} files\n * @returns {Promise<{zipFiles:string[], files:Array<import(\"../types\").FileWithPath | File>}>}\n */\nexport async function unzipAllArchivesAndMerge(files) {\n const res = {\n zipFiles: Array(),\n files: files,\n }\n for (let i = res.files.length - 1; i >= 0; i--) {\n const file = res.files[i];\n if (isZipFile(file)) {\n const filesInZip = await unzipArchive(file);\n if (filesInZip) {\n res.zipFiles.push(file.name);\n res.files.splice(i, 1, ...filesInZip);\n }\n }\n }\n return res;\n}\n\n/**\n * @param {File | import(\"../types\").FileWithPath} file\n * @returns {Promise<null | import(\"../types\").FileWithPath[]>}\n */\nexport async function unzipArchive(file) {\n if (!file) {\n return null;\n }\n /**\n * @type {import(\"../types\").FileWithPath[]}\n */\n const result = [];\n const mod = await import(\"unzipit\");\n const array = await file.arrayBuffer();\n const { entries } = await mod.unzip(array);\n for (const [name, entry] of Object.entries(entries)) {\n const buffer = await entry.arrayBuffer();\n const file = toFile(entry.name, buffer);\n result.push(file);\n }\n return result;\n}\n\n\n/**\n * @param {File | import(\"../types\").FileWithPath} file\n * @returns {Promise<import(\"../types\").FileWithPath | null | {error:string}>}\n */\nexport async function gzipCompress(file) {\n const pako = await import(\"pako\");\n const inputArray = await file.arrayBuffer();\n const compUint = pako.gzip(new Uint8Array(inputArray));\n const compArr = compUint.buffer.slice(0);\n // if the file has at least 50 KB and gzip compression turns out larger\n if (compArr.byteLength > 1024 * 50 && compArr.byteLength >= inputArray.byteLength) {\n if (inputArray.byteLength > 0) // when compressing an empty file\n return null;\n }\n else if (!(compArr instanceof ArrayBuffer)) {\n console.error(\"gzipCompress: Invalid ArrayBuffer\");\n return { error: `Gzip compressing failed for \\\"${file.name}\\\" (unexpected result)` };\n }\n const name = \"path\" in file ? file.path : file.name;\n return toFile(`${name}.gz`, compArr, {\n type: \"application/gzip\",\n });\n}","import { MemoryCache } from \"../../needle-share/utils/cache.js\";\nimport { emailToDisplayName } from \"./utils.js\";\n\n/**\n * @type {Array<{access_token:string, expires_at:number}>}\n */\nconst m2mAccessTokens = new Array();\n\n/**\n * @type {Promise<string> | null}\n */\nlet accessTokenPromise = null;\n/**\n * Request a new access token from logto for querying the logto API\n * @return {Promise<string>}\n */\nexport function getLogtoM2MAccessToken() {\n if (accessTokenPromise) {\n return accessTokenPromise;\n }\n accessTokenPromise = internalRequestM2MAccessToken();\n accessTokenPromise.finally(() => {\n accessTokenPromise = null;\n });\n return accessTokenPromise;\n}\n\n/**\n * @return {Promise<string>}\n */\nasync function internalRequestM2MAccessToken() {\n for (const token of m2mAccessTokens) {\n if (token.expires_at > Date.now()) {\n return token.access_token;\n }\n }\n m2mAccessTokens.length = 0;\n const tokenEndpoint = process.env.LOGTO_ENDPOINT + \"/oidc/token\";\n const username = process.env.LOGTO_APP_ID_M2M;\n const password = process.env.LOGTO_APP_SECRET_M2M;\n const resource = \"https://default.logto.app/api\";\n console.log(`[Logto API] Requesting a new access token for Logto API`);\n const body = {\n grant_type: \"client_credentials\",\n resource,\n scope: \"all\"\n }\n\n const res = await fetch(tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \"Basic \" + Buffer.from(username + \":\" + password).toString(\"base64\")\n },\n body: JSON.stringify(body)\n }).catch(e => {\n console.error(\"[Logto API]\", e);\n return null;\n });\n\n if (res == null || !res.ok) {\n if (res) console.error(\"[Logto API]\", res.status, await res?.text());\n throw new Error(\"Failed to get access token\");\n }\n\n console.log(`[Logto API] Received a new access token for Logto API`)\n\n /**\n * @type {{access_token:string, expires_in:number, token_type:\"Bearer\"}}\n */\n const json = await res.json();\n const expires_at = Date.now() + (json.expires_in * 1000);\n m2mAccessTokens.push({ access_token: json.access_token, expires_at });\n return json.access_token;\n}\n\n\n\n\n/**\n * @param {string} user_id\n * @param {string} accessToken\n * @param {object} customData\n * @returns {Promise<boolean>}\n */\nexport async function updateLogtoUserCustomData(user_id, accessToken, customData) {\n const logtoUrl = `${process.env.LOGTO_ENDPOINT}/api/users/${user_id}/custom-data`;\n const response = await fetch(logtoUrl, {\n method: \"PATCH\",\n headers: {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n customData: customData\n })\n }).catch(err => {\n return { error: err.message, status: 500 }\n })\n if (\"error\" in response) {\n console.error(\"Failed to update user custom data\", response.error);\n return false;\n }\n return response.ok;\n}\n\n\n\n/**\n * @param {string} userId\n * @returns {Promise<import(\"../types/logto.js\").LogtoOrganization[] | null>}\n */\nexport async function getOrganizationsForUser(userId) {\n const url = `${process.env.LOGTO_ENDPOINT}/api/users/${userId}/organizations`;\n const accessToken = await getLogtoM2MAccessToken();\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Authorization\": \"Bearer \" + accessToken\n }\n }).catch(e => {\n console.error(\"Failed to get organizations for user\", e);\n return null;\n });\n\n if (res?.ok) {\n /** @type {import(\"../types/logto.js\").LogtoOrganization[]} */\n const body = await res.json();\n return body;\n }\n return null;\n}\n\n\nconst organizationIdsCache = new MemoryCache({ default_expiration: 1000 * 60 * 5 }); // cache for 5 minute\n\n/**\n * @param {string} userId\n * @returns {Promise<string[]>}\n */\nexport async function getOrganizationsIdsForUser(userId, allowCache = true) {\n if (allowCache) {\n const cached = organizationIdsCache.tryGet(userId);\n if (cached) return cached;\n }\n const orgs = await getOrganizationsForUser(userId);\n const ids = orgs?.map(o => o.id) || [];\n organizationIdsCache.add(userId, ids);\n return ids;\n}\n\n\n\n\n/**\n * @param {string} orgId the organisation id \n * @param {undefined | { max: number }} opts\n * @link https://openapi.logto.io/operation/operation-get-api-organizations-parameter-users\n * @returns {Promise<null | Array<import(\"../types/logto.js\").OrganizationMember>>} the list of users in the organisation\n */\nexport async function getOrganisationUsers(orgId, opts = undefined) {\n\n const pageSize = opts?.max ? Math.min(Math.max(1, opts.max), 100) : 20;\n const url = `${process.env.LOGTO_ENDPOINT}/api/organizations/${orgId}/users?page=1&page_size=${pageSize}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n return { error: e.message, status: 500 }\n });\n\n if (\"error\" in res) {\n console.error(\"Failed to get organisation users\", res.error);\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n /** See https://openapi.logto.io/operation/operation-get-api-organizations-parameter-users\n * @type {Array<import(\"../types/logto.js\").OrganizationMember>}\n */\n const body = await res.json().catch(e => {\n console.error(\"Failed to parse response\", e);\n return null;\n });\n if (body.length >= 100) {\n console.warn(\"More than 100 users in the organization, pagination not implemented\");\n }\n return body;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-get-api-organization-invitations\n * @param {string} orgId the organisation id\n * @param {undefined | { pending_only?:boolean }} opts\n * @returns {Promise<Array<import(\"../types/logto.js\").OrgUserInvitation> | null>} the list of invitations\n */\nexport async function getOrganisationInvitations(orgId, opts = undefined) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations?organizationId=${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n });\n\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n let body = /** @type {Array<import(\"../types/logto.js\").OrgUserInvitation>} */ (await res.json());\n\n if (opts?.pending_only === true) {\n body = body.filter(inv => inv.status === \"Pending\");\n }\n\n return body;\n}\n\n/**\n * @link https://openapi.logto.io/operation/operation-get-api-organization-invitations-parameter\n * @param {string} invitationId \n * @returns \n */\nexport async function getOrganisationInvitation(invitationId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations/${invitationId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n });\n\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n const body = await res.json();\n return body;\n}\n\n// Current org template roles from https://auth.admin.cloud.needle.tools/console/organization-template/organization-roles\n\n/**\n * @type {Record<import(\"../types/logto.js\").OrgRoleName, string>}\n */\nconst roles = {\n \"guest\": \"1lxn40ssa30tgh5uci6or\",\n \"member\": \"omtpqeh9r2904ey2l7aeq\",\n \"manage\": \"sun5lg4leibleblceh6ml\",\n \"owner\": \"bmb0iscycu8bu8pit9way\",\n \"billing-manager\": \"h9i21zcn9n8vth0awoq7a\",\n}\n\n/**\n * @param {import(\"../types/logto.js\").OrganizationRole} role\n */\nexport function isPaidOrgMember(role) {\n switch (role.id) {\n case \"omtpqeh9r2904ey2l7aeq\": // member\n case \"sun5lg4leibleblceh6ml\": // manage\n case \"bmb0iscycu8bu8pit9way\": // owner\n return true;\n }\n return false;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-createorganizationinvitation\n * @param {string} userId the inviter id\n * @param {string} userName the inviter name\n * @param {string} orgId the organisation id\n * @param {string} orgName the organisation name\n * @param {string} email the email of the invitee\n * @param {string | URL} emailLink the email link\n * @param {import(\"../types/logto.js\").OrgRoleName | undefined} role the new role of the invitee. \"guest\" | \"member\" | \"manage\" | \"owner\"\n * @returns {Promise<{error:string} | import(\"../types/logto.js\").OrganizationInvitation>} the invitation\n */\nexport async function postOrganisationInvitation(userId, userName, orgId, orgName, email, emailLink, role) {\n if (!role) {\n console.debug(\"No role specified, defaulting to guest\");\n role = \"guest\"\n }\n const roleId = roles[role];\n if (!roleId) {\n console.error(\"Invalid role\", role);\n return { error: \"invalid role\" }\n }\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations?organizationId=${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n }\n const expiresAt = Date.now() + 1000 * 60 * 60 * 24 * 7; // valid for 7 days\n const body = {\n inviterId: userId,\n invitee: email,\n organizationId: orgId,\n expiresAt,\n organizationRoleIds: [roleId],\n messagePayload: {\n user_name: userName,\n org_name: orgName,\n link: emailLink,\n },\n };\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const error = await res.json();\n if (error.code == \"entity.unique_integrity_violation\") {\n return { error: \"User already invited\" };\n }\n else if (error.code == \"entity.not_found\") {\n return { error: \"User not found\" };\n }\n console.log(res.status, error);\n return { error: error.message };\n }\n /** @type {import(\"../types/logto.js\").OrganizationInvitation} */\n const responseBody = await res.json();\n return responseBody;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-delete-api-organization-invitations-parameter\n * @param {string} invitationId the invitation id\n * @returns {Promise<{error:string} | true>} whether the deletion was successful\n */\nexport async function deleteOrganisationInvitation(invitationId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations/${invitationId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n }\n const res = await fetch(url, {\n method: \"DELETE\",\n headers,\n });\n if (!res.ok) {\n const error = await res.json();\n console.log(\"Delete organisation invitation\", invitationId, res.status, error);\n return {\n error\n };\n }\n return true;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-post-api-organization-invitations-parameter-message\n * @param {string} invitationId the invitation id\n * @returns {Promise<null | boolean>} whether the resend was successful\n */\nexport async function resendOrganisationInvitation(invitationId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations/${invitationId}/message`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"POST\",\n headers\n });\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n return true;\n}\n\n/**\n * @param {string} orgId the organisation id \n * @link https://openapi.logto.io/operation/operation-get-api-organizations-parameter\n * @returns {Promise<null | { status: number, error: string } | import(\"../types/logto.js\").LogtoOrganization>} the organization\n */\nexport async function getOrganization(orgId) {\n\n const url = process.env.LOGTO_ENDPOINT + `/api/organizations/${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(\"Error getting org\", e);\n return null;\n });\n\n if (!res) {\n return null;\n }\n\n if (!res.ok) {\n const error = await res.text();\n return { status: res.status, error: error };\n }\n\n /**\n * @type {import(\"../types/logto.js\").LogtoOrganization}\n */\n const body = await res.json();\n return body;\n}\n\n/**\n * \n * @param {string} orgId \n * @param {string} userId \n * @returns {Promise<{error:string} | {success:boolean}>}\n */\nexport async function removeMemberFromOrganization(orgId, userId) {\n\n const url = `${process.env.LOGTO_ENDPOINT}/api/organizations/${orgId}/users/${userId}`;\n console.log(\"REMOVE USER\", url);\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n }\n const response = await fetch(url, {\n method: \"DELETE\",\n headers,\n });\n if (!response.ok) {\n const error = await response.text();\n console.log(response.status, error);\n return { error };\n }\n console.log(\"Removed user from organization\", response.status, response.statusText);\n return { success: true };\n}\n\n\n/**\n * @link https://openapi.logto.io/operation/operation-replaceorganizationuserroles\n * @param {string} orgId the organization id\n * @param {string} userId the user id\n * @param {import(\"../types/logto.js\").OrgRoleName[]} roleNames the role names\n * @returns {Promise<{error:string} | {success:boolean}>}\n */\nexport async function updateMemberRoleInOrganization(orgId, userId, roleNames) {\n const url = `${process.env.LOGTO_ENDPOINT}/api/organizations/${orgId}/users/${userId}/roles`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n };\n const body = JSON.stringify({\n organizationRoleIds: roleNames.map(role => roles[role])\n });\n const res = await fetch(url, {\n method: \"PUT\",\n headers,\n body\n });\n if (!res.ok) {\n console.log(res.status, await res.text());\n return { error: \"Failed to update user roles\" };\n }\n console.log(\"Updated user roles\", userId, roleNames);\n return { success: true };\n}\n\n\n/**\n * Allows adjusting name/description of an organization\n * @param {string} orgId organization id\n * @param {{name?: string, description?: string | null, customData?: any}} opts \n * @returns \n */\nexport async function updateOrganization(orgId, opts) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organizations/${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n }\n\n const body = JSON.stringify({\n id: orgId,\n ...opts\n });\n\n const res = await fetch(url, {\n method: \"PATCH\",\n headers,\n body\n });\n\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n const responseBody = await res.json();\n return responseBody;\n}\n\n\n\n\n\n/**\n * @link https://openapi.logto.io/operation/operation-get-api-users-parameter\n * \n * @param {string} userId the user id\n * @returns {Promise<null | import(\"../types/logto.js\").LogtoUser>} the user\n */\nexport async function getUser(userId) {\n\n const url = process.env.LOGTO_ENDPOINT + `/api/users/${userId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(e);\n return null;\n });\n if (res == null) {\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n const user = await res.json();\n return user;\n}\n\n/**\n * @param {{email?:string} | {domain?:string}} options\n * @link https://docs.logto.io/user-management/advanced-user-search\n * @returns {Promise<null | import(\"../types/logto.js\").LogtoUser[]>} the user\n */\nexport async function searchUser(options) {\n const url = new URL(process.env.LOGTO_ENDPOINT + `/api/users`);\n if (\"email\" in options && options.email) {\n url.searchParams.set(\"search.primaryEmail\", options.email);\n }\n if (\"domain\" in options && options.domain) {\n url.searchParams.set(\"search.primaryEmail\", `%${options.domain}`);\n }\n\n if (url.searchParams.size === 0) {\n console.error(\"Can not search user: No search parameters provided\");\n return null;\n }\n\n url.searchParams.set(\"page_size\", \"100\");\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n Authorization: \"Bearer \" + accessToken\n };\n // console.log(\"Searching user by email\", email, url.toString());\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(e);\n return null;\n });\n if (res == null) {\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n const users = await res.json();\n return users;\n}\n\n/**\n * @link https://openapi.logto.io/operation/operation-get-api-users-parameter-roles\n * @param {string} userId the user id\n * @returns {Promise<null | Array<{id:string, name:string, description:string, type:\"User\"}>>} the user roles\n */\nexport async function getUserRoles(userId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/users/${userId}/roles`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(e);\n return null;\n });\n if (res == null) {\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n const roles = await res.json();\n return roles;\n}\n\n/**\n * @link https://openapi.logto.io/operation/operation-post-api-users-parameter-roles\n * @param {string} userId the user id\n * @param {string | string[]} roleId the role id\n * @returns {Promise<{error:string} | true>} whether the role was added\n */\nexport async function addUserRole(userId, roleId) {\n\n const url = process.env.LOGTO_ENDPOINT + `/api/users/${userId}/roles`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n };\n const roleIds = Array.isArray(roleId) ? roleId : [roleId];\n const body = JSON.stringify({\n roleIds: roleIds\n });\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body\n }).catch(e => {\n console.error(e);\n return { error: e.message }\n });\n if (res == null) {\n return { error: \"Failed to add user role\" };\n }\n else if (\"error\" in res) {\n return res;\n }\n if (!res.ok) {\n const error = await res.text();\n console.log(res.status, error);\n return { error };\n }\n console.log(\"Added user role\", userId, roleId);\n return true;\n}\n\n/**\n * @param {string} userId the user id\n */\nconst userIdToNameCache = new Map();\n\n/**\n * @param {string} userId the user id\n * @returns {Promise<string | null>} the username\n */\nexport async function getUserName(userId) {\n if (userIdToNameCache.has(userId)) {\n return userIdToNameCache.get(userId);\n }\n const user = await getUser(userId);\n if (user == null) {\n return null;\n }\n let name = user.username;\n if (!name) name = user.name;\n if (!name) name = user.profile?.preferredUsername;\n if (!name) name = emailToDisplayName(user.primaryEmail);\n\n if (name) name = name.trim();\n userIdToNameCache.set(userId, name);\n\n return name;\n}\n\n\n/**\n * @param {string[]} userIds the user ids\n * @returns {Promise<{[userId:string]:string | null}>} the user names\n */\nexport async function getUserNames(userIds) {\n const names = await Promise.all(userIds.map(getUserName));\n /** @type {any} */\n const result = {};\n for (let i = 0; i < userIds.length; i++) {\n result[userIds[i]] = names[i];\n }\n return result;\n}","import { Auth } from \"../auth\";\n\n\n/**\n * @param {string | null | undefined} [org]\n * @returns {Promise<import(\"../web.types\").AuthData>}\n */\nexport async function getAuthHeader(org) {\n return Auth.requestAccessToken(org).then(token => {\n return {\n authToken: token,\n org: org || undefined,\n }\n })\n}","import { uploadFiles as sdk_uploadFiles, toFileWithPath } from \"@needle-tools/cloud-sdk\";\nimport { api_endpoint } from \"../../constants.js\";\nimport { getAuthHeader } from \"./utils.js\";\n\n/**\n * @typedef {{ name: string, mimetype: string, buffer:Buffer }} Filelike\n * @typedef {import(\"../web.types.js\").AuthData} AuthData\n */\n\n/**\n * @param {Array<Filelike>} files\n * @param {{org?:string|null} & { name?:string, abort?:AbortSignal, }} opts\n * @returns {Promise<{error:string} | {job_id:string, view_id:string, url?:string | null, skipped?:boolean}>}\n */\nexport async function uploadFiles(files, opts) {\n\n const auth = await getAuthHeader(opts.org);\n if(!auth) { throw new Error(\"Not authenticated\"); }\n\n const content = files.map(f => toFileWithPath(f));\n\n return sdk_uploadFiles({\n baseUrl: api_endpoint,\n ...auth,\n ...opts,\n }, {\n triggered_by: \"web\",\n entrypoint: undefined,\n files: content,\n }, {\n name: opts.name,\n abort: opts.abort\n }).then(res => {\n if (\"error\" in res) {\n return { error: res.error };\n }\n return {\n job_id: res.id,\n view_id: res.view_id,\n url: res.url,\n skipped: res.uploadSkipped,\n }\n });\n}\n","import { listUploads as sdk_listUploads } from \"@needle-tools/cloud-sdk\";\nimport { api_endpoint } from \"../../constants.js\";\nimport { listDeployments } from \"../../list.js\";\nimport { getAuthHeader } from \"./utils.js\";\n\n/**\n * Unfortunately this doesnt get properly bundles in the final output so we have to write the types below directly\n * @typedef {import(\"@needle-tools/cloud-sdk/types\").JobType} JobType\n * @typedef {import(\"@needle-tools/cloud-sdk/types\").JobStatus} JobStatus \n */\n\n\n\n/**\n * @param {{ org?:string } & ({ name?: string, view_id?:string } | { page: number, limit: number })} opts\n * @returns {Promise<Array<import(\"../web.types.js\").Upload>>}\n */\nexport async function getUploads(opts) {\n\n const auth = await getAuthHeader(opts.org);\n if (!auth) throw new Error(\"Not authenticated\");\n\n if (\"limit\" in opts) {\n opts.limit = Math.min(100, opts.limit);\n }\n\n const isPaged = \"page\" in opts || \"limit\" in opts;\n const baseUrl = api_endpoint;\n return sdk_listUploads({\n baseUrl,\n ...auth,\n ...opts\n }, {\n view_name: \"name\" in opts ? opts.name : undefined,\n view_id: \"view_id\" in opts ? opts.view_id : undefined,\n type: \"upload\",\n page: isPaged ? opts.page : 1,\n limit: isPaged ? opts.limit : 100\n }\n ).then(res => {\n const list = res.uploads;\n return list.map(upload => {\n return {\n name: upload.name,\n created_at: upload.created_time,\n updated_at: upload.updated_time,\n thumbnail_url: upload.thumbnail_url,\n files: upload.jobs.map(job => {\n return {\n created_at: job.created_at,\n updated_at: job.updated_at || job.created_at,\n type: job.type,\n status: job.status,\n name: job.name,\n url: job.url,\n size: job.size,\n // parameter: {\n // job.parameter?.\n // }\n }\n })\n }\n })\n })\n}\n\n\n\n\n/**\n * @param {{ org?:string } & { offset?:number, limit?: number }} opts\n * @returns {Promise<Array<Deployment>>}\n * @typedef {{ name: string, url: string }} Deployment\n */\nexport async function getDeployments(opts) {\n\n const auth = await getAuthHeader(opts.org);\n if (!auth) throw new Error(\"Not authenticated\");\n\n const res = await listDeployments({\n endpoint: api_endpoint,\n ...auth,\n offset: opts.offset || 0,\n limit: opts.limit || 10\n }).catch(err => err);\n\n if (!res || res instanceof Error) {\n return [];\n }\n\n /** @type {import(\"@needle-tools/cloud-sdk/types\").ListDeploymentsResponseBody} */\n const data = res;\n\n return data.deployments.map(deployment => {\n return {\n name: deployment.name,\n url: deployment.url\n }\n });\n}\n\n\n\n\nimport { getLicenses as _getLicenses } from \"@needle-tools/cloud-sdk\"\nimport { Licenses } from \"../auth.config.js\";\n\n\n/**\n * Get licenses for a specific user. A product type is optional. \n * Only valid licenses are returned\n * @param {{product?:string | string[], includeInvalid?: boolean}} opts\n * @returns {Promise<null | import(\"../../../../needle-share/types/stripe.js\").License[]>}\n */\nexport async function getUserLicenses(opts) {\n const auth = await getAuthHeader();\n if (!auth) return null;\n\n const productsArr = Array.isArray(opts.product) ? opts.product : [opts.product];\n productsArr.push(...Licenses.NeedlePro);\n\n const licensesPromise = _getLicenses({\n baseUrl: api_endpoint,\n ...auth,\n }, {\n type: \"user\",\n \"x-needle-product\": productsArr.join(\",\"),\n })\n return licensesPromise.then(res => {\n if (opts.includeInvalid === true) return res;\n return res.filter(entry => entry.valid);\n })\n}\n\n\n/**\n * Checks if the current user owns a specific product. A product type is optional\n * @param {{product?:string | string[]}} opts\n * @returns {Promise<boolean>}\n */\nexport async function ownsProduct(opts) {\n const auth = await getAuthHeader();\n if (!auth) return false;\n\n const productsArr = Array.isArray(opts.product) ? opts.product : [opts.product];\n productsArr.push(...Licenses.NeedlePro);\n\n const licensesPromise = _getLicenses({\n baseUrl: api_endpoint,\n ...auth,\n }, {\n type: \"user\",\n \"x-needle-product\": productsArr.join(\",\"),\n })\n return licensesPromise.then(res => {\n for (const entry of res) {\n if (entry.valid) {\n return true;\n }\n }\n return false;\n })\n}","import { createAuthHeaders, ShareApiEndpoints } from \"@needle-tools/cloud-sdk\";\nimport { api_endpoint } from \"./constants\";\n\n\n/**\n * \n * @param {{endpoint:string, authToken:string, org?:string | null, limit:number, offset:number, names?:string[]}} args\n * @returns {Promise<import(\"@needle-tools/cloud-sdk/types\").ListDeploymentsResponseBody | { status: number, error: string }>}\n */\nexport async function listDeployments(args) {\n\n const endpoint = args.endpoint || api_endpoint;\n const url = new URL(endpoint + ShareApiEndpoints.get.deployments);\n url.searchParams.append(\"offset\", args.offset.toString());\n url.searchParams.append(\"limit\", args.limit.toString());\n if (args.names) url.searchParams.append(\"name\", args.names.map(n => n.trim()).join(\",\"));\n\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n ...createAuthHeaders({\n authToken: args.authToken,\n org: args.org\n })\n }\n });\n if (!res.ok) {\n return { status: res.status, error: await res.text() };\n }\n /**\n * @type {import(\"@needle-tools/cloud-sdk/types\").ListDeploymentsResponseBody}\n */\n const response = await res.json();\n return response;\n}","import { createAuthHeaders } from \"./api.auth.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\n\n\n/**\n * @typedef {import(\"../types\").ListJobsRequestResponse & {jobs:Array<import(\"../types\").JobWithRelations>}} JobsResponseWithRelations\n */\n\n/** \n * @param {{baseUrl:string, authToken:string}} args \n * @param {{sort_by_upload:boolean, page:number, limit:number}} opts\n * @returns {Promise<JobsResponseWithRelations>}}\n*/\nexport async function listJobs(args, opts = { sort_by_upload: true, page: 1, limit: 100 }) {\n\n if (opts.page <= 0) {\n throw new Error(\"Invalid page. Must be greater than 0\");\n }\n\n const url = args.baseUrl + ShareApiEndpoints.get.jobs;\n /**\n * @type {import(\"../types\").ListJobsRequestHeaders}\n */\n const headers = {\n authorization: \"Bearer \" + args.authToken,\n max: opts.limit.toString(),\n page: opts.page.toString(),\n }\n return fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers\n }).then(async res => {\n if (!res.ok) {\n throw new Error(\"Failed to list uploads\");\n }\n\n /** @type {JobsResponseWithRelations} */\n const json = await res.json();\n\n if (opts?.sort_by_upload == true) {\n\n const uploadJobs = [];\n for (const job of json.jobs) {\n if (job.type == \"upload\") {\n uploadJobs.push({ ...job, related: new Array() });\n }\n }\n const optimizationJobs = json.jobs.filter(j => j.type != \"upload\").sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n const sortedUploads = uploadJobs.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n for (let i = sortedUploads.length - 1; i >= 0; i--) {\n const main = sortedUploads[i];\n const related = optimizationJobs.filter(o => o.view_id == main.view_id);\n for (let j = related.length - 1; j >= 0; j--) {\n const optimizationJob = related[j];\n // insert optimization job before upload job\n // @ts-ignore\n sortedUploads.splice(i, 0, optimizationJob);\n }\n main.related = related;\n }\n\n\n json.jobs = sortedUploads;\n\n }\n\n return json\n });\n}\n\n\n\n/** \n * @param {{baseUrl:string} & import(\"../types\").AuthData} args \n * @param {{sort_by_upload?:boolean, page:number, limit:number, view_name?:string | undefined, view_id?: string | undefined, type: import(\"../types\").ListUploadsRequestHeaders[\"type\"], search?:string}} opts\n * @returns {Promise<import(\"../types\").ListUploadsRequestResponse>}}\n*/\nexport async function listUploads(args, opts = { sort_by_upload: true, page: 1, limit: 20, view_id: undefined, type: \"upload\", }) {\n\n if (opts.page <= 0) {\n throw new Error(\"Invalid page. Must be greater than 0\");\n }\n\n\n const url = new URL(args.baseUrl + ShareApiEndpoints.get.uploads);\n\n if(opts.search?.trim()?.length) {\n url.searchParams.set(\"search\", opts.search.trim());\n }\n\n /**\n * @type {import(\"../types\").ListUploadsRequestHeaders}\n */\n const headers = {\n type: (opts.type || \"upload\"),\n max: (opts.limit || 0).toString(),\n page: (opts.page || 1).toString(),\n ...createAuthHeaders(args)\n }\n if (opts.view_id != undefined)\n headers.view_id = opts.view_id;\n if (opts.view_name != undefined)\n headers.view_name = opts.view_name;\n\n return fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers: /** @type {HeadersInit} */ (/** @type {unknown} */ (headers)),\n })\n .then(async res => {\n if (!res.ok) {\n throw new Error(`Failed to list uploads (${res.status}): ${await res.text()}`);\n }\n if (opts.sort_by_upload === undefined) opts.sort_by_upload = true;\n /** @type {import(\"../types\").ListUploadsRequestResponse} */\n const json = await res.json();\n if (opts.sort_by_upload)\n json.uploads.sort((a, b) => new Date(b.updated_time).getTime() - new Date(a.updated_time).getTime());\n return json;\n });\n}\n\n// /** \n// * @param {{baseUrl:string} & import(\"../types\").AuthData} args \n// * @param {{sort_by_upload?:boolean, page:number, limit:number, view_name?:string | undefined, view_id?: string | undefined, type: import(\"../types\").ListUploadsRequestHeaders[\"type\"]}} opts\n// * @returns {Promise<import(\"../types\").ListUploadsRequestResponse>}}\n// */\n// export async function listDeleted(args) {\n\n// }","import { createAuthHeaders, ShareApiEndpoints } from \"@needle-tools/cloud-sdk\"\nimport { api_endpoint } from \"../../constants.js\"\nimport { getAuthHeader } from \"./utils.js\";\n\n\n/**\n * Start the checkout process\n * @param {{ price_id:string }} args\n */\nexport async function startCheckoutSession(args) {\n\n const url = new URL(api_endpoint + ShareApiEndpoints.account.buy_licenses);\n\n const auth = await getAuthHeader();\n\n /** @type {import(\"@needle-tools/cloud-sdk/types\").BuyLicenseRequestBody} */\n const body = {\n mode: \"payment\",\n price_id: args.price_id,\n return_url: window.location.href,\n cancel_url: window.location.href,\n }\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...createAuthHeaders(auth),\n },\n body: JSON.stringify(body)\n });\n if (!res.ok) {\n return { ok: false, status: res.status }\n }\n\n /** @type {import(\"@needle-tools/cloud-sdk/types\").BuyLicenseResponseBody} */\n const obj = await res.json();\n\n if (\"session_url\" in obj) {\n window.location.href = obj.session_url;\n // return {\n // continue: () => window.location.href = obj.session_url,\n // session_url: obj.session_url\n // }\n return { ok: true, status: 200 }\n }\n return { ok: false, status: 400 }\n}"],"names":["globalThis","Buffer","_isAuthenticated","AuthScopes","Basic","UserScope","Profile","Email","Payment","All","Roles","CustomData","Organizations","OrganizationRoles","concat","Licenses","appId","undefined","scopes","_userInfo","_init","requestUserInfoPromise","_client","changedListeners","Array","invokeChange","forEach","callback","err","console","error","debug","Auth","setDebug","_debug","baseUrl","window","location","origin","redirectUri","postSignOutRedirectUri","onChanged","includes","push","index","indexOf","splice","ready","then","Promise","reject","Error","init","opts","_temp2","_scopes","_client2","query","restoreQueryParamsDuringAuth","checkIsAuthenticated","res","requestUserInfo","url","URL","href","search","history","replaceState","resolve","length","apply","logtoConfig","sign_int","_url$searchParams$get","searchParams","has","get","client","handleSignInCallback","newUrl","pathname","replace","log","handleSignin","_temp","_","e","internalInit","isAuthenticated","getUserInfo","getUserId","sub","getName","username","name","email","split","fetchUserInfo","_userInfo2","requestAccessToken","org_id","getOrganizationToken","getAccessToken","signIn","_appId","saveQueryParamsDuringAuth","signOut","_appId2","sessionStorage","setItem","del","getItem","removeItem","config","endpoint","resources","warn","LogtoClient","NeedleLoginButton","_HTMLButtonElement","_this","call","this","addEventListener","_proto","prototype","connectedCallback","_this2","__update","__unsubscribeOnChange","disconnectedCallback","_this$__unsubscribeOn","innerHTML","_wrapNativeSuper","HTMLButtonElement","createAuthHeaders","authData","authHeaders","authorization","authToken","org","roles","join","roles_org","customElements","define","extends","DEFAULT_FETCH_INIT","credentials","getLicenses","args","options","licensesRequestHeaders","_extends","headers","fetch","method","_exit","_temp3","_result","json","licenses","ok","_res$statusText","statusText","text","_res$text","bind","fn","thisArg","arguments","toString","Object","getPrototypeOf","kindOf","cache","create","thing","str","slice","toLowerCase","kindOfTest","type","typeOfTest","isArray","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","map","obj","allOwnKeys","i","l","keys","getOwnPropertyNames","len","key","findKey","_key","_global","self","global","isContextDefined","context","isTypedArray","TypedArray","Uint8Array","isHTMLForm","hasOwnProperty","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","ret","defineProperties","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","toUpperCase","isAsyncFn","_setImmediate","setImmediateSupported","setImmediate","postMessageSupported","postMessage","token","Math","random","callbacks","source","data","shift","cb","setTimeout","asap","queueMicrotask","process","nextTick","utils$1","isBuffer","constructor","isFormData","kind","FormData","append","isArrayBufferView","result","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","extend","a","b","trim","stripBOM","content","charCodeAt","inherits","superConstructor","props","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","String","lastIndex","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","hasOwnProp","freezeMethods","enumerable","writable","set","toObjectSet","arrayOrString","delimiter","toCamelCase","m","p1","p2","noop","toFiniteNumber","defaultValue","Number","isFinite","generateString","size","alphabet","isSpecCompliantForm","toJSONObject","stack","visit","target","reducedValue","isThenable","catch","AxiosError","message","code","request","response","captureStackTrace","utils","toJSON","description","number","fileName","lineNumber","columnNumber","status","isVisitable","removeBrackets","renderKey","path","dots","from","customProps","axiosError","cause","predicates","test","toFormData","formData","TypeError","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","JSON","stringify","some","isFlatArray","el","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","buildURL","_encode","serializeFn","serialize","serializedParams","hashmarkIndex","encoder","InterceptorManager$1","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","id","clear","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","classes","URLSearchParams","protocols","hasBrowserEnv","document","hasStandardBrowserEnv","product","navigator","platform","WorkerGlobalScope","importScripts","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","contentType","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","parse","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","Accept","defaults$1","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","rawHeaders","parsed","line","substring","parseHeaders","tokens","tokensRE","parseTokens","matcher","deleted","deleteHeader","normalize","format","normalized","w","char","formatHeader","targets","asStrings","first","computed","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","configurable","buildAccessors","mapped","headerValue","AxiosHeaders$2","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","ERR_BAD_REQUEST","floor","progressEventReducer","listener","isDownloadStream","freq","bytesNotified","_speedometer","samplesCount","min","bytes","timestamps","firstSampleTS","head","tail","chunkLength","now","Date","startedAt","bytesCount","passed","round","speedometer","lastArgs","timer","timestamp","threshold","invoke","clearTimeout","throttle","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","event","progressEventDecorator","throttled","asyncDecorator","isURLSameOrigin","msie","userAgent","urlParsingNode","createElement","originURL","resolveURL","setAttribute","protocol","host","hash","hostname","port","charAt","requestURL","cookies","write","expires","domain","secure","cookie","toGMTString","read","RegExp","decodeURIComponent","remove","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","paramsSerializer","timeoutMessage","withCredentials","withXSRFToken","onUploadProgress","onDownloadProgress","decompress","beforeRedirect","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding","configValue","resolveConfig","newConfig","auth","btoa","password","unescape","hasStandardBrowserWebWorkerEnv","Boolean","xsrfValue","xhrAdapter","XMLHttpRequest","_config","requestData","requestHeaders","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","unsubscribe","signal","removeEventListener","onloadend","responseHeaders","getAllResponseHeaders","responseText","open","onreadystatechange","readyState","responseURL","onabort","ECONNABORTED","onerror","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","setRequestHeader","upload","cancel","abort","subscribe","aborted","parseProtocol","send","composeSignals$1","signals","controller","AbortController","reason","streamChunk","chunk","chunkSize","byteLength","end","pos","trackStream","stream","onProgress","onFinish","async","iterable","readBytes","_onFinish","ReadableStream","pull","close","loadedBytes","enqueue","return","highWaterMark","isFetchSupported","Request","Response","isReadableStreamSupported","encodeText","TextEncoder","arrayBuffer","supportsRequestStream","duplexAccessed","hasContentType","body","duplex","supportsResponseStream","resolvers","ERR_NOT_SUPPORT","knownAdapters","http","xhr","fetchOptions","finished","composedSignal","stopTimeout","composeSignals","requestContentLength","getContentLength","getBodyLength","resolveBodyLength","contentTypeHeader","_request","flush","isStreamResponse","responseContentLength","responseData","renderReason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","validators","deprecatedWarnings","validator","version","formatMessage","opt","desc","ERR_DEPRECATED","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","InterceptorManager","configOrUrl","dummy","boolean","function","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","Axios$2","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","c","CancelToken$2","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","HttpStatusCode$2","axios","createInstance","defaultConfig","instance","VERSION","Cancel","all","promises","spread","isAxiosError","payload","formToJSON","getAdapter","default","axios$1","updateJobStatus","job","job_id","identifier","status_message","INPUT_ERROR","WINDOW","root","JS_MD5_NO_WINDOW","WEB_WORKER","NODE_JS","JS_MD5_NO_NODE_JS","versions","node","buffer8","COMMON_JS","JS_MD5_NO_COMMON_JS","module","exports","ARRAY_BUFFER","JS_MD5_NO_ARRAY_BUFFER","HEX_CHARS","EXTRA","SHIFT","OUTPUT_TYPES","BASE64_ENCODE_CHAR","blocks","Uint32Array","JS_MD5_NO_ARRAY_BUFFER_IS_VIEW","createOutputMethod","outputType","Md5","update","createHmacOutputMethod","HmacMd5","sharedMemory","h0","h1","h2","h3","start","hBytes","finalized","hashed","array","oKeyPad","iKeyPad","inner","lastByteIndex","finalize","d","bc","da","hex","digest","base64","v1","v2","v3","base64Str","innerHash","bufferFrom","crypto","require$$0","require$$1","JS_MD5_NO_BUFFER_FROM","createHash","nodeWrap","createMethod","md5","hmac","createHmacMethod","getUint16","offset","getBufferView","getUint32","getString","decoder","decode","compareBytes","sample","element","DataView","TextDecoder","signatures","exact","flatten","flatMap","ext","mime","subSignatures","parseZipLikeFiles","xmlFormat","compressedSize","uncompressedSize","extraFieldLength","parseOpenDocumentFile","UPPER_LIMIT","_ext","_mime","reduce","lim","getUpperLimit","parseBytes","ext2","mime2","sample2","offset2","hashContentMD5","getFileMimeType","file","filename","extra","hint","signature","findMatches","result2","isText","parseTxtLikeFiles","parseExtraTypes","subarray","getFileMimeTypeFromName","lcname","toHumanReadableSizeString","precision","postfix","absoluteSize","abs","pp","toFixed","delay","ms","lod_asset_filename_regex","_wrapRegExp","image_lod","mesh_lod","_settle","pact","s","_Pact","o","v","observer","_isSettledPact","thenable","tryToDecodeFilename","findFileWithShortestPath","shortest","Infinity","f","UploadEstimator","totalFiles","estimatedTotalSize","uploadedSize","startTime","lastUpdateTime","lastUploadedSize","speedEMA","emaFactor","smoothedRemainingTime","recentSpeeds","maxRecentSpeeds","initialEstimateThreshold","updateProgress","totalUploadedSize","timeDiff","newlyUploadedSize","averageRecentSpeed","remainingTime","elapsedTime","effectiveSpeed","max","estimatedTimeRemaining","estimatedTimeRemainingString","__formatTime","seconds","minutes","_forTo","check","_cycle","_for","stage","shouldContinue","updateValue","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","currentUploads","getAuthHeader","uploadFiles","files","dir","mimetype","mimeType","File","myFile","webkitRelativePath","toFileWithPath","uploadPromise","_options","loglevel","success","entrypoint","entryPointFile","indexHtml","htmlFiles","_step3","htmlFilesByDirectory","Map","_iterator3","_createForOfIteratorHelperLoose","parts","bucket","sortedKeys","sort","_step4","_iterator4","find","glTF_Files","_step5","candidates","lodRegex","_iterator5","tryFindEntrypointGLTF","usdFiles","fbxFiles","objFiles","stlFiles","startsWith","packageJsons","tryDetermineEntrypoint","_result2","vrm_count","vrm_files","gltf_count","gltf_files","glb_count","glb_files","totalSize","_success$error","lowercaseFilename","toLocaleLowerCase","_file$path","uris","asset","_success$error2","_step","basePath","_iterator","_uri$groups","groups","found","resourcePath","_step2","_iterator2","_success$error3","validateFiles","validation","_data$entrypoint3","_data$entrypoint4","_data$entrypoint5","_data$entrypoint6","_temp17","_result3","_options9","_options10","_options11","_options12","_data$entrypoint","_data$entrypoint2","_temp15","_result4","beginUploadHeaders","beginRequestBody","_exit3","_temp13","_result5","beginResponse","_options4","_options5","_interrupt","_temp11","queue","_options2","anyUploadFailed","_exit4","_temp9","_result6","_exit5","_temp7","_result7","_interrupt2","_temp5","_exit6","_result8","doneResponse","doneResponseJson","uploadSkipped","view_id","filesUploaded","totalBytes","uploadHasCompletedSuccessfully","doneRequestHeaders","_temp4","AbortSignal","_fetch$catch","_doneResponse","_doneResponse2","maxRetriesDone","_temp6","_options3","_temp8","acc","job_type","entrypointPath","uploadedBytes","authHeader","updateStatus","force","lastStatusUpdate","onStart","uploadEstimator","filesCopy","filesCount","_temp10","_options6","uploaded","lastUploaded","registeredFile","results","fileBuffer","fileBuffers","fileSize","content_length","filetype","content_type","originalFile","contentEncoding","_interrupt3","_temp24","_result9","_interrupt4","_temp22","_result10","_temp20","_uploadError","didUpload","uploadId","uploadError","_result11","fileType","uploadErrorText","putUrl","presigned_url","k","_temp21","_temp19","_options$abort","fileMd5","experimental","content_encoding","fileNumber","fileCount","put","progressEvent","putResponse","_temp18","uploadRequestPUTUrl","fileIndex","requestPresignedUrlHeaders","filesize","requestPresignedUrlBody","jsonBody","_temp23","_options$abort2","_temp27","_exit10","_result12","_temp26","_fetch$then$catch","performUpload","request_put_url","content_md5","_options7","fileProgress01","diff","progress01","timePassedInSeconds","estimation","estimatedTimeLeftDisplay","estimatedTimeLeft","_res","_options8","race","_temp12","triggered_by","parent_job_id","_temp14","_fileName","_filetype","_options13","nameLowercase","uncompressedName","_exit2","_temp16","raw","lowercaseName","_options14","import","pako","inputArray","compArr","gzip","filepath","_opts","replacement","replaceAll","toFile","gzipCompress","compressedFile","_options16","_success$error$status2","isEntrypoint","_options15","internalUploadFiles","sdk_uploadFiles","skipped","ownsProduct","productsArr","_getLicenses","valid","getUserLicenses","includeInvalid","entry","getDeployments","limit","names","n","_res$status","listDeployments","deployments","deployment","getUploads","isPaged","sort_by_upload","page","_opts$search","view_name","uploads","updated_time","getTime","sdk_listUploads","created_at","created_time","updated_at","thumbnail_url","jobs","startCheckoutSession","mode","price_id","return_url","cancel_url","session_url"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/web/polyfill.js","../src/web/auth.config.js","../src/web/auth.js","../src/web/web-components/LoginButton.js","../../needle-share-sdk/src/api.auth.js","../../needle-share-sdk/src/utils.fetch.js","../../needle-share-sdk/src/api.account.js","../../needle-share-sdk/src/api.js","../../needle-share-sdk/node_modules/axios/lib/helpers/bind.js","../../needle-share-sdk/node_modules/axios/lib/utils.js","../../needle-share-sdk/node_modules/axios/lib/core/AxiosError.js","../../needle-share-sdk/node_modules/axios/lib/helpers/toFormData.js","../../needle-share-sdk/node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../../needle-share-sdk/node_modules/axios/lib/helpers/buildURL.js","../../needle-share-sdk/node_modules/axios/lib/core/InterceptorManager.js","../../needle-share-sdk/node_modules/axios/lib/defaults/transitional.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/index.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/classes/FormData.js","../../needle-share-sdk/node_modules/axios/lib/platform/browser/classes/Blob.js","../../needle-share-sdk/node_modules/axios/lib/platform/common/utils.js","../../needle-share-sdk/node_modules/axios/lib/platform/index.js","../../needle-share-sdk/node_modules/axios/lib/helpers/formDataToJSON.js","../../needle-share-sdk/node_modules/axios/lib/defaults/index.js","../../needle-share-sdk/node_modules/axios/lib/helpers/toURLEncodedForm.js","../../needle-share-sdk/node_modules/axios/lib/helpers/parseHeaders.js","../../needle-share-sdk/node_modules/axios/lib/core/AxiosHeaders.js","../../needle-share-sdk/node_modules/axios/lib/core/transformData.js","../../needle-share-sdk/node_modules/axios/lib/cancel/isCancel.js","../../needle-share-sdk/node_modules/axios/lib/cancel/CanceledError.js","../../needle-share-sdk/node_modules/axios/lib/core/settle.js","../../needle-share-sdk/node_modules/axios/lib/helpers/progressEventReducer.js","../../needle-share-sdk/node_modules/axios/lib/helpers/speedometer.js","../../needle-share-sdk/node_modules/axios/lib/helpers/throttle.js","../../needle-share-sdk/node_modules/axios/lib/helpers/isURLSameOrigin.js","../../needle-share-sdk/node_modules/axios/lib/helpers/cookies.js","../../needle-share-sdk/node_modules/axios/lib/core/buildFullPath.js","../../needle-share-sdk/node_modules/axios/lib/helpers/isAbsoluteURL.js","../../needle-share-sdk/node_modules/axios/lib/helpers/combineURLs.js","../../needle-share-sdk/node_modules/axios/lib/core/mergeConfig.js","../../needle-share-sdk/node_modules/axios/lib/helpers/resolveConfig.js","../../needle-share-sdk/node_modules/axios/lib/adapters/xhr.js","../../needle-share-sdk/node_modules/axios/lib/helpers/parseProtocol.js","../../needle-share-sdk/node_modules/axios/lib/helpers/composeSignals.js","../../needle-share-sdk/node_modules/axios/lib/helpers/trackStream.js","../../needle-share-sdk/node_modules/axios/lib/adapters/fetch.js","../../needle-share-sdk/node_modules/axios/lib/adapters/adapters.js","../../needle-share-sdk/node_modules/axios/lib/helpers/null.js","../../needle-share-sdk/node_modules/axios/lib/core/dispatchRequest.js","../../needle-share-sdk/node_modules/axios/lib/env/data.js","../../needle-share-sdk/node_modules/axios/lib/helpers/validator.js","../../needle-share-sdk/node_modules/axios/lib/core/Axios.js","../../needle-share-sdk/node_modules/axios/lib/cancel/CancelToken.js","../../needle-share-sdk/node_modules/axios/lib/helpers/HttpStatusCode.js","../../needle-share-sdk/node_modules/axios/lib/axios.js","../../needle-share-sdk/node_modules/axios/lib/helpers/spread.js","../../needle-share-sdk/node_modules/axios/lib/helpers/isAxiosError.js","../../needle-share-sdk/node_modules/axios/index.js","../../needle-share-sdk/src/api.jobs.js","../../needle-share-sdk/node_modules/js-md5/src/md5.js","../../needle-share-sdk/node_modules/file-type-mime/dist/index.mjs","../../needle-share-sdk/src/file.utils.js","../../needle-share-sdk/src/utils.js","../../needle-share-sdk/src/utils.optimization.js","../../needle-share-sdk/src/api.upload.validate.js","../../needle-share-sdk/src/utils.upload.js","../../needle-share-sdk/src/api.upload.js","../../needle-share-sdk/src/file.archive.js","../../needle-share-sdk/src/logto.js","../src/web/functions/utils.js","../src/web/functions/upload.js","../src/web/functions/get.js","../src/list.js","../../needle-share-sdk/src/api.list.js","../src/web/functions/checkout.js"],"sourcesContent":["import { Buffer } from \"buffer\";\n/** @ts-ignore */\nglobalThis[\"Buffer\"] = Buffer;\n","import { UserScope } from \"@logto/browser\";\n\n\nexport const AuthScopes = {\n Basic: [\n UserScope.Profile,\n UserScope.Email,\n ],\n /** Scopes required for license retrieval and payment */\n Payment: [\n \"read:accounting\", \"write:accounting\" // necessary to get or buy licenses\n ],\n All: [\n UserScope.Profile,\n UserScope.Email,\n UserScope.Roles,\n UserScope.CustomData,\n UserScope.Organizations,\n UserScope.OrganizationRoles,\n ...[\"all\", \"read\", \"write\", \"delete\", \"invite\", \"download\", \"create:org\", \"write:org\", \"delete:org\", \"read:accounting\", \"write:accounting\", \"read:usage\"]\n ]\n}\n\n\n\n/** Needle Product License names */\nexport const Licenses = {\n /** All licenses that make up Needle Pro. Having any of these products is considered PRO */\n NeedlePro: [\"Needle Engine\"], // See import(\"@api/types/stripe\").License[\"type\"]\n}","/**\n * @typedef {import(\"@logto/browser\").UserInfoResponse} UserInfoResponse\n * @typedef {\"https://cloud.needle.tools/api\" | ({} & string)} ResourceUrl\n * \n * @typedef {Object} AuthInitOpts\n * @property {string} [appId]\n * @property {string[] | \"payment\" | \"all\"} [scopes] User scopes. If an empty array is passed\n * @property {boolean} [debug]\n */\n\nimport LogtoClient, { UserScope } from \"@logto/browser\";\nimport { api_endpoint } from \"../constants.js\";\nimport { AuthScopes } from \"./auth.config.js\";\n\nconst endpoint = 'https://auth.needle.tools/';\n\n/** @type {string | undefined} */\nlet appId = undefined; // assigned in init()\n\n/** @type {Array<string>} */\nlet scopes = [];\n\n/** @type {boolean} */\nlet _isAuthenticated;\n/** @type {UserInfoResponse|null} */\nlet _userInfo = null;\n/** @type {Promise<boolean>|null} */\nlet _init = null;\n/** @type {Promise<UserInfoResponse|null>|null} */\nlet requestUserInfoPromise = null;\n/** @type {LogtoClient|null} */\nlet _client = null;\n\n// /** @type {Array<Function>} */\nconst changedListeners = new Array();\n\nfunction invokeChange() {\n changedListeners.forEach(callback => {\n try { callback(); } catch (err) { console.error(err) }\n });\n}\n\nlet debug = false;\n\nexport const Auth = {\n\n /** @param {boolean} _debug */\n setDebug(_debug) {\n debug = _debug;\n },\n\n baseUrl: window.location.origin, // e.g. https://localhost:3000\n\n /**\n * The URL to redirect to after sign-in. This should not be changed in production.\n */\n redirectUri: window.location.origin,\n\n postSignOutRedirectUri: window.location.origin,\n\n /**\n * Register a callback to be called when the authentication state changes\n * @param {Function} callback - The callback to register\n * @returns {Function} - A function to unregister the callback\n */\n onChanged(callback) {\n if (!changedListeners.includes(callback)) {\n changedListeners.push(callback);\n }\n return () => {\n while (true) {\n const index = changedListeners.indexOf(callback);\n if (index >= 0) {\n changedListeners.splice(index, 1);\n }\n else break;\n }\n };\n },\n\n /**\n * Returns a promise that resolves when Auth is initialized\n * @returns {Promise<boolean>}\n */\n ready() {\n if (!_init) return Promise.reject(new Error(\"Auth not initialized\"));\n return _init.then(() => true);\n },\n\n /**\n * Initialize the Auth system\n * @internal\n * @param {AuthInitOpts} [opts] - Initialization options\n * @returns {Promise<boolean>}\n */\n init(opts) {\n if (_init) return _init;\n return _init = internalInit(opts);\n },\n\n /**\n * Check if the user is currently authenticated\n * @returns {boolean}\n */\n isAuthenticated() {\n return _isAuthenticated;\n },\n\n /**\n * Check authentication status with the server\n * @returns {Promise<boolean>}\n */\n checkIsAuthenticated() {\n return client().isAuthenticated().then(res => {\n _isAuthenticated = res;\n return res;\n });\n },\n\n /**\n * Get the current user information (if fetched previously)\n * @returns {UserInfoResponse|null}\n */\n getUserInfo() {\n return _userInfo;\n },\n\n /**\n * Get the current user ID (sub)\n * @returns {string|null}\n */\n getUserId() {\n if (!_userInfo) return null;\n return _userInfo.sub;\n },\n\n /**\n * Get the user's name or username (if available)\n * @returns {string|null}\n */\n getName() {\n if (!_userInfo) return null;\n if (_userInfo.username) {\n return _userInfo.username;\n }\n if (_userInfo.name) {\n return _userInfo.name;\n }\n if (_userInfo.email) {\n return _userInfo.email.split('@')[0];\n }\n return null;\n },\n\n /**\n * Request user information from the server\n * @returns {Promise<UserInfoResponse|null>}\n */\n requestUserInfo() {\n if (requestUserInfoPromise) return requestUserInfoPromise;\n return requestUserInfoPromise = Auth.checkIsAuthenticated().then(res => {\n if (!res) {\n _userInfo = null;\n invokeChange();\n return null;\n }\n return client().fetchUserInfo()\n .then(res => {\n if (debug && res?.sub != _userInfo?.sub) console.debug(\"UserInfo\", res);\n _userInfo = res;\n invokeChange();\n return res;\n })\n .catch(err => {\n console.error(err);\n _userInfo = null;\n invokeChange();\n return null;\n })\n });\n },\n\n /**\n * Request an access token for the configured resource\n * @param {string | undefined | null} [org_id] - The organization ID (optional). If none is provided the user access token will be requested.\n * @returns {Promise<string>}\n */\n requestAccessToken(org_id) {\n if (debug) console.debug(\"requestAccessToken\", { org_id });\n if (org_id) {\n return client().getOrganizationToken(org_id);\n }\n return client().getAccessToken(api_endpoint, org_id || undefined);\n },\n\n /**\n * Initiate the sign-in process\n */\n signIn() {\n return Auth.checkIsAuthenticated().then(res => {\n if (res == false) {\n if (!appId?.length) {\n throw new Error(\"App ID is not set: Make sure to call 'init' first\");\n }\n saveQueryParamsDuringAuth();\n client().signIn(Auth.redirectUri);\n }\n });\n },\n\n /**\n * Sign out the current user\n */\n signOut() {\n requestUserInfoPromise = null;\n return Auth.checkIsAuthenticated().then(res => {\n if (res == true) {\n if (!appId?.length) {\n throw new Error(\"App ID is not set: Make sure to call 'init' first\");\n }\n saveQueryParamsDuringAuth();\n client().signOut(Auth.postSignOutRedirectUri);\n }\n });\n }\n};\n\n/**\n * @param {AuthInitOpts} [opts]\n * @returns {Promise<boolean>}\n */\nasync function internalInit(opts) {\n if (opts?.debug) debug = opts.debug;\n\n if (debug) console.debug(\"Auth.init\", opts);\n\n if (opts?.scopes) {\n switch (opts.scopes) {\n case \"all\":\n opts.scopes = AuthScopes.All;\n break;\n case \"payment\":\n opts.scopes = AuthScopes.Payment;\n break;\n }\n scopes = opts.scopes;\n }\n // Default scopes if nothing is configured\n if (scopes.length <= 0) {\n scopes.push(\n ...AuthScopes.Basic,\n ...AuthScopes.Payment\n );\n }\n if (debug) console.debug(\"Auth.init\", \"Use scopes\", scopes);\n\n if (opts?.appId) {\n appId = opts.appId;\n // Reset the client if the appId has changed\n if (_client?.logtoConfig.appId !== appId) {\n if (debug) console.debug(\"Auth.init\", \"App ID changed, resetting client\");\n _client = null;\n }\n }\n else {\n // This is the default app id\n appId = \"2x82zzh5xuudmiotdy2ux\";\n if (debug) console.debug(\"Auth.init\", \"Use default app ID\", appId);\n }\n\n const sign_int = handleSignin();\n if (sign_int instanceof Promise) await sign_int.then(_ => true);\n\n const query = restoreQueryParamsDuringAuth(true);\n if (query) {\n const url = new URL(window.location.href);\n url.search = query;\n window.history.replaceState({}, '', url.href);\n }\n else {\n return Auth.checkIsAuthenticated()\n .then(res => {\n // fetch userinfo immediately if the user is authenticated\n if (res) return Auth.requestUserInfo().then(() => true);\n return true;\n });\n }\n return Promise.resolve(true);\n}\n\n/**\n * Save current query parameters during auth flow\n */\nfunction saveQueryParamsDuringAuth() {\n sessionStorage.setItem('needle-auth:query', window.location.search);\n}\n\n/**\n * Restore query parameters that were saved during auth flow\n * @param {boolean} [del=true] - Whether to delete the saved query after restoring\n * @returns {string} The saved query string\n */\nfunction restoreQueryParamsDuringAuth(del = true) {\n const query = sessionStorage.getItem('needle-auth:query');\n if (query) {\n if (del)\n sessionStorage.removeItem('needle-auth:query');\n return query;\n }\n return '';\n}\n\n/**\n * Get the LogtoClient instance\n * @returns {LogtoClient}\n */\nfunction client() {\n if (!_client) {\n if (!appId) throw new Error(\"App ID is not set: Make sure to call 'init' first\");\n\n /** @type {import(\"@logto/browser\").LogtoConfig} */\n const config = {\n endpoint,\n appId,\n scopes: scopes,\n resources: [api_endpoint]\n }\n\n if (debug) console.warn(\"Creating auth client:\", debug, config);\n _client = new LogtoClient(config);\n }\n return _client;\n}\n\n/**\n * Handle the sign-in redirect process\n * @returns {Promise<void>|void}\n */\nfunction handleSignin() {\n // TODO: use client().isSignInRedirected(url.href) instead \n const url = new URL(window.location.href);\n if (url.searchParams.has('code') && url.searchParams.has('state')) {\n if (url.searchParams.get(\"iss\")?.includes(\"https://auth.needle.tools/\")) {\n return client().handleSignInCallback(url.href).then(() => {\n const newUrl = new URL(window.location.href);\n newUrl.pathname = newUrl.pathname.replace('callback', '');\n newUrl.searchParams.delete('code');\n newUrl.searchParams.delete('state');\n newUrl.searchParams.delete('iss');\n const query = restoreQueryParamsDuringAuth();\n if (query) {\n console.log('Restore query before login', query, \"Current:\", newUrl.search);\n newUrl.search = query;\n }\n // change query parameters without reload\n window.history.replaceState({}, '', newUrl.href);\n }).catch(err => {\n console.error(err);\n });\n }\n }\n}","import { Auth } from \"../auth.js\";\n\n/**\n * Basic web component for login/logout\n */\nexport class NeedleLoginButton extends HTMLButtonElement {\n constructor() {\n super();\n this.addEventListener(\"click\", () => {\n if (Auth.isAuthenticated()) {\n Auth.signOut();\n }\n else {\n Auth.signIn();\n }\n });\n }\n connectedCallback() {\n console.debug(\"Login button connected...\");\n this.__update();\n this.__unsubscribeOnChange = Auth.onChanged(() => {\n this.__update();\n });\n }\n disconnectedCallback() {\n this.__unsubscribeOnChange?.();\n }\n\n __update() {\n this.innerHTML = Auth.isAuthenticated() ? \"Logout\" : \"Login\";\n }\n}\n\ncustomElements.define(\"needle-login-button\", NeedleLoginButton, { extends: \"button\" });","\n\n\n\n\n/**\n * Create the headers for an authenticated request\n * @param {import(\"../types\").AuthData} authData\n * @returns {import(\"../types\").AuthHeaders}\n */\nexport function createAuthHeaders(authData) {\n /**\n * @type {import(\"../types\").AuthHeaders}\n */\n const authHeaders = {\n authorization: \"Bearer \" + authData.authToken,\n }\n if (authData.org)\n authHeaders[\"x-needle-cloud-org\"] = authData.org;\n if (authData.roles) {\n authHeaders.roles = authData.roles.join(\",\");\n }\n if (authData.roles_org) {\n authHeaders.roles_org = authData.roles_org.join(\",\");\n }\n return authHeaders;\n}\n\n\n/**\n * @param {import(\"../types\").Action} type\n * @param {import(\"../types\").Permission[] | undefined} permissions\n * @returns {boolean}\n */\nexport function checkPermissions(type, permissions) {\n if (!permissions?.length)\n return false;\n\n switch (type) {\n case \"write\":\n return permissions.some(p => p == \"all\" || p == \"write\");\n case \"read\":\n return permissions.some(p => p == \"all\" || p == \"read\");\n case \"upload\":\n return permissions.some(p => p == \"all\" || p == \"upload\");\n case \"download\":\n return permissions.some(p => p == \"all\" || p == \"download\");\n case \"delete\":\n return permissions.some(p => p == \"all\" || p == \"delete\");\n case \"invite\":\n return permissions.some(p => p == \"all\" || p == \"invite\");\n case \"create:org\":\n return permissions.some(p => p == \"all\" || p == \"create:org\");\n case \"write:org\":\n return permissions.some(p => p == \"all\" || p == \"write:org\");\n case \"delete:org\":\n return permissions.some(p => p == \"all\" || p == \"delete:org\");\n case \"read:accounting\":\n return permissions.some(p => p == \"all\" || p == \"read:accounting\");\n case \"write:accounting\":\n return permissions.some(p => p == \"all\" || p == \"write:accounting\");\n case \"read:usage\": \n return permissions.some(p => p == \"all\" || p == \"read:usage\");\n case \"read:needle\":\n // TODO: we should introduce a new permission for reading internal data that doesnt require \"all\" permissions\n return permissions.some(p => p == \"all\");\n\n }\n\n throw new Error(\"Unknown action type: \" + type);\n\n}","\n\n/**\n * @type {RequestInit}\n */\nexport const DEFAULT_FETCH_INIT = {\n credentials: \"omit\"\n}","import { createAuthHeaders } from \"./api.auth.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\n\n\n/**\n * @param {{ baseUrl?: null | string, pathname?:string, account_id?:string|null, license?:import(\"../types/api.payment.js\").NeedleEngineLicenseIdentifier, return_url?: string|null, checkout_if_possible?: boolean, show_all_cards?:boolean, affiliate_id?: string, tracking_id?:string }} [opts]\n * @returns {URL | null} the URL to the purchase intent page (null if the URL cannot be created)\n */\nexport function getPurchaseIntentUrl(opts) {\n opts = opts || {};\n\n const location = typeof window !== \"undefined\" ? window.location : null;\n\n if (opts.baseUrl === \"current_page\") {\n opts.baseUrl = location?.href;\n }\n let path = opts.pathname || location?.pathname;\n let baseUrl = opts.baseUrl || location?.href;\n if (!path || !baseUrl) {\n return null;\n }\n const url = new URL(path, baseUrl);\n\n // Keep existing URL parameters\n if (location) {\n url.search = location.search;\n }\n if (!opts.license) {\n opts.license = \"needle-engine:pro\";\n }\n url.searchParams.set(\"purchase_intent\", opts.license);\n if (opts.account_id) {\n url.searchParams.set(\"account_id\", opts.account_id);\n }\n if (opts.return_url) {\n url.searchParams.set(\"return_url\", opts.return_url);\n }\n if (opts.checkout_if_possible) {\n url.searchParams.set(\"checkout_if_possible\", \"true\");\n }\n if (opts.show_all_cards) {\n url.searchParams.set(\"show_all_cards\", \"true\");\n }\n if (opts.affiliate_id) {\n url.searchParams.set(\"affiliate_id\", opts.affiliate_id);\n }\n if (opts.tracking_id) {\n url.searchParams.set(\"tracking_id\", opts.tracking_id);\n }\n return url;\n}\n\n/**\n * @param {\"edu\" | \"startup\"} license\n * @returns {string} the URL to apply for a license\n */\nexport function getApplyForLicenseUrl(license) {\n switch (license) {\n case \"edu\":\n return \"https://cloud.needle.tools/apply/edu\"\n case \"startup\":\n return \"https://cloud.needle.tools/apply/startup\"\n default:\n return \"https://cloud.needle.tools/apply\"\n }\n}\n\n/**\n * Get the licenses this user has access to\n * @param {{baseUrl:string} & import(\"../types/index.js\").AuthData} args\n * @param {import(\"../types/api.payment.js\").GetLicensesRequestHeaders} options\n * @returns {Promise<Array<import(\"../../needle-share/types/stripe.js\").License>>}\n */\nexport async function getLicenses(args, options) {\n\n const url = args.baseUrl + ShareApiEndpoints.account.get_licenses;\n\n /**\n * @type {import(\"../types/api.payment.js\").GetLicensesRequestHeaders}\n */\n const licensesRequestHeaders = {\n ...options\n }\n\n const headers = {\n ...licensesRequestHeaders,\n ...createAuthHeaders(args),\n }\n const res = await fetch(url,\n {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers: headers\n }\n ).catch(err => {\n console.error(err);\n return null;\n });\n\n if (!res) {\n return [];\n }\n\n if (!res.ok) {\n console.error(res.statusText, await res.text());\n return [];\n }\n\n /**\n * @type {import(\"../types/api.payment.js\").GetLicensesResponse}\n */\n const json = await res.json();\n return json.licenses;\n}\n\n\n","\n\n/**\n * @type {Omit<import(\"../types\").ShareApiEndpoints, \"baseUrl\">}\n */\nexport const ShareApiEndpoints = {\n status: \"/v1/status\",\n version: \"/v1/version\",\n api: \"/v1/api\",\n usage: {\n get: \"/v1/usage\",\n },\n affiliate:{\n get: \"/v1/affiliate/get\",\n link_clicked: \"/v1/affiliate/link_clicked\",\n },\n account: {\n public_key: \"/v1/account/public_key\",\n post_machine: \"/v1/account/machine\",\n connect: \"/v1/account/connect\",\n get_licenses: \"/v1/account/get/licenses\",\n set_license_active: \"/v1/account/set_license_active\",\n set_licenses_active: \"/v1/account/set_licenses_active\",\n buy_licenses: \"/v1/account/buy_licenses\",\n // upgrade_license: \"/v1/account/upgrade_license\",\n update_licenses: \"/v1/account/update_licenses\",\n update_payment_method: \"/v1/account/update_payment_method\",\n get_billing: \"/v1/account/get_billing\",\n resume_subscription: \"/v1/account/resume_subscription\",\n cancel_subscription: \"/v1/account/cancel_subscription\",\n\n start_billingportal_session: \"/v1/account/start_billingportal_session\",\n // get_credits: \"/v1/account/get_credits\",\n // buy_credits: \"/v1/account/buy_credits\",\n },\n ai: {\n llmstxt: \"/v1/ai/llmstxt\",\n chat: \"/v1/ai/chat\",\n list_chats: \"/v1/ai/chat/list\",\n ask: \"/v1/ai/ask\",\n },\n organizations: {\n get: \"/v1/organizations/get\",\n orgs_details: \"/v1/organizations/details\",\n licenses: \"/v1/organizations/licenses\",\n get_invitations: \"/v1/organizations/get_invitations\",\n },\n events: {\n get: \"/v1/events/get\",\n post: \"/v1/events/post\",\n list: \"/v1/events/list\",\n },\n reports: {\n get: \"/v1/reports/get\",\n post: \"/v1/reports/post\",\n },\n questionnaire: {\n get: \"/v1/questionnaires/get\",\n post: \"/v1/questionnaires/post\",\n },\n roadmap: {\n get: \"/v1/roadmap/get\",\n post_vote: \"/v1/roadmap/post\",\n },\n tokens: {\n create: \"/v1/tokens/create\",\n delete: \"/v1/tokens/delete\",\n // get: \"/v1/tokens/get\",\n list: \"/v1/tokens/list\",\n },\n get: {\n stats: \"/v1/get/stats\",\n jobs: \"/v1/list/jobs\",\n uploads: \"/v1/list/uploads\",\n uploads_deleted: \"/v1/list/uploads/deleted\",\n deployments: \"/v1/list/deployments\",\n discounts: \"/v1/get/discounts\",\n },\n urls: {\n public: \"/v1/public\",\n public_download_urls: \"/v1/public/download/urls\",\n },\n view: {\n get: \"/v1/view\",\n get_analytics: \"/v1/view/analytics\",\n get_public_info: \"/v1/view/public/info\",\n post_version: \"/v1/view/post_version\",\n update: \"/v1/view/update\",\n delete: \"/v1/view/delete\",\n restore: \"/v1/view/restore\",\n },\n // deployment: {\n // get_latest: \"/v1/deployment/get/latest\",\n // },\n upload: {\n request: \"/v1/upload/request\",\n request_put_url: \"/v1/upload/put\",\n update_results: \"/v1/upload/results\",\n done: \"/v1/upload/done\",\n cancel: \"/v1/upload/cancel\",\n },\n optimize: {\n get_optimize_id: \"/v1/optimize/get_id\",\n request: \"/v1/optimize/request\",\n },\n jobs: {\n request_start: \"/v1/jobs/request_start\",\n request_download_url: \"/v1/download/get_presigned_url\",\n request_download_urls: \"/v1/download/get_presigned_urls\",\n request_restart: \"/v1/jobs/restart\",\n delete: \"/v1/jobs/delete\",\n post_update: \"/v1/jobs/update\",\n post_meta: \"/v1/jobs/meta\",\n post_results_stats: \"/v1/jobs/results_stats\",\n get_status: \"/v1/jobs/status\",\n get_org: \"/v1/jobs/org\",\n query: \"/v1/jobs/query\",\n request_job_that_needs_stats: \"/v1/jobs/job_needs_stats\",\n },\n worker: {\n ping: \"/v1/worker/ping\",\n get_available_count: \"/v1/worker/get_available_count\",\n post_available_info: \"/v1/worker/post_available_info\",\n get_available_info: \"/v1/worker/get_available_info\",\n },\n local_projects: {\n get: {\n user: \"/v1/local_projects/user\",\n by_id: \"/v1/local_projects/\",\n },\n post: \"/v1/local_projects\",\n },\n}\n","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isHeaders(header)) {\n for (const [key, value] of header.entries()) {\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n let contentType;\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // Let the browser set it\n } else if ((contentType = headers.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst composeSignals = (signals, timeout) => {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (cancel) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = cancel instanceof Error ? cancel : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal &&\n (signal.removeEventListener ? signal.removeEventListener('abort', onabort) : signal.unsubscribe(onabort));\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal && signal.addEventListener && signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = unsubscribe;\n\n return [signal, () => {\n timer && clearTimeout(timer);\n timer = null;\n }];\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize, encode) {\n for await (const chunk of iterable) {\n yield* streamChunk(ArrayBuffer.isView(chunk) ? chunk : (await encode(String(chunk))), chunkSize);\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish, encode) => {\n const iterator = readBytes(stream, chunkSize, encode);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = utils.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if(utils.isBlob(body)) {\n return body.size;\n }\n\n if(utils.isSpecCompliantForm(body)) {\n return (await new Request(body).arrayBuffer()).byteLength;\n }\n\n if(utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n}\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n}\n\nexport default isFetchSupported && (async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let [composedSignal, stopTimeout] = (signal || cancelToken || timeout) ?\n composeSignals([signal, cancelToken], timeout) : [];\n\n let finished, request;\n\n const onFinish = () => {\n !finished && setTimeout(() => {\n composedSignal && composedSignal.unsubscribe();\n });\n\n finished = true;\n }\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush, encodeText);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: withCredentials\n });\n\n let response = await fetch(request);\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || isStreamResponse)) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n isStreamResponse && onFinish();\n }, encodeText),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && onFinish();\n\n stopTimeout && stopTimeout();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n onFinish();\n\n if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\n\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.7.4\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy;\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n","import { createAuthHeaders } from \"./api.auth.js\";\nimport { isInternalFile } from \"./api.jobs.results.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\n\n\n\n/** \n * @param {string} jobid\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args,\n * @param {import(\"../types\").JobRequestRestartBody} body\n * @returns {Promise<boolean>}\n*/\nexport async function requestRestart(jobid, args, body) {\n\n const url = args.baseUrl + ShareApiEndpoints.jobs.request_restart;\n /**\n * @type {import(\"../types\").JobRequestRestartRequestHeaders}\n */\n const headers = {\n ...createAuthHeaders(args),\n job_id: jobid\n }\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers,\n body: JSON.stringify(body)\n }).catch(err => {\n console.error(err);\n return null;\n });\n if (!res) return false;\n return res.ok;\n}\n\n\n/** \n * @param {Pick<import(\"../types\").JobModel, \"identifier\" | \"status\" | \"status_message\" | \"error\" | \"progress\">} job\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args \n * @returns {Promise<boolean>}\n*/\nexport async function updateJobStatus(job, args) {\n\n const url = args.baseUrl + ShareApiEndpoints.jobs.post_update;\n /**\n * @type {import(\"../types\").JobPostStatusRequestHeaders}\n */\n const headers = {\n ...createAuthHeaders(args),\n job_id: job.identifier,\n status: job.status,\n }\n\n /**\n * @type {import(\"../types\").JobPostStatusRequestBody}\n */\n const body = {\n status_message: job.status_message,\n error: job.error,\n progress: job.progress\n }\n\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n /** @type {any} */\n headers: headers,\n body: JSON.stringify(body)\n }).catch(err => {\n console.error(err);\n return null;\n });\n if (!res) return false;\n return res.ok;\n}\n\n\n/**\n * @param {string} jobid\n * @param {{baseUrl:string} & import(\"../types\").AuthData & { org: string }} args\n */\nexport async function getJobStatus(jobid, args) {\n\n const url = args.baseUrl + ShareApiEndpoints.jobs.get_status;\n\n\n /** @type {import(\"../types\").JobGetStatusRequestHeaders} */\n const headers = {\n ...createAuthHeaders(args),\n job_id: jobid,\n org: args.org,\n }\n\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers: headers\n }).catch(err => {\n console.error(err);\n return null;\n });\n if (!res) return null;\n if (!res.ok) {\n console.error(\"Failed to get status\", res.status, await res.text());\n return null;\n }\n /**\n * @type {import(\"../types\").JobGetStatusRequestResponse}\n */\n const data = await res.json();\n return data;\n}\n\n\n/**\n * @param {Pick<import(\"../types\").JobModel, \"results\">} job\n * @param {{include_internal?:boolean}} options\n * @returns {{mainAssetSize:number, additionalAssets:number}} file sizes in bytes\n */\nexport function calculateFileSize(job, options = { include_internal: false }) {\n let mainAssetSize = 0;\n let additionalAssets = 0;\n\n if (job.results) {\n mainAssetSize =\n job.results.files.find(\n (file) => file.filename == job.results?.entrypoint,\n )?.content_length || 0;\n additionalAssets = job.results.files.reduce((acc, file) => {\n if (file.filename != job.results?.entrypoint) {\n // if we don't explictly include internal files - skip them\n if (options?.include_internal !== true) {\n if (isInternalFile(file.filename)) {\n return acc;\n }\n }\n return acc + file.content_length;\n }\n return acc;\n }, 0);\n }\n return {\n mainAssetSize,\n additionalAssets,\n };\n}\n\n\n\n/**\n * @template {import(\"../types\").JobModelKeys} T\n * @param {{baseUrl:string, identifier:string, fields:Array<T>} & import(\"../types\").AuthData} opts\n * @returns {Promise<null | (Pick<import(\"../types\").JobModel, T>)>}\n */\nexport async function getJob(opts) {\n\n if (!opts.identifier) return null;\n\n\n /**\n * @type {import(\"../types\").JobQueryRequestHeaders}\n */\n const headers = {\n ...createAuthHeaders(opts),\n };\n /**\n * @type {import(\"../types\").JobQueryRequestBody}\n */\n const body = {\n job_id: opts.identifier,\n fields: opts.fields\n }\n const url = opts.baseUrl + ShareApiEndpoints.jobs.query;\n const res = await fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers,\n body: JSON.stringify(body)\n }).catch(err => {\n console.error(err);\n return null;\n });\n\n if (res == null) {\n return null;\n }\n else if (!res.ok) {\n console.error(\"Failed to get job\", res.status, await res.text());\n return null;\n }\n\n /**\n * @type {import(\"../types\").JobQueryRequestResponse}\n */\n const response = await res.json().catch(err => {\n console.error(err);\n return null;\n });\n if (response == null) {\n return null;\n }\n\n /** @ts-ignore */\n return response.job;\n}\n\n\n\n\n/**\n * @param {{baseUrl:string, identifier:string} & import(\"../types\").AuthData} opts\n * @returns {Promise<null | object>}\n */\nexport async function getJobResultStats(opts) {\n\n const res = await getJob({\n ...opts,\n fields: [\"results_stats\"]\n });\n if (res?.results_stats) {\n return res.results_stats;\n }\n return null;\n};\n","/**\n * [js-md5]{@link https://github.com/emn178/js-md5}\n *\n * @namespace md5\n * @version 0.8.3\n * @author Chen, Yi-Cyuan [emn178@gmail.com]\n * @copyright Chen, Yi-Cyuan 2014-2023\n * @license MIT\n */\n(function () {\n 'use strict';\n\n var INPUT_ERROR = 'input is invalid type';\n var FINALIZE_ERROR = 'finalize already called';\n var WINDOW = typeof window === 'object';\n var root = WINDOW ? window : {};\n if (root.JS_MD5_NO_WINDOW) {\n WINDOW = false;\n }\n var WEB_WORKER = !WINDOW && typeof self === 'object';\n var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;\n if (NODE_JS) {\n root = global;\n } else if (WEB_WORKER) {\n root = self;\n }\n var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;\n var AMD = typeof define === 'function' && define.amd;\n var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';\n var HEX_CHARS = '0123456789abcdef'.split('');\n var EXTRA = [128, 32768, 8388608, -2147483648];\n var SHIFT = [0, 8, 16, 24];\n var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];\n var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n var blocks = [], buffer8;\n if (ARRAY_BUFFER) {\n var buffer = new ArrayBuffer(68);\n buffer8 = new Uint8Array(buffer);\n blocks = new Uint32Array(buffer);\n }\n\n var isArray = Array.isArray;\n if (root.JS_MD5_NO_NODE_JS || !isArray) {\n isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n }\n\n var isView = ArrayBuffer.isView;\n if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !isView)) {\n isView = function (obj) {\n return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n };\n }\n\n // [message: string, isString: bool]\n var formatMessage = function (message) {\n var type = typeof message;\n if (type === 'string') {\n return [message, true];\n }\n if (type !== 'object' || message === null) {\n throw new Error(INPUT_ERROR);\n }\n if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n return [new Uint8Array(message), false];\n }\n if (!isArray(message) && !isView(message)) {\n throw new Error(INPUT_ERROR);\n }\n return [message, false];\n }\n\n /**\n * @method hex\n * @memberof md5\n * @description Output hash as hex string\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} Hex string\n * @example\n * md5.hex('The quick brown fox jumps over the lazy dog');\n * // equal to\n * md5('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method digest\n * @memberof md5\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.digest('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method array\n * @memberof md5\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.array('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method arrayBuffer\n * @memberof md5\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.arrayBuffer('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method buffer\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\n * @memberof md5\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.buffer('The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method base64\n * @memberof md5\n * @description Output hash as base64 string\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} base64 string\n * @example\n * md5.base64('The quick brown fox jumps over the lazy dog');\n */\n var createOutputMethod = function (outputType) {\n return function (message) {\n return new Md5(true).update(message)[outputType]();\n };\n };\n\n /**\n * @method create\n * @memberof md5\n * @description Create Md5 object\n * @returns {Md5} Md5 object.\n * @example\n * var hash = md5.create();\n */\n /**\n * @method update\n * @memberof md5\n * @description Create and update Md5 object\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Md5} Md5 object.\n * @example\n * var hash = md5.update('The quick brown fox jumps over the lazy dog');\n * // equal to\n * var hash = md5.create();\n * hash.update('The quick brown fox jumps over the lazy dog');\n */\n var createMethod = function () {\n var method = createOutputMethod('hex');\n if (NODE_JS) {\n method = nodeWrap(method);\n }\n method.create = function () {\n return new Md5();\n };\n method.update = function (message) {\n return method.create().update(message);\n };\n for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n var type = OUTPUT_TYPES[i];\n method[type] = createOutputMethod(type);\n }\n return method;\n };\n\n var nodeWrap = function (method) {\n var crypto = require('crypto')\n var Buffer = require('buffer').Buffer;\n var bufferFrom;\n if (Buffer.from && !root.JS_MD5_NO_BUFFER_FROM) {\n bufferFrom = Buffer.from;\n } else {\n bufferFrom = function (message) {\n return new Buffer(message);\n };\n }\n var nodeMethod = function (message) {\n if (typeof message === 'string') {\n return crypto.createHash('md5').update(message, 'utf8').digest('hex');\n } else {\n if (message === null || message === undefined) {\n throw new Error(INPUT_ERROR);\n } else if (message.constructor === ArrayBuffer) {\n message = new Uint8Array(message);\n }\n }\n if (isArray(message) || isView(message) ||\n message.constructor === Buffer) {\n return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');\n } else {\n return method(message);\n }\n };\n return nodeMethod;\n };\n\n /**\n * @namespace md5.hmac\n */\n /**\n * @method hex\n * @memberof md5.hmac\n * @description Output hash as hex string\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} Hex string\n * @example\n * md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');\n * // equal to\n * md5.hmac('key', 'The quick brown fox jumps over the lazy dog');\n */\n\n /**\n * @method digest\n * @memberof md5.hmac\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method array\n * @memberof md5.hmac\n * @description Output hash as bytes array\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Array} Bytes array\n * @example\n * md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method arrayBuffer\n * @memberof md5.hmac\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method buffer\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\n * @memberof md5.hmac\n * @description Output hash as ArrayBuffer\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {ArrayBuffer} ArrayBuffer\n * @example\n * md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');\n */\n /**\n * @method base64\n * @memberof md5.hmac\n * @description Output hash as base64 string\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} base64 string\n * @example\n * md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');\n */\n var createHmacOutputMethod = function (outputType) {\n return function (key, message) {\n return new HmacMd5(key, true).update(message)[outputType]();\n };\n };\n\n /**\n * @method create\n * @memberof md5.hmac\n * @description Create HmacMd5 object\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @returns {HmacMd5} HmacMd5 object.\n * @example\n * var hash = md5.hmac.create('key');\n */\n /**\n * @method update\n * @memberof md5.hmac\n * @description Create and update HmacMd5 object\n * @param {String|Array|Uint8Array|ArrayBuffer} key key\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {HmacMd5} HmacMd5 object.\n * @example\n * var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');\n * // equal to\n * var hash = md5.hmac.create('key');\n * hash.update('The quick brown fox jumps over the lazy dog');\n */\n var createHmacMethod = function () {\n var method = createHmacOutputMethod('hex');\n method.create = function (key) {\n return new HmacMd5(key);\n };\n method.update = function (key, message) {\n return method.create(key).update(message);\n };\n for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n var type = OUTPUT_TYPES[i];\n method[type] = createHmacOutputMethod(type);\n }\n return method;\n };\n\n /**\n * Md5 class\n * @class Md5\n * @description This is internal class.\n * @see {@link md5.create}\n */\n function Md5(sharedMemory) {\n if (sharedMemory) {\n blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n this.blocks = blocks;\n this.buffer8 = buffer8;\n } else {\n if (ARRAY_BUFFER) {\n var buffer = new ArrayBuffer(68);\n this.buffer8 = new Uint8Array(buffer);\n this.blocks = new Uint32Array(buffer);\n } else {\n this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n }\n }\n this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;\n this.finalized = this.hashed = false;\n this.first = true;\n }\n\n /**\n * @method update\n * @memberof Md5\n * @instance\n * @description Update hash\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {Md5} Md5 object.\n * @see {@link md5.update}\n */\n Md5.prototype.update = function (message) {\n if (this.finalized) {\n throw new Error(FINALIZE_ERROR);\n }\n\n var result = formatMessage(message);\n message = result[0];\n var isString = result[1];\n var code, index = 0, i, length = message.length, blocks = this.blocks;\n var buffer8 = this.buffer8;\n\n while (index < length) {\n if (this.hashed) {\n this.hashed = false;\n blocks[0] = blocks[16];\n blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n }\n\n if (isString) {\n if (ARRAY_BUFFER) {\n for (i = this.start; index < length && i < 64; ++index) {\n code = message.charCodeAt(index);\n if (code < 0x80) {\n buffer8[i++] = code;\n } else if (code < 0x800) {\n buffer8[i++] = 0xc0 | (code >>> 6);\n buffer8[i++] = 0x80 | (code & 0x3f);\n } else if (code < 0xd800 || code >= 0xe000) {\n buffer8[i++] = 0xe0 | (code >>> 12);\n buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);\n buffer8[i++] = 0x80 | (code & 0x3f);\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n buffer8[i++] = 0xf0 | (code >>> 18);\n buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);\n buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);\n buffer8[i++] = 0x80 | (code & 0x3f);\n }\n }\n } else {\n for (i = this.start; index < length && i < 64; ++index) {\n code = message.charCodeAt(index);\n if (code < 0x80) {\n blocks[i >>> 2] |= code << SHIFT[i++ & 3];\n } else if (code < 0x800) {\n blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else if (code < 0xd800 || code >= 0xe000) {\n blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n }\n }\n }\n } else {\n if (ARRAY_BUFFER) {\n for (i = this.start; index < length && i < 64; ++index) {\n buffer8[i++] = message[index];\n }\n } else {\n for (i = this.start; index < length && i < 64; ++index) {\n blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];\n }\n }\n }\n this.lastByteIndex = i;\n this.bytes += i - this.start;\n if (i >= 64) {\n this.start = i - 64;\n this.hash();\n this.hashed = true;\n } else {\n this.start = i;\n }\n }\n if (this.bytes > 4294967295) {\n this.hBytes += this.bytes / 4294967296 << 0;\n this.bytes = this.bytes % 4294967296;\n }\n return this;\n };\n\n Md5.prototype.finalize = function () {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n var blocks = this.blocks, i = this.lastByteIndex;\n blocks[i >>> 2] |= EXTRA[i & 3];\n if (i >= 56) {\n if (!this.hashed) {\n this.hash();\n }\n blocks[0] = blocks[16];\n blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n }\n blocks[14] = this.bytes << 3;\n blocks[15] = this.hBytes << 3 | this.bytes >>> 29;\n this.hash();\n };\n\n Md5.prototype.hash = function () {\n var a, b, c, d, bc, da, blocks = this.blocks;\n\n if (this.first) {\n a = blocks[0] - 680876937;\n a = (a << 7 | a >>> 25) - 271733879 << 0;\n d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;\n d = (d << 12 | d >>> 20) + a << 0;\n c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;\n c = (c << 17 | c >>> 15) + d << 0;\n b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;\n b = (b << 22 | b >>> 10) + c << 0;\n } else {\n a = this.h0;\n b = this.h1;\n c = this.h2;\n d = this.h3;\n a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;\n b = (b << 22 | b >>> 10) + c << 0;\n }\n\n a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;\n b = (b << 20 | b >>> 12) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[5] - 378558;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[8] - 2022574463;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[11] + 1839030562;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[14] - 35309556;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[1] - 1530992060;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[4] + 1272893353;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[7] - 155497632;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[10] - 1094730640;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[13] + 681279174;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[0] - 358537222;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[3] - 722521979;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[6] + 76029189;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[9] - 640364487;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[12] - 421815835;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[15] + 530742520;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[2] - 995338651;\n b = (b << 23 | b >>> 9) + c << 0;\n a += (c ^ (b | ~d)) + blocks[0] - 198630844;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[7] + 1126891415;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[14] - 1416354905;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[5] - 57434055;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[12] + 1700485571;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[3] - 1894986606;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[10] - 1051523;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[1] - 2054922799;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[8] + 1873313359;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[15] - 30611744;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[6] - 1560198380;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[13] + 1309151649;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[4] - 145523070;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[11] - 1120210379;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[2] + 718787259;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[9] - 343485551;\n b = (b << 21 | b >>> 11) + c << 0;\n\n if (this.first) {\n this.h0 = a + 1732584193 << 0;\n this.h1 = b - 271733879 << 0;\n this.h2 = c - 1732584194 << 0;\n this.h3 = d + 271733878 << 0;\n this.first = false;\n } else {\n this.h0 = this.h0 + a << 0;\n this.h1 = this.h1 + b << 0;\n this.h2 = this.h2 + c << 0;\n this.h3 = this.h3 + d << 0;\n }\n };\n\n /**\n * @method hex\n * @memberof Md5\n * @instance\n * @description Output hash as hex string\n * @returns {String} Hex string\n * @see {@link md5.hex}\n * @example\n * hash.hex();\n */\n Md5.prototype.hex = function () {\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\n\n return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +\n HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +\n HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +\n HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +\n HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +\n HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +\n HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +\n HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +\n HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +\n HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +\n HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +\n HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +\n HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +\n HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +\n HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +\n HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];\n };\n\n /**\n * @method toString\n * @memberof Md5\n * @instance\n * @description Output hash as hex string\n * @returns {String} Hex string\n * @see {@link md5.hex}\n * @example\n * hash.toString();\n */\n Md5.prototype.toString = Md5.prototype.hex;\n\n /**\n * @method digest\n * @memberof Md5\n * @instance\n * @description Output hash as bytes array\n * @returns {Array} Bytes array\n * @see {@link md5.digest}\n * @example\n * hash.digest();\n */\n Md5.prototype.digest = function () {\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\n return [\n h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,\n h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,\n h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,\n h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF\n ];\n };\n\n /**\n * @method array\n * @memberof Md5\n * @instance\n * @description Output hash as bytes array\n * @returns {Array} Bytes array\n * @see {@link md5.array}\n * @example\n * hash.array();\n */\n Md5.prototype.array = Md5.prototype.digest;\n\n /**\n * @method arrayBuffer\n * @memberof Md5\n * @instance\n * @description Output hash as ArrayBuffer\n * @returns {ArrayBuffer} ArrayBuffer\n * @see {@link md5.arrayBuffer}\n * @example\n * hash.arrayBuffer();\n */\n Md5.prototype.arrayBuffer = function () {\n this.finalize();\n\n var buffer = new ArrayBuffer(16);\n var blocks = new Uint32Array(buffer);\n blocks[0] = this.h0;\n blocks[1] = this.h1;\n blocks[2] = this.h2;\n blocks[3] = this.h3;\n return buffer;\n };\n\n /**\n * @method buffer\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\n * @memberof Md5\n * @instance\n * @description Output hash as ArrayBuffer\n * @returns {ArrayBuffer} ArrayBuffer\n * @see {@link md5.buffer}\n * @example\n * hash.buffer();\n */\n Md5.prototype.buffer = Md5.prototype.arrayBuffer;\n\n /**\n * @method base64\n * @memberof Md5\n * @instance\n * @description Output hash as base64 string\n * @returns {String} base64 string\n * @see {@link md5.base64}\n * @example\n * hash.base64();\n */\n Md5.prototype.base64 = function () {\n var v1, v2, v3, base64Str = '', bytes = this.array();\n for (var i = 0; i < 15;) {\n v1 = bytes[i++];\n v2 = bytes[i++];\n v3 = bytes[i++];\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\n BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +\n BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +\n BASE64_ENCODE_CHAR[v3 & 63];\n }\n v1 = bytes[i];\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\n BASE64_ENCODE_CHAR[(v1 << 4) & 63] +\n '==';\n return base64Str;\n };\n\n /**\n * HmacMd5 class\n * @class HmacMd5\n * @extends Md5\n * @description This is internal class.\n * @see {@link md5.hmac.create}\n */\n function HmacMd5(key, sharedMemory) {\n var i, result = formatMessage(key);\n key = result[0];\n if (result[1]) {\n var bytes = [], length = key.length, index = 0, code;\n for (i = 0; i < length; ++i) {\n code = key.charCodeAt(i);\n if (code < 0x80) {\n bytes[index++] = code;\n } else if (code < 0x800) {\n bytes[index++] = (0xc0 | (code >>> 6));\n bytes[index++] = (0x80 | (code & 0x3f));\n } else if (code < 0xd800 || code >= 0xe000) {\n bytes[index++] = (0xe0 | (code >>> 12));\n bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));\n bytes[index++] = (0x80 | (code & 0x3f));\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));\n bytes[index++] = (0xf0 | (code >>> 18));\n bytes[index++] = (0x80 | ((code >>> 12) & 0x3f));\n bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));\n bytes[index++] = (0x80 | (code & 0x3f));\n }\n }\n key = bytes;\n }\n\n if (key.length > 64) {\n key = (new Md5(true)).update(key).array();\n }\n\n var oKeyPad = [], iKeyPad = [];\n for (i = 0; i < 64; ++i) {\n var b = key[i] || 0;\n oKeyPad[i] = 0x5c ^ b;\n iKeyPad[i] = 0x36 ^ b;\n }\n\n Md5.call(this, sharedMemory);\n\n this.update(iKeyPad);\n this.oKeyPad = oKeyPad;\n this.inner = true;\n this.sharedMemory = sharedMemory;\n }\n HmacMd5.prototype = new Md5();\n\n HmacMd5.prototype.finalize = function () {\n Md5.prototype.finalize.call(this);\n if (this.inner) {\n this.inner = false;\n var innerHash = this.array();\n Md5.call(this, this.sharedMemory);\n this.update(this.oKeyPad);\n this.update(innerHash);\n Md5.prototype.finalize.call(this);\n }\n };\n\n var exports = createMethod();\n exports.md5 = exports;\n exports.md5.hmac = createHmacMethod();\n\n if (COMMON_JS) {\n module.exports = exports;\n } else {\n /**\n * @method md5\b\n * @description Md5 hash function, export to global in browsers.\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} md5 hashes\n * @example\n * md5(''); // d41d8cd98f00b204e9800998ecf8427e\n * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6\n * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0\n *\n * // It also supports UTF-8 encoding\n * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07\n *\n * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`\n * md5([]); // d41d8cd98f00b204e9800998ecf8427e\n * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e\n */\n root.md5 = exports;\n if (AMD) {\n define(function () {\n return exports;\n });\n }\n }\n})();\n","function getUint16(buffer, offset = 0) {\n const view = getBufferView(buffer, offset, 2);\n return view.getUint16(0, true);\n}\nfunction getUint32(buffer, offset = 0) {\n const view = getBufferView(buffer, offset, 4);\n return view.getUint32(0, true);\n}\nfunction getString(buffer, offset = 0, length = buffer.byteLength) {\n const slice = buffer.slice(offset, offset + length);\n return decoder.decode(new Uint8Array(slice));\n}\nfunction compareBytes(source, sample, offset = 0) {\n if (source.length < sample.length + offset) {\n return false;\n }\n for (const [i, element] of sample.entries()) {\n if (element === null)\n continue;\n if (element !== source[i + offset]) {\n return false;\n }\n }\n return true;\n}\nfunction getBufferView(buffer, offset, length) {\n const slice = buffer.slice(offset, offset + length);\n return new DataView(new Uint8Array(slice).buffer);\n}\nconst decoder = new TextDecoder(\"utf8\");\n\nconst signatures = [\n [\n \"db\",\n \"application/vnd.sqlite3\",\n [\n 83,\n 81,\n 76,\n 105,\n 116,\n 101,\n 32,\n 102,\n 111,\n 114,\n 109,\n 97,\n 116,\n 32,\n 51,\n 0\n ]\n ],\n [\"woff\", \"font/woff\", [119, 79, 70, 70]],\n [\"woff2\", \"font/woff2\", [119, 79, 70, 50]],\n [\"bmp\", \"image/bmp\", [66, 77]],\n [\"gif\", \"image/gif\", [71, 73, 70, 56, 55, 97]],\n [\"gif\", \"image/gif\", [71, 73, 70, 56, 57, 97]],\n [\n \"heic\",\n \"image/heic\",\n [102, 116, 121, 112, 104, 101, 105],\n { offset: 4 }\n ],\n [\"heic\", \"image/heic\", [102, 116, 121, 112, 109], { offset: 4 }],\n [\"ico\", \"image/x-icon\", [0, 0, 1, 0]],\n [\"jpg\", \"image/jpeg\", [255, 216, 255]],\n [\"pdf\", \"application/pdf\", [37, 80, 68, 70, 45]],\n [\"png\", \"image/png\", [137, 80, 78, 71, 13, 10, 26, 10]],\n [\"7z\", \"application/x-7z-compressed\", [55, 122, 188, 175, 39, 28]],\n [\n \"rar\",\n \"application/x-rar-compressed\",\n [82, 97, 114, 33, 26, 7, 0]\n ],\n [\n \"rar\",\n \"application/x-rar-compressed\",\n [82, 97, 114, 33, 26, 7, 1, 0]\n ],\n [\"rtf\", \"application/rtf\", [123, 92, 114, 116, 102, 49]],\n [\"bz2\", \"application/x-bzip2\", [66, 90, 104]],\n [\"gz\", \"application/gzip\", [31, 139]],\n [\n \"tar\",\n \"application/x-tar\",\n [117, 115, 116, 97, 114, 0, 48, 48],\n { offset: 257 }\n ],\n [\n \"tar\",\n \"application/x-tar\",\n [117, 115, 116, 97, 114, 32, 32, 0],\n { offset: 257 }\n ],\n [\"tif\", \"image/tiff\", [73, 73, 42, 0]],\n [\"tiff\", \"image/tiff\", [77, 77, 0, 42]],\n [\"zip\", \"application/zip\", [80, 75, 3, 4], { exact: false }],\n [\"zip\", \"application/zip\", [80, 75, 5, 6]],\n [\"mp3\", \"audio/mp3\", [255, 251]],\n [\"mp3\", \"audio/mp3\", [255, 243]],\n [\"mp3\", \"audio/mp3\", [255, 242]],\n [\"mp3\", \"audio/mp3\", [73, 68, 51]],\n [\n \"mp4\",\n \"video/mp4\",\n [102, 116, 121, 112, 105, 115, 111, 109],\n { offset: 4 }\n ],\n [\n \"avi\",\n \"video/x-msvideo\",\n [82, 73, 70, 70, null, null, null, null, 65, 86, 73, 32]\n ],\n [\n \"wav\",\n \"audio/wav\",\n [82, 73, 70, 70, null, null, null, null, 87, 65, 86, 69]\n ],\n [\n \"ogx\",\n \"application/ogg\",\n [79, 103, 103, 83],\n { exact: false },\n [\n [\"oga\", \"audio/ogg\", [127, 70, 76, 65, 67], { offset: 28 }],\n [\n \"ogg\",\n \"audio/ogg\",\n [1, 118, 111, 114, 98, 105, 115],\n { offset: 28 }\n ],\n [\n \"ogm\",\n \"video/ogg\",\n [1, 118, 105, 100, 101, 111, 0],\n { offset: 28 }\n ],\n [\n \"ogv\",\n \"video/ogg\",\n [128, 116, 104, 101, 111, 114, 97],\n { offset: 28 }\n ]\n ]\n ],\n [\n \"webp\",\n \"image/webp\",\n [82, 73, 70, 70, null, null, null, null, 87, 69, 66, 80]\n ],\n [\"psd\", \"image/vnd.adobe.photoshop\", [56, 66, 80, 83]],\n [\"flac\", \"audio/x-flac\", [102, 76, 97, 67]],\n [\"wasm\", \"application/wasm\", [0, 97, 115, 109]],\n [\n \"deb\",\n \"application/x-deb\",\n [33, 60, 97, 114, 99, 104, 62, 10]\n ],\n [\"exe\", \"application/x-msdownload\", [77, 90]],\n [\"exe\", \"application/x-msdownload\", [90, 77]],\n [\"class\", \"application/java-vm\", [202, 254, 186, 190]]\n];\n\nfunction isText(data) {\n for (let i = 0; i < data.length; i++) {\n try {\n const code = data.charCodeAt(i);\n if (code === 65533 || code <= 8) {\n return false;\n }\n } catch {\n return false;\n }\n }\n return true;\n}\nfunction parseTxtLikeFiles(buffer) {\n try {\n const data = getString(buffer);\n if (!isText(data)) {\n return void 0;\n }\n try {\n JSON.parse(data);\n return { ext: \"json\", mime: \"application/json\" };\n } catch {\n return { ext: \"txt\", mime: \"text/plain\" };\n }\n } catch {\n return void 0;\n }\n}\n\nfunction getUpperLimit(signatures) {\n return flatten(signatures).map(([_ext, _mime, sample, { offset = 0 } = {}]) => sample.length + offset).reduce((lim, val) => val > lim ? val : lim, 0);\n}\nfunction flatten(signatures) {\n return signatures.flatMap(\n ([ext, mime, bytes, options = {}, subSignatures = []]) => [\n [ext, mime, bytes, options],\n ...subSignatures\n ]\n );\n}\nfunction findMatches(signatures, { ext, mime }) {\n if (!(ext || mime))\n return [];\n return flatten(signatures).filter(\n (signature) => signature[0] === ext || signature[1] === mime\n );\n}\n\nfunction parseZipLikeFiles(buffer, result) {\n const size = getUint16(buffer, 26);\n const name = getString(buffer, 30, size);\n const [identifier] = name.split(\"/\");\n const xmlFormat = name.endsWith(\".xml\");\n if (identifier === \"META-INF\") {\n return {\n ext: \"jar\",\n mime: \"application/java-archive\"\n };\n }\n if (identifier === \"ppt\" && xmlFormat) {\n return {\n ext: \"pptx\",\n mime: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n };\n }\n if (identifier === \"word\" && xmlFormat) {\n return {\n ext: \"docx\",\n mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n };\n }\n if (identifier === \"xl\" && xmlFormat) {\n return {\n ext: \"xlsx\",\n mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n };\n }\n if (identifier === \"mimetype\") {\n return parseOpenDocumentFile(buffer, size) ?? result;\n }\n return result;\n}\nfunction parseOpenDocumentFile(buffer, offset) {\n const compressedSize = getUint32(buffer, 18);\n const uncompressedSize = getUint32(buffer, 22);\n const extraFieldLength = getUint16(buffer, 28);\n if (compressedSize === uncompressedSize) {\n const mime = getString(\n buffer,\n 30 + offset + extraFieldLength,\n compressedSize\n );\n if (mime === \"application/vnd.oasis.opendocument.presentation\") {\n return {\n ext: \"odp\",\n mime\n };\n }\n if (mime === \"application/vnd.oasis.opendocument.spreadsheet\") {\n return {\n ext: \"ods\",\n mime\n };\n }\n if (mime === \"application/vnd.oasis.opendocument.text\") {\n return {\n ext: \"odt\",\n mime\n };\n }\n if (mime === \"application/epub+zip\") {\n return {\n ext: \"epub\",\n mime\n };\n }\n }\n return void 0;\n}\n\nconst UPPER_LIMIT = getUpperLimit(signatures);\nfunction parse(buffer, { extra = false, hint } = {}) {\n const bytes = new Uint8Array(buffer.slice(0, UPPER_LIMIT));\n if (hint) {\n const matches = findMatches(signatures, hint);\n if (matches.length > 0) {\n const result2 = parseBytes(bytes, matches);\n if (result2 !== void 0) {\n return result2;\n }\n }\n }\n const result = parseBytes(bytes, signatures);\n if (result) {\n return result;\n }\n if (extra) {\n return parseExtraTypes(buffer);\n }\n return void 0;\n}\nfunction parseBytes(bytes, signatures) {\n for (const [\n ext,\n mime,\n sample,\n { exact = true, offset = 0 } = {},\n subSignatures = []\n ] of signatures) {\n if (compareBytes(bytes, sample, offset)) {\n if (ext === \"zip\" && !exact) {\n return parseZipLikeFiles(bytes.buffer, { ext, mime });\n }\n if (!exact && subSignatures.length) {\n for (const [ext2, mime2, sample2, { offset: offset2 = 0 } = {}] of subSignatures) {\n if (compareBytes(bytes, sample2, offset2)) {\n return { ext: ext2, mime: mime2 };\n }\n }\n }\n return { ext, mime };\n }\n }\n return void 0;\n}\nfunction parseExtraTypes(buffer) {\n return parseTxtLikeFiles(buffer);\n}\n\nexport { parse };\n","import { md5 } from 'js-md5';\nimport { parse } from \"file-type-mime\";\n\n/**\n * @param {string} str\n * @param {string} search\n * @param {string} replacement\n * @returns {string}\n */\nfunction replaceAll(str, search, replacement) {\n let lastIndex = 0;\n while (true) {\n let index = str.indexOf(search, lastIndex)\n if (index === -1) {\n break;\n }\n lastIndex = index + search.length;\n str = str.replace(search, replacement);\n }\n return str;\n}\n\n/**\n * @param {string} filepath\n * @param {ArrayBuffer} buffer\n * @param {undefined | {type?:string}} opts\n */\nexport function toFile(filepath, buffer, opts = undefined) {\n\n const name = replaceAll(filepath, \"\\\\\", \"/\").split(\"/\").pop() || filepath;\n const mimetype = opts?.type || getFileMimeType(buffer, filepath);\n const file = /** @type { import('../types').FileWithPath } */ (/** @type {unknown} */ (new File([buffer], name, { type: mimetype })));\n file.path = filepath;\n return file;\n}\n\n/**\n * Convert a dataURL to a blob\n * @param {string} dataURL\n * @returns {Blob | null} blob\n */\nexport function dataURLToBlob(dataURL) {\n const BASE64_MARKER = ';base64,';\n if (dataURL.indexOf(BASE64_MARKER) === -1) {\n return null;\n }\n const parts = dataURL.split(BASE64_MARKER);\n const contentType = parts[0].split(':')[1];\n const raw = window.atob(parts[1]);\n const rawLength = raw.length;\n const array = new Uint8Array(new ArrayBuffer(rawLength));\n for (let i = 0; i < raw.length; i++) {\n array[i] = raw.charCodeAt(i);\n }\n return new Blob([array], { type: contentType });\n}\n\n/**\n * Convert a dataURL to a file\n * @param {string} dataURL\n * @param {string} filename\n * @returns {File | null} file\n */\nexport function dataURLToFile(dataURL, filename) {\n const blob = dataURLToBlob(dataURL);\n if (!blob) return null;\n return new File([blob], filename, { type: blob.type });\n\n}\n\n\n/**\n * Get a md5 hash for presigning URLs (S3 content-md5)\n * @param {ArrayBuffer} buffer\n * @returns {string} hash\n */\nexport function hashContentMD5(buffer) {\n const hash = md5.create();\n hash.update(buffer);\n return hash.base64();\n}\n\n/**\n * Create a md5 hash from a string\n * @param {string} str\n */\nexport function hashStringMD5(str) {\n return md5(str);\n}\n\n\n\n/**\n * @param {DataTransfer} datatransfer \n * @returns {Promise<import('../types').FileWithPath[]>} files\n */\nexport async function getAllFiles(datatransfer) {\n /**\n * @type {import('../types').FileWithPath[]}\n */\n const arr = [];\n const items = [];\n if (datatransfer instanceof DataTransfer) {\n for (let i = 0; i < datatransfer.items.length; i++) {\n items.push(datatransfer.items[i]);\n }\n }\n\n const promises = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n const prom = getAllFilesFromDirectory(item, arr);\n promises.push(prom);\n }\n else {\n const _item = items[i];\n if (_item.type == \"text/uri-list\") {\n const prom = new Promise((resolve, reject) => {\n _item.getAsString(async (url) => {\n arr.push({\n path: url,\n name: url.split(\"/\").pop(),\n });\n resolve();\n })\n });\n promises.push(prom);\n }\n }\n }\n await Promise.all(promises);\n return arr;\n}\n\n/**\n * @param {FileSystemEntry | FileSystemDirectoryEntry} fileOrDirectorySystemEntry\n * @param {import('../types').FileWithPath[]} target\n * @returns {Promise<void>}\n */\nasync function getAllFilesFromDirectory(fileOrDirectorySystemEntry, target, path = \"\") {\n\n if (fileOrDirectorySystemEntry.isFile) {\n /** @ts-ignore @type {FileSystemFileEntry} */\n const fe = fileOrDirectorySystemEntry;\n const file = await getFile(fe, path);\n if (file) target.push(file);\n return;\n }\n else if (!fileOrDirectorySystemEntry.isDirectory) {\n console.error(\"Unknown entry type\", fileOrDirectorySystemEntry);\n }\n\n /** @ts-ignore @type {FileSystemDirectoryEntry} */\n const directory = fileOrDirectorySystemEntry;\n path += directory.name + \"/\";\n const reader = directory.createReader();\n return new Promise(async (resolve, reject) => {\n // We need to continue calling readEntries until the length of the result is 0\n while (true) {\n const res = await read().catch(reject);\n if (!res) {\n resolve();\n break;\n }\n }\n });\n\n /**\n * @returns {Promise<boolean>} hasMore\n */\n function read() {\n return new Promise((resolve, reject) => {\n reader.readEntries(async (entries) => {\n if (entries.length <= 0) {\n resolve(false);\n return;\n }\n console.debug(\"Read\", entries.length);\n for (const entry of entries) {\n if (entry.isFile) {\n /** @ts-ignore @type {FileSystemFileEntry} */\n const fe = entry;\n const file = await getFile(fe, path);\n if (file) target.push(file);\n }\n else if (entry.isDirectory) {\n /** @ts-ignore @type {FileSystemDirectoryEntry} */\n const directoryEntry = entry;\n await getAllFilesFromDirectory(directoryEntry, target, path);\n }\n else {\n console.error(\"Unknown entry type\", entry);\n }\n };\n resolve(true);\n }, err => {\n console.error(err);\n reject(err);\n });\n });\n }\n\n /**\n * @param {FileSystemFileEntry} fe\n * @param {string} dir\n * @returns {Promise<import('../types').FileWithPath>}\n */\n function getFile(fe, dir = \"\") {\n return new Promise((resolve, reject) => {\n fe.file(file => {\n resolve(toFileWithPath(file, dir));\n }, err => {\n console.error(err);\n reject(err);\n });\n });\n }\n\n}\n\n\n/**\n * @param {File | import('../types').FileLike} file\n * @param {string | null} dir\n * @returns {import('../types').FileWithPath}\n */\nexport function toFileWithPath(file, dir = null) {\n if (isFileLike(file)) {\n let mimeType = file.mimetype || getFileMimeTypeFromName(file.name);\n file = new File([file.buffer], file.name, { type: mimeType });\n }\n // see Note: https://developer.mozilla.org/en-US/docs/Web/API/Blob/type\n // we need to determine the mimetype for e.g. https://linear.app/needle/issue/NE-6404\n else if (!file.type) {\n file = new File([file], file.name, { type: getFileMimeTypeFromName(file.name) });\n }\n\n const myFile = /** @type {import('../types').FileWithPath} */ ( /** @type {any} */ (file));\n if (dir == null) {\n dir = file.webkitRelativePath || \"\";\n }\n myFile.path = dir + file.name;\n\n return myFile;\n}\n\n/**\n * @param {any} val\n * @returns {val is import('../types').FileLike}\n */\nexport const isFileLike = (val) => typeof val === \"object\" && typeof val.name === \"string\" && typeof val.mimetype === \"string\";\n\n/**\n * @param {FileList} files\n * @returns {Promise<import('../types').FileWithPath[]>} files\n */\nexport async function toFilesWithPath(files) {\n\n /** @type {import('../types').FileWithPath[]} */\n const list = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const prom = toFileWithPath(file);\n list.push(prom);\n }\n return list;\n}\n\n/**\n * Get the file type from the header\n * @param {ArrayBuffer} file\n * @param {string|undefined} filename\n * @returns {string} type\n */\nexport function getFileMimeType(file, filename = undefined) {\n\n const res = parse(file);\n if (res) return res.mime;\n\n const arr = (new Uint8Array(file)).subarray(0, 4);\n let header = \"\";\n for (var i = 0; i < arr.length; i++) {\n header += arr[i].toString(16);\n }\n\n // https://stackoverflow.com/questions/18299806/how-to-check-file-mime-type-with-javascript-before-upload\n // https://en.wikipedia.org/wiki/List_of_file_signatures\n // https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern\n let type = \"unknown\";\n switch (header) {\n case \"676c5446\":\n type = \"model/gltf-binary\";\n break;\n case \"89504e47\":\n type = \"image/png\";\n break;\n case \"ffd8ffe0\":\n case \"ffd8ffe1\":\n case \"ffd8ffe2\":\n case \"ffd8ffe3\":\n case \"ffd8ffe8\":\n type = \"image/jpeg\";\n break;\n default:\n type = \"unknown\"; // Or you can use the blob.type as fallback\n break;\n }\n\n if (type === \"unknown\" && typeof filename === \"string\") {\n type = getFileMimeTypeFromName(filename);\n }\n\n return type\n}\n\n/** \n * @param {string} filename\n */\nexport function getFileMimeTypeFromName(filename) {\n const lcname = filename.toLowerCase();\n let type = \"\";\n if (lcname.endsWith(\".html\")) type = \"text/html\";\n else if (lcname.endsWith(\".html.gz\")) type = \"text/html\"; // even if the file is gzipped we want to deliver the file as html\n else if (lcname.endsWith(\".js\")) type = \"application/javascript\";\n else if (lcname.endsWith(\".js.gz\")) type = \"application/javascript\"; // even if the file is gzipped we want to deliver the file as javascript\n else if (lcname.endsWith(\".wasm\")) type = \"application/wasm\";\n else if (lcname.endsWith(\".css\")) type = \"text/css\";\n else if (lcname.endsWith(\".json\")) type = \"application/json\";\n else if (lcname.endsWith(\".txt\")) type = \"text/plain\";\n else if (lcname.endsWith(\".bin\")) type = \"application/octet-stream\";\n else if (lcname.endsWith(\".png\")) type = \"image/png\";\n else if (lcname.endsWith(\".jpg\") || lcname.endsWith(\".jpeg\")) type = \"image/jpeg\";\n else if (lcname.endsWith(\".gif\")) type = \"image/gif\";\n else if (lcname.endsWith(\".webp\")) type = \"image/webp\";\n else if (lcname.endsWith(\".svg\")) type = \"image/svg+xml\";\n\n // models\n else if (lcname.endsWith(\".glb\")) type = \"model/gltf-binary\";\n else if (lcname.endsWith(\".gltf\")) type = \"model/gltf+json\";\n else if (lcname.endsWith(\".vrm\")) type = \"model/gltf-binary\";\n else if (lcname.endsWith(\".usdz\")) type = \"model/vnd.usdz+zip\";\n else if (lcname.endsWith(\".usda\")) type = \"model/vnd.usd-usda\";\n else if (lcname.endsWith(\".usdc\")) type = \"model/vnd.usd-usdc\";\n else if (lcname.endsWith(\".usd\")) type = \"model/vnd.usd-usd\";\n else if (lcname.endsWith(\".mtl\")) type = \"model/mtl\";\n else if (lcname.endsWith(\".obj\")) type = \"model/obj\";\n else if (lcname.endsWith(\".fbx\")) type = \"model/vnd.autodesk.fbx\";\n else if (lcname.endsWith(\".stl\")) type = \"model/stl\";\n return type;\n}\n\n/**\n * For deployments we need to make sure that the file type is the actual content type and the filename does not contain the .gz or .br extension\n * @link https://linear.app/needle/issue/NE-5525\n * @param {string} filename\n * @param {string} mimetype\n * @returns {{filename:string, mimetype:string} | null}\n */\nexport function getUncompressedFileMimeType(filename, mimetype) {\n\n const nameLowercase = filename.toLowerCase();\n\n if (mimetype === \"application/gzip\" || mimetype === \"application/brotli\") {\n // Make sure the type is the actual content type\n if (nameLowercase.endsWith(\".html.gz\") || nameLowercase.endsWith(\".html.br\")) {\n mimetype = \"text/html\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".js.gz\") || nameLowercase.endsWith(\".js.br\")) {\n mimetype = \"application/javascript\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mjs.gz\") || nameLowercase.endsWith(\".mjs.br\")) {\n mimetype = \"application/javascript\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".cjs.gz\") || nameLowercase.endsWith(\".cjs.br\")) {\n mimetype = \"application/javascript\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".css.gz\") || nameLowercase.endsWith(\".css.br\")) {\n mimetype = \"text/css\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".json.gz\") || nameLowercase.endsWith(\".json.br\")) {\n mimetype = \"text/json\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".txt.gz\") || nameLowercase.endsWith(\".txt.br\")) {\n mimetype = \"text/plain\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".wasm.gz\") || nameLowercase.endsWith(\".wasm.br\")) {\n mimetype = \"application/wasm\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".bin.gz\") || nameLowercase.endsWith(\".bin.br\")) {\n mimetype = \"application/octet-stream\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".png.gz\") || nameLowercase.endsWith(\".png.br\")) {\n mimetype = \"image/png\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".jpg.gz\") || nameLowercase.endsWith(\".jpg.br\") || nameLowercase.endsWith(\".jpeg.gz\") || nameLowercase.endsWith(\".jpeg.br\")) {\n mimetype = \"image/jpeg\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".gif.gz\") || nameLowercase.endsWith(\".gif.br\")) {\n mimetype = \"image/gif\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".webp.gz\") || nameLowercase.endsWith(\".webp.br\")) {\n mimetype = \"image/webp\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".svg.gz\") || nameLowercase.endsWith(\".svg.br\")) {\n mimetype = \"image/svg+xml\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".ico.gz\") || nameLowercase.endsWith(\".ico.br\")) {\n mimetype = \"image/x-icon\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n // VIDEO FILES\n else if (nameLowercase.endsWith(\".webm.gz\") || nameLowercase.endsWith(\".webm.br\")) {\n mimetype = \"video/webm\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mp4.gz\") || nameLowercase.endsWith(\".mp4.br\")) {\n mimetype = \"video/mp4\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mov.gz\") || nameLowercase.endsWith(\".mov.br\")) {\n mimetype = \"video/quicktime\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n\n // AUDIO FILES\n else if (nameLowercase.endsWith(\".mp3.gz\") || nameLowercase.endsWith(\".mp3.br\")) {\n mimetype = \"audio/mpeg\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".wav.gz\") || nameLowercase.endsWith(\".wav.br\")) {\n mimetype = \"audio/wave\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".ogg.gz\") || nameLowercase.endsWith(\".ogg.br\")) {\n mimetype = \"audio/ogg\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".flac.gz\") || nameLowercase.endsWith(\".flac.br\")) {\n mimetype = \"audio/flac\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n\n // MODEL FILES\n else if (nameLowercase.endsWith(\".glb.gz\") || nameLowercase.endsWith(\".glb.br\")) {\n mimetype = \"model/gltf-binary\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".gltf.gz\") || nameLowercase.endsWith(\".gltf.br\")) {\n mimetype = \"model/gltf+json\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".vrm.gz\") || nameLowercase.endsWith(\".vrm.br\")) {\n mimetype = \"model/gltf-binary\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".usdz.gz\") || nameLowercase.endsWith(\".usdz.br\")) {\n mimetype = \"model/vnd.usdz+zip\";\n filename = filename.substring(0, filename.length - 3);\n }\n // TODO: verify....\n // else if (nameLowercase.endsWith(\".fbx.gz\") || nameLowercase.endsWith(\".fbx.br\")) {\n // mimetype = \"model/vnd.autodesk.fbx\";\n // filename = filename.substring(0, filename.length - 3);\n // }\n else if (nameLowercase.endsWith(\".obj.gz\") || nameLowercase.endsWith(\".obj.br\")) {\n mimetype = \"model/obj\";\n filename = filename.substring(0, filename.length - 3);\n }\n else if (nameLowercase.endsWith(\".mtl.gz\") || nameLowercase.endsWith(\".mtl.br\")) {\n mimetype = \"model/mtl\";\n filename = filename.substring(0, filename.length - 3);\n }\n\n\n\n return { filename, mimetype };\n }\n return null;\n}\n\n\n/**\n * Tests if a file has the correct extension and mimetype to be deployed\n * @param {string} filename\n * @param {string} mimetype\n */\nexport function validateFileForDeployment(filename, mimetype) {\n\n if (filename.endsWith(\".html\") || filename.endsWith(\".html.gz\") || filename.endsWith(\".html.br\")) {\n if (mimetype !== \"text/html\") {\n return false;\n }\n }\n else if (filename.endsWith(\".js\") || filename.endsWith(\".js.gz\") || filename.endsWith(\".js.br\")) {\n if (mimetype !== \"text/javascript\" && mimetype !== \"application/javascript\") {\n return false;\n }\n }\n else if (filename.endsWith(\".css\") || filename.endsWith(\".css.gz\") || filename.endsWith(\".css.br\")) {\n if (mimetype !== \"text/css\") {\n return false;\n }\n }\n\n return true;\n}\n\n\n/**\n * @param {string} type\n */\nexport function isglTFOrGLBMimeType(type) {\n return type === \"model/gltf-binary\" || type === \"model/gltf+json\";\n}\n/**\n * @param {string} filename\n */\nexport function hasglTFOrGLBExtension(filename) {\n const lowercaseName = filename.toLowerCase();\n return lowercaseName.endsWith(\".glb\") ||\n lowercaseName.endsWith(\".glb.gz\") || lowercaseName.endsWith(\".glb.br\") ||\n lowercaseName.endsWith(\".gltf\") ||\n lowercaseName.endsWith(\".gltf.gz\") || lowercaseName.endsWith(\".gltf.br\") ||\n lowercaseName.endsWith(\".vrm\") ||\n lowercaseName.endsWith(\".vrm.gz\") || lowercaseName.endsWith(\".vrm.br\");\n}\n\n\n\n/**\n * Takes a file path or directory path and returns the directory path\n * @param {string} path\n */\nexport function getDirectory(path) {\n const str = replaceAll(path, \"\\\\\", \"/\");\n const parts = str.split(\"/\");\n const lastPart = parts[parts.length - 1];\n // check if the last part is a file\n if (lastPart.includes(\".\")) {\n // remove the file part\n parts.pop();\n }\n return parts.join(\"/\");\n}\n\n\n/**\n * @param {string} filename\n * @param {string} newExtension e.g. \".glb\"\n */\nexport function changeExtension(filename, newExtension) {\n return filename.replace(/\\.[^/.]+$/, newExtension);\n}\n\n\n\n/**\n * @param {number} size\n * @param {number | undefined} precision\n */\nexport function toHumanReadableSizeString(size, precision = undefined, postfix = true) {\n const absoluteSize = Math.abs(size);\n if (absoluteSize >= 1024 * 1024 * 1024 * 1024) {\n let pp = postfix ? \" TB\" : \"\";\n const _precision = precision === undefined ? 2 : precision;\n return (size / (1024 * 1024 * 1024 * 1024)).toFixed(_precision) + pp;\n }\n else if (absoluteSize >= 1024 * 1024 * 1024) {\n let pp = postfix ? \" GB\" : \"\";\n const _precision = precision === undefined ? 2 : precision;\n return (size / (1024 * 1024 * 1024)).toFixed(_precision) + pp;\n }\n else if (absoluteSize >= 1024 * 1024) {\n let pp = postfix ? \" MB\" : \"\";\n const _precision = precision === undefined ? 1 : precision;\n return (size / (1024 * 1024)).toFixed(_precision) + pp;\n }\n else if (absoluteSize >= 1024) {\n let pp = postfix ? \" KB\" : \"\";\n const _precision = precision === undefined ? 0 : precision;\n return (size / 1024).toFixed(_precision) + pp;\n }\n let pp = postfix ? \" B\" : \"\";\n return size.toFixed(0) + pp;\n}\n\n\n/**\n * @param {string} str\n */\nexport function removeFilePaths(str) {\n // https://regex101.com/r/kHtERT/1\n const rgx = /(([\\d\\w\\-\\_\\:]+[\\\\|\\/]){2,})/g;\n // @ts-ignore\n return str.replaceAll(rgx, \"\");\n}\n\n\n// export function shortFilePath(str){\n// // https://regex101.com/r/TqFyc6/2\n// const rgx = /[a-zA-Z0-9\\-\\_]*?[\\\\\\/]\\w+\\.\\w{2,5}/g;\n// // remove\n// }\n\n\n\n/**\n * @param {string} path\n */\nexport function resolvePath(path) {\n return path.split('/')\n .reduce((a, v) => {\n if (v === '.') { } // do nothing\n else if (v === '..') a.pop();\n else if (v?.length) a.push(v);\n return a;\n }, [])\n .join('/');\n}","import { compareVersions } from 'compare-versions';\n\n\n/**\n * @param {number} ms\n */\nexport async function delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n\n/**\n * @param {string} str\n */\nexport function emailToDisplayName(str) {\n if (!str) return str;\n str = str.split(\"@\")[0];\n str = str.replace(/[^a-zA-Z0-9]/g, \" \");\n str = str.replace(/\\s+/g, \" \");\n // make first letter after space uppercase\n str = str.split(\" \").map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase()).join(\" \");\n return str;\n}\n\n\n/**\n * @param {string} semver1\n * @param {string} semver2\n */\nexport function compareSemVer(semver1, semver2) {\n return compareVersions(semver1, semver2);\n}\n\n\n/**\n * @param {Date | number} start\n * @param {Date | number} end\n * @param {{allowSimple?:boolean, prefix?:boolean, suffix?:boolean} | undefined} opts\n * @return {string}\n */\nexport function toHumanReadableTimeDifference(start, end, opts = undefined) {\n\n if (start instanceof Date) start = start.getTime();\n if (end instanceof Date) end = end.getTime();\n\n let diff = end - start;\n let isInThePast = diff > 0;\n const allowPrefix = opts?.prefix !== false;\n const prefix = !allowPrefix ? \"\" : isInThePast ? \"\" : \"in \";\n const allowSuffix = opts?.suffix !== false;\n const suffix = !allowSuffix ? \"\" : isInThePast ? \" ago\" : \"\";\n\n if (diff < 0) diff = -diff;\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(months / 12);\n if (years === 1) return `${prefix}1 year${suffix}`;\n if (years > 1) return `${prefix}${Math.floor(years)} years${suffix}`;\n if (months === 1) return `${prefix}1 month${suffix}`;\n if (months > 1) return `${prefix}${Math.floor(months)} months${suffix}`;\n if (days === 1) {\n if (isInThePast && opts?.allowSimple) return `yesterday`;\n return `${prefix}1 day${suffix}`;\n }\n if (days > 1) return `${prefix}${Math.floor(days)} days${suffix}`;\n if (hours === 1) return `${prefix}1 hour${suffix}`;\n if (hours > 1) return `${prefix}${Math.floor(hours)} hours${suffix}`;\n if (minutes === 1) return `${prefix}1 minute${suffix}`;\n if (minutes > 1) return `${prefix}${Math.floor(minutes)} minutes${suffix}`;\n if (opts?.allowSimple) {\n if (seconds < 10) return \"just now\";\n }\n return `${prefix}${seconds.toFixed(0)} seconds${suffix}`;\n}","import { compareSemVer } from \"./utils.js\";\n\n\nconst pipelinePackageName = \"@needle-tools/gltf-build-pipeline\";\nconst npmBaseUrl = \"https://registry.npmjs.org\";\n\n/**\n * @returns {Promise<string>}\n */\nexport async function getLatestPipelineVersion() {\n const url = `${npmBaseUrl}/${pipelinePackageName}`;\n const res = await fetch(url);\n const json = await res.json();\n const latestVersion = json[\"dist-tags\"].latest;\n return latestVersion;\n}\n\n\n/**\n * @param {import(\"../types/index.js\").JobModel} job\n * @returns {string|null}\n */\nfunction getUsedPipelineVersionFromJob(job) {\n if (job.type !== \"optimization\") return null;\n\n\n if (job.meta?.worker.name === \"@needle-tools/gltf-build-pipeline\") {\n const version = job.meta?.worker.version;\n if (version === \"*\") return null;\n return version;\n }\n\n const params = /** @type {import(\"../types/index.js\").OptimizationParameters} */ (job.parameters);\n const version = params.pipeline_version;\n if (version === \"*\") return null;\n return version || null;\n}\n\n\n/**\n * @typedef {{semver:string, index:number}} LatestVersionMapValue\n * This map contains the latest version of each job_parameter key\n * @type {Map<string, LatestVersionMapValue>}\n */\nconst latest_version_map = new Map();\n\n/**\n * @param {import(\"../types/index.js\").JobModel[]} jobs\n * @param {{pipeline_version:string}} opts\n */\nexport function getJobsThatCanBeRunAgain(jobs, opts) {\n\n // opts.pipeline_version = \"1.5.0-alpha.13\";\n\n latest_version_map.clear();\n\n /**\n * @type {import(\"../types/index.js\").JobModel[]}\n */\n const res = new Array();\n\n jobs.filter((job, index, arr) => {\n if (job.type === \"optimization\") {\n if (job.status == \"running\") {\n return false;\n }\n else if (job.status == \"pending\" || job.status == \"new\") {\n return false;\n }\n\n const job_pipeline_version = getUsedPipelineVersionFromJob(job);\n\n const isOld = !job_pipeline_version || compareSemVer(\n opts.pipeline_version,\n job_pipeline_version,\n ) > 0;\n if (isOld) {\n // if this job is using an old pipeline check if we have any other job that has the same input parameters that is using this pipeline\n const jobParamsWithoutPipeline = /** @type {Partial<import(\"../types/index.js\").OptimizationParameters>} */ ({ ...job.parameters });\n delete jobParamsWithoutPipeline.pipeline_version;\n const jobParamsWithoutPipelineStr = JSON.stringify(jobParamsWithoutPipeline);\n for (let k = 0, l = arr.length; k < l; k++) {\n const other = arr[k];\n if (other === job) continue;\n if (other.identifier === job.identifier) continue;\n if (other.type != \"optimization\") continue;\n // compare parameters without pipeline_version\n const otherParams = /** @type {Partial<import(\"../types/index.js\").OptimizationParameters>} */ ({ ...other.parameters });// as Partial<OptimizationParameters>;\n // ignore old jobs that don't have a pipeline version\n if (otherParams.pipeline_version == undefined) continue;\n\n delete otherParams.pipeline_version;\n const otherParamsStr = JSON.stringify(otherParams);\n if (otherParamsStr === jobParamsWithoutPipelineStr) {\n // console.log(\"COMPARE\\n\" + otherParamsStr + \"\\n\" + jobParamsWithoutPipelineStr, other, otherParamsStr === jobParamsWithoutPipelineStr);\n if (compareSemVer(\n opts.pipeline_version,\n ( /** @type {import(\"../types/index.js\").OptimizationParameters} */ (other.parameters)).pipeline_version,\n ) <= 0) {\n return false;\n }\n }\n }\n\n // Now check if there's already a job with the same parameters that was using a newer pipeline version (we only want to run the latest job again)\n\n const key = jobParamsWithoutPipelineStr;\n const index = res.length;\n\n if (!latest_version_map.get(key)) {\n latest_version_map.set(key, { semver: job_pipeline_version ?? \"\", index });\n }\n else {\n const latest = /** @type {LatestVersionMapValue} */ (latest_version_map.get(key));\n const semverCheck = compareSemVer(latest.semver, job_pipeline_version ?? \"\");\n if (semverCheck < 0) {\n // replace the previously added job with the latest one\n console.log(\"REPLACE\", latest.semver, \"with\", job_pipeline_version)\n res[latest.index] = job;\n latest.semver = job_pipeline_version ?? \"\";\n return false;\n }\n else {\n // ignore this job\n return false;\n }\n }\n\n // insert the new job\n res.push(job);\n return true;\n }\n }\n return false;\n });\n\n return res;\n}\n\n\n// https://regex101.com/r/QUJVbm/1\nconst lod_asset_filename_regex = /^image_(?<image_lod>\\d+)_|^mesh_lod_(?<mesh_lod>\\d+)_/;\n\n/**\n * @param {string | null | undefined} filename\n * @returns {boolean}\n */\nexport function isLODAssetFilename(filename) {\n if (!filename) return false;\n if (lod_asset_filename_regex.test(filename)) {\n return true;\n }\n return false;\n}\n\n/**\n * @param {string} filename\n * @returns {number | null}\n */\nexport function getLODAssetLevelFromFilename(filename) {\n const match = lod_asset_filename_regex.exec(filename);\n if (match) {\n const image_lod = match.groups?.image_lod;\n const mesh_lod = match.groups?.mesh_lod;\n if (image_lod) {\n return parseInt(image_lod);\n }\n if (mesh_lod) {\n return parseInt(mesh_lod);\n }\n }\n return null;\n}\n","import { resolvePath } from \"./file.utils.js\";\nimport { isLODAssetFilename } from \"./utils.optimization.js\";\n\n/** \n * @typedef GLTF\n * @property {{generator?:string,version:string,copyright?:string}} asset\n */\n\n/**\n * Validates files if they can be uploaded - e.g. if a glTF file references all resources\n * @param {import(\"../types\").FileWithPath[]} files\n * @returns {Promise<{success:boolean, vrm_count: number, gltf_count: number, glb_count: number} | {error:string}>}\n */\nexport async function validateFiles(files) {\n\n const maxFileNumber = 5_000;\n if (files.length > maxFileNumber) {\n return { success: false, error: `Too many files. Maximum filecount is ${maxFileNumber}` };\n }\n\n let totalSize = 0;\n const maxSizeInTotal = /** 1024 MB */ 1_024 * 1024 * 1024;\n let vrm_files = 0;\n let gltf_files = 0;\n let glb_files = 0;\n let glb_lod_files = 0;\n\n for (let i = files.length - 1; i >= 0; i--) {\n const file = files[i];\n\n totalSize += file.size;\n\n if (totalSize > maxSizeInTotal) {\n return {\n success: false, error: `Total file size exceeds limit of ${(maxSizeInTotal / 1024 / 1024).toFixed(0)} MB. Please reduce the size of your upload.`\n }\n }\n\n const lowercaseFilename = file.name.toLocaleLowerCase();\n if (lowercaseFilename === \".ds_store\") {\n // console.log(\"🚫 Remove .DS_Store file from upload\");\n files.splice(i, 1);\n continue;\n }\n else if (lowercaseFilename.endsWith(\".gltf\")) {\n gltf_files++;\n }\n else if (lowercaseFilename.endsWith(\".glb\")) {\n if (isLODAssetFilename(lowercaseFilename)) {\n glb_lod_files++;\n }\n else\n glb_files++;\n }\n else if (lowercaseFilename.endsWith(\".vrm\")) {\n vrm_files++;\n }\n\n // check if referenced files in the glTF are also included\n if (lowercaseFilename.endsWith(\".gltf\")) {\n gltf_files += 1;\n console.log(`Found glTF file ${file.name}. Will check if all dependencies are available\\n`, files);\n const content = await file.text();\n const uris = content.matchAll(/\"uri\"\\s*:\\s*\"(?<value>.*?)\"/g);\n if (!uris) {\n continue;\n }\n\n /** @type {GLTF} */\n const json = JSON.parse(content);\n if (json.asset.version !== \"2.0\") {\n console.warn(\"⚠ glTF version is not 2.0. This is currently not supported.\");\n return { success: false, error: `glTF version ${json.asset.version} is unsupported.Please use glTF 2.0.` };\n }\n\n const parts = file.path?.split(\"/\");\n const basePath = parts.splice(0, parts.length - 1).join(\"/\");\n for (const uri of uris) {\n const value = uri.groups?.value;\n if (value) {\n // TODO: check that no file is referenced OUTSIDE of the glTF directory\n let found = false;\n\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\") || value.startsWith(\"www.\")) {\n console.log(`✅ Found remote dependency ${value} `);\n break;\n }\n else if (value.startsWith(\"data:\")) {\n console.log(`✅ Found embedded dependency ${value} `);\n break;\n }\n else {\n const resourcePath = resolvePath(`${basePath}/${tryToDecodeFilename(value)}`);\n console.log(\"❓ Check if local dependency exists \\\"\" + resourcePath + \"\\\"\");\n for (const f of files) {\n if (f.webkitRelativePath === resourcePath || f.name == resourcePath) {\n found = true;\n console.log(`✅ Found dependency in name or webkit: ${f.name} || ${f.webkitRelativePath} `);\n break;\n }\n const fileWithPath = /** @type {import(\"../types\").FileWithPath} */ (f);\n if (fileWithPath.path === resourcePath) {\n found = true;\n console.log(`✅ Found dependency in path: ${f.path} `);\n break;\n }\n }\n }\n\n if (!found) {\n console.warn(\"⚠ Missing dependency \" + value, basePath);\n return { success: false, error: \"Missing resource: \" + value };\n }\n }\n }\n }\n }\n\n return {\n success: true,\n vrm_count: vrm_files,\n gltf_count: gltf_files,\n glb_count: glb_files\n };\n}\n\n/**\n * @param {string} filename\n */\nfunction tryToDecodeFilename(filename) {\n if (filename.includes(\"\\\\u\")) {\n return JSON.parse(`\"${filename}\"`);\n }\n return decodeURIComponent(filename);\n}\n\n\n\n/**\n * @param {import(\"../types\").FileWithPath[]} files\n * @returns {import(\"../types\").FileWithPath | {error:string}}\n */\nexport function tryDetermineEntrypoint(files) {\n\n let entryPointFile = null;\n let error = \"\";\n\n // for (const file of files) {\n\n // const ext = file.name.split(\".\").pop();\n // switch (ext?.toLowerCase()) {\n // case \"glb\":\n // case \"gltf\":\n // case \"vrm\":\n // case \"usdz\":\n // entryPointFile = file;\n // break;\n // }\n\n // }\n\n // TODO: this doesnt check if the file is loaded in the root\n const indexHtml = files.filter(f => f.name.toLowerCase() === \"index.html\" || f.name.toLowerCase() === \"index.html.gz\" || f.name.toLowerCase() === \"index.html.br\");\n if (indexHtml.length === 1) {\n entryPointFile = indexHtml[0];\n return entryPointFile;\n }\n // get HTML files\n const htmlFiles = files.filter(f => f.name.toLowerCase().endsWith(\".html\") || f.name.toLowerCase().endsWith(\".htm\") || f.name.toLowerCase().endsWith(\".html.gz\") || f.name.toLowerCase().endsWith(\".html.br\"));\n if (htmlFiles.length === 1) {\n return htmlFiles[0];\n }\n else if (htmlFiles.length > 1) {\n // It's now not really clear anymore which html file should be the entrypoint\n // We will split the files by directories\n // We then take the html files in the shortest directories (this can be the root or a subfolder)\n // If any of them is named index we take that one - otherwise we take the next best one\n /**\n * @type {Map<number, import(\"../types\").FileWithPath[]>}\n */\n const htmlFilesByDirectory = new Map();\n for (const file of htmlFiles) {\n const parts = file.path.split(\"/\");\n let bucket = htmlFilesByDirectory.get(parts.length);\n if (!bucket) {\n bucket = [];\n htmlFilesByDirectory.set(parts.length, bucket);\n }\n bucket.push(file);\n }\n // now we have the html files grouped by their directory depth\n const sortedKeys = Array.from(htmlFilesByDirectory.keys()).sort((a, b) => a - b);\n if (sortedKeys.length > 0) {\n for (const key of sortedKeys) {\n const bucket = htmlFilesByDirectory.get(key);\n if (!bucket) continue;\n // check if any of the files is named index.html\n const indexFile = bucket.find(f => f.name.toLowerCase() === \"index.html\" || f.name.toLowerCase() === \"index.html.gz\" || f.name.toLowerCase() === \"index.html.br\");\n if (indexFile) {\n entryPointFile = indexFile;\n return entryPointFile;\n }\n\n // otherwise just take the first file in this bucket\n entryPointFile = bucket[0];\n return entryPointFile;\n }\n }\n\n error = \"Invalid upload: Multiple HTML files found but could not determine root.\";\n console.error(error, htmlFiles.map(f => f.path || f.name));\n return { error }\n }\n\n const glTF_Files = files.filter(f => f.name.toLowerCase().endsWith(\".glb\") || f.name.toLowerCase().endsWith(\".gltf\") || f.name.toLowerCase().endsWith(\".vrm\"));\n if (glTF_Files.length > 1) {\n const opt = tryFindEntrypointGLTF(glTF_Files);\n if (opt) {\n entryPointFile = opt;\n return entryPointFile;\n }\n\n error = \"Invalid upload: Multiple glb/glTF/vrm files found. This is currently not supported.\";\n console.error(error, glTF_Files.map(f => f.path || f.name));\n return { error }\n }\n else if (glTF_Files.length === 1) {\n entryPointFile = glTF_Files[0];\n return entryPointFile;\n }\n\n\n const usdFiles = files.filter(f => f.name.toLowerCase().endsWith(\".usdz\") || f.name.toLowerCase().endsWith(\".usd\") || f.name.toLowerCase().endsWith(\".usda\") || f.name.toLowerCase().endsWith(\".usdc\"));\n if (usdFiles.length >= 1) {\n entryPointFile = findFileWithShortestPath(usdFiles);\n }\n\n const fbxFiles = files.filter(f => f.name.toLowerCase().endsWith(\".fbx\"));\n if (fbxFiles.length > 1) {\n error = \"Invalid upload: Multiple fbx files found. This is currently not supported.\";\n console.error(error, fbxFiles);\n return { error }\n }\n else if (fbxFiles.length === 1) {\n entryPointFile = fbxFiles[0];\n return entryPointFile;\n }\n\n const objFiles = files.filter(f => f.name.toLowerCase().endsWith(\".obj\"));\n if (objFiles.length > 1) {\n error = \"Invalid upload: Multiple obj files found. This is currently not supported.\";\n console.error(error, objFiles);\n return { error }\n }\n else if (objFiles.length === 1) {\n entryPointFile = objFiles[0];\n return entryPointFile;\n }\n\n const stlFiles = files.filter(f => f.name.toLowerCase().endsWith(\".stl\"));\n if (stlFiles.length > 1) {\n error = \"Invalid upload: Multiple stl files found. This is currently not supported.\";\n console.error(error, stlFiles);\n return { error }\n }\n else if (stlFiles.length === 1) {\n entryPointFile = stlFiles[0];\n return entryPointFile;\n }\n\n // Special case for dropped text/uri-list: there's only one file drop and that is an URL\n if (files.length === 1 && !files[0].arrayBuffer && files[0].path.toLowerCase().startsWith(\"http\")) {\n entryPointFile = files[0];\n return entryPointFile;\n }\n\n const packageJsons = files.filter(f => f.name.toLowerCase().endsWith(\"package.json\"));\n if (packageJsons.length === 1) {\n entryPointFile = packageJsons[0];\n return entryPointFile;\n }\n else if (packageJsons.length > 1) {\n error = \"Invalid upload: Multiple package.json files found. This is currently not supported.\";\n console.error(error, packageJsons);\n return { error }\n }\n\n if (!entryPointFile) {\n return { error: \"No supported file to upload found...\" };\n }\n\n return entryPointFile;\n\n}\n\n/**\n * @param {Array<import(\"../types\").FileLike | File | import(\"../types\").FileWithPath>} files\n */\nexport function containsHtmlFiles(files) {\n return files.some(f => {\n let name = f.name.toLowerCase();\n if (name.endsWith(\".html\") || name.endsWith(\".htm\") || name.endsWith(\".html.gz\") || name.endsWith(\".html.br\")) {\n return true;\n }\n else if (\"mimetype\" in f && f.mimetype === \"text/html\") {\n return true;\n }\n return false;\n })\n}\n\n\n/**\n * @param {import(\"../types\").FileWithPath[]} files\n */\nfunction tryFindEntrypointGLTF(files) {\n // lets ignore all the LOD mesh and texture files because they are never the entrypoint\n const candidates = new Array();\n const lodRegex = /(mesh_lod|image)_\\d_(.{1,50})/; // https://regex101.com/r/v0k6eB/1\n for (const file of files) {\n if (lodRegex.test(file.name)) continue;\n const name = file.name.toLowerCase();\n if (name.endsWith(\".gltf\") || name.endsWith(\".vrm\") || name.endsWith(\".glb\")) {\n candidates.push(file);\n }\n }\n if (candidates.length == 1) {\n return candidates[0];\n }\n return findFileWithShortestPath(candidates);\n}\n\n\n/**\n * @param {import(\"../types\").FileWithPath[]} options\n * @returns {import(\"../types\").FileWithPath | null}\n */\nfunction findFileWithShortestPath(options) {\n let index = -1;\n let shortest = Infinity;\n // TODO: this does currently not take into account that multiple files might have the same length\n // then just one will be chosen (e.g. 2 files at the same level)\n for (let i = 0; i < options.length; i++) {\n const f = options[i];\n if (f.path.split(\"/\").length < shortest) {\n shortest = f.path.split(\"/\").length;\n index = i;\n }\n }\n if (index < 0) return null;\n return options[index];\n}\n\n\n\n","export class UploadEstimator {\n /**\n * @param {number} totalFiles\n * @param {number} estimatedTotalSize\n */\n constructor(totalFiles, estimatedTotalSize) {\n this.totalFiles = totalFiles;\n this.estimatedTotalSize = estimatedTotalSize;\n this.uploadedSize = 0;\n this.startTime = Date.now();\n this.lastUpdateTime = this.startTime;\n this.lastUploadedSize = 0;\n this.speedEMA = null;\n this.emaFactor = 0.1; // Reduced for more stability\n this.smoothedRemainingTime = null;\n this.recentSpeeds = new Array();\n this.maxRecentSpeeds = 20; // Increased for better averaging\n this.initialEstimateThreshold = 0.05; // 5% progress threshold for initial estimate\n }\n\n /**\n * @param {number} totalUploadedSize\n */\n updateProgress(totalUploadedSize) {\n const now = Date.now();\n const timeDiff = (now - this.lastUpdateTime) / 1000; // in seconds\n const newlyUploadedSize = totalUploadedSize - this.lastUploadedSize;\n this.uploadedSize = totalUploadedSize;\n\n if (timeDiff > 0 && newlyUploadedSize > 0) {\n const instantSpeed = newlyUploadedSize / timeDiff;\n this.recentSpeeds.push(instantSpeed);\n if (this.recentSpeeds.length > this.maxRecentSpeeds) {\n this.recentSpeeds.shift();\n }\n const averageRecentSpeed = this.recentSpeeds.reduce((a, b) => a + b, 0) / this.recentSpeeds.length;\n this.speedEMA = this.speedEMA === null ? averageRecentSpeed : (this.emaFactor * averageRecentSpeed + (1 - this.emaFactor) * this.speedEMA);\n }\n\n this.lastUpdateTime = now;\n this.lastUploadedSize = totalUploadedSize;\n\n const progress = this.uploadedSize / this.estimatedTotalSize;\n const elapsedTime = (now - this.startTime) / 1000; // in seconds\n\n // Use EMA speed for estimation, fall back to average speed if EMA is not reliable\n const effectiveSpeed = (this.speedEMA && this.speedEMA > 0) ? this.speedEMA : (this.uploadedSize / elapsedTime);\n\n let remainingTime;\n if (effectiveSpeed > 0) {\n const remainingSize = this.estimatedTotalSize - this.uploadedSize;\n remainingTime = remainingSize / effectiveSpeed;\n } else {\n remainingTime = Infinity;\n }\n\n // Apply smoothing only after initial estimate threshold\n if (progress >= this.initialEstimateThreshold) {\n if (this.smoothedRemainingTime === null) {\n this.smoothedRemainingTime = remainingTime;\n } else {\n const smoothingFactor = 0.1; // Fixed smoothing factor for stability\n this.smoothedRemainingTime = (1 - smoothingFactor) * this.smoothedRemainingTime + smoothingFactor * remainingTime;\n }\n } else {\n // Before threshold, use a simple estimate based on current progress\n this.smoothedRemainingTime = (elapsedTime / progress) - elapsedTime;\n }\n\n // Ensure the estimate is not less than the time to upload at the current speed\n const minRemainingTime = (this.estimatedTotalSize - this.uploadedSize) / effectiveSpeed;\n this.smoothedRemainingTime = Math.max(this.smoothedRemainingTime, minRemainingTime);\n\n return {\n progress: progress * 100,\n estimatedTimeRemaining: Math.round(this.smoothedRemainingTime),\n estimatedTimeRemainingString: this.smoothedRemainingTime > 3 ? this.__formatTime(this.smoothedRemainingTime) : \"few seconds\"\n };\n }\n\n /**\n * @param {number} seconds\n */\n __formatTime(seconds) {\n if (!isFinite(seconds) || seconds > 24 * 60 * 60) return 'Calculating...';\n if (seconds < 60) return `${Math.round(seconds)}sec`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}min`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h ${minutes % 60}min`;\n }\n}","import axios, { CanceledError } from \"axios\";\nimport { updateJobStatus } from \"./api.jobs.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { getFileMimeType, getUncompressedFileMimeType, hashContentMD5, toHumanReadableSizeString } from \"./file.utils.js\";\nimport { delay } from \"./utils.js\";\nimport { tryDetermineEntrypoint, validateFiles } from \"./api.upload.validate.js\";\nimport { createAuthHeaders } from \"./api.auth.js\";\nimport { UploadEstimator } from \"./utils.upload.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\nimport { gzipCompress } from \"./file.archive.js\";\n\n/**\n * @typedef {Object} UploadFilesOptions\n * @property {import(\"../types\").TriggerType} triggered_by\n * @property {import(\"../types\").FileWithPath[]} files\n * @property {import(\"../types\").FileWithPath | undefined} entrypoint\n * @property {boolean | undefined} [experimental]\n * @property {boolean | undefined} [raw]\n */\n\n/**\n * @typedef {Object} UploadFilesResponse\n * @property {true} success If the upload was successful\n * @property {string} id The job id of the upload\n * @property {string} view_id The view id of the upload\n * @property {string | undefined | null} [url] The url of the upload\n * @property {boolean | undefined} uploadSkipped\n * @property {number} filesUploaded The number of files uploaded\n * @property {number} totalSize The total size of the uploaded files in bytes\n * @property {import(\"../types\").JobModel[\"type\"]} type The type of the upload \n */\n\n/**\n * List of currently running upload promises\n * @type {Array<Promise<any>>}\n */\nconst currentUploads = [];\n\n\n/** Is there currently an upload in progress?\n * @returns {boolean}\n */\nexport function isFileUploadInProgress() {\n return currentUploads.length > 0;\n}\n\n// TODO: the following jsdoc should probably be a type definition because we re-use it in multiple places\n/**\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args\n * @param {UploadFilesOptions} data\n * @param {import(\"../types\").UploadFilesOptions | undefined} options\n * @returns {Promise<{success:false, error:string} | UploadFilesResponse>}\n */\nexport async function uploadFiles(args, data, options = undefined) {\n const uploadPromise = internalUploadFiles(args, data, options);\n // register the upload promise to the list of current uploads\n currentUploads.push(uploadPromise);\n const result = await uploadPromise\n // make sure to remove the promise from the list of current uploads\n .finally(() => {\n const index = currentUploads.indexOf(uploadPromise);\n if (index >= 0) {\n currentUploads.splice(index, 1);\n }\n })\n return result;\n}\n\n\n/**\n * @param {{baseUrl:string} & import(\"../types\").AuthData} args\n * @param {UploadFilesOptions} data\n * @param {import(\"../types\").UploadFilesOptions | undefined} options\n * @returns {Promise<{success:false, error:string, status?:number} | UploadFilesResponse>}\n */\nasync function internalUploadFiles(args, data, options = undefined) {\n\n const files = data.files;\n const loglevel = options?.loglevel || \"none\";\n\n if (!files.length) {\n if (loglevel != \"none\") console.error(\"No files to upload\");\n return { success: false, error: \"No files to upload\" };\n }\n\n if (!data.entrypoint) {\n const entrypoint = tryDetermineEntrypoint(files);\n if (entrypoint == null) {\n return { success: false, error: \"No entrypoint file found\" };\n }\n else if (typeof entrypoint === \"object\" && \"error\" in entrypoint) {\n const error = entrypoint;\n return { success: false, error: error.error };\n }\n if (loglevel === \"info\") console.log(\"Entrypoint: \" + entrypoint.name);\n data.entrypoint = entrypoint;\n }\n\n if (data.entrypoint && !files.includes(data.entrypoint)) {\n files.push(data.entrypoint);\n }\n\n const validation = await validateFiles(files);\n if (\"error\" in validation) {\n return { success: false, error: validation.error || \"Failed to validate files\" };\n }\n\n // if the files entrypoint is a HTML files we consider the upload a deployment\n // TODO: perhaps this is something the server should determine/validate\n if (data.entrypoint?.name.endsWith(\".htm\") || data.entrypoint?.name.endsWith(\".html\") || data.entrypoint?.name.endsWith(\".html.gz\") || data.entrypoint?.name.endsWith(\".html.br\")) {\n if (!options) options = {};\n options.type = \"deployment\";\n }\n // TODO: we allow more here again because we want to be able to deplay websites and run optimization. We need to count usage and prevent abuse in a different way\n else if (validation.vrm_count > 10) {\n return {\n success: false,\n error: \"Multiple model files found - this is not supported for asset uploads. Please upload a single model file only.\"\n };\n }\n\n // if we have uncompressed HTML/JS/CSS files we want to gzip them\n if(data.raw) {\n if (loglevel != \"none\") console.warn(\"Raw upload - skipping gzip compression of files\");\n }\n else {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const lowercaseName = file.name.toLowerCase();\n if (lowercaseName.endsWith(\".html\") || lowercaseName.endsWith(\".js\") || lowercaseName.endsWith(\".css\")) {\n if (options?.loglevel !== \"none\") console.log(`gZip compressing file: ${file.name}`);\n const compressedFile = await gzipCompress(file).catch(e => {\n return { error: `Error compressing ${file.name}: ${e.message}` }\n });\n if (compressedFile === null) {\n if (options?.loglevel !== \"none\") console.error(`Did not compress file: ${file.name}`);\n continue;\n }\n if (\"error\" in compressedFile) {\n return { success: false, error: compressedFile.error, status: 500 };\n }\n else if (!compressedFile) {\n return { success: false, error: `Failed to compress ${file.name}`, status: 500 };\n }\n const isEntrypoint = data.entrypoint === file;\n files[i] = compressedFile;\n if (isEntrypoint) {\n data.entrypoint = compressedFile;\n }\n if (options?.loglevel !== \"none\") console.log(`gZip compressed file: ${file.name} ${isEntrypoint ? \"(entrypoint)\" : \"\"}`);\n }\n }\n }\n\n // sort files so that `.needle` files are uploaded first\n files.sort((a, b) => {\n if (a.name.includes(\".needle\") && !b.name.includes(\".needle\")) return -1;\n if (!a.name.includes(\".needle\") && b.name.includes(\".needle\")) return 1;\n return 0;\n });\n\n const { baseUrl, authToken } = args;\n const authHeader = \"Bearer \" + authToken;\n /** @type {import(\"../types\").UploadBeginRequestHeaders} */\n const beginUploadHeaders = {\n ...createAuthHeaders(args),\n triggered_by: data.triggered_by,\n filename: `${encodeURIComponent(data.entrypoint.name)}`,\n \"total-files\": files.length.toString(),\n \"total-files-size\": files.reduce((acc, f) => acc + f.size, 0).toString(),\n }\n if (options?.view_id) {\n beginUploadHeaders.view_id = options.view_id;\n }\n if (options?.type) {\n beginUploadHeaders.type = options.type;\n }\n if (options?.name) {\n // ONLY pass in a name if it is explictly set. Otherwise the upload might be associated with a wrong view (since we use this name to find the view that this upload belongs to)\n beginUploadHeaders.name = encodeURIComponent(options.name);\n }\n if (options?.parent_job_id) {\n beginUploadHeaders.parent_job_id = options.parent_job_id;\n }\n\n /**\n * @type { import(\"../types\").UploadBeginRequestBody}\n */\n const beginRequestBody = {\n results: {\n entrypoint: data.entrypoint?.path || data.entrypoint?.name,\n files: [],\n }\n }\n /** @type {Array<ArrayBuffer>} */\n const fileBuffers = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n let fileName = file.path || file.webkitRelativePath || file.name;\n if (fileName?.includes(\":\")) {\n throw new Error(`Invalid filename: ${fileName}`);\n }\n\n let fileBuffer = await file.arrayBuffer();\n\n const filesize = file.size;\n let filetype = file.type;\n // If we don't have a file type\n if (!filetype?.length || filetype.toLowerCase() === \"unknown\") {\n filetype = getFileMimeType(fileBuffer, fileName);\n }\n\n // for a deployment we need to make sure to set the content type to the original file type\n if (options?.type === \"deployment\") {\n const uncompressedName = getUncompressedFileMimeType(fileName, filetype);\n if (uncompressedName) {\n fileName = uncompressedName.filename;\n filetype = uncompressedName.mimetype\n }\n }\n\n const md5 = hashContentMD5(fileBuffer);\n fileBuffers[i] = fileBuffer;\n beginRequestBody.results.files[i] = {\n filename: fileName,\n content_type: filetype,\n content_length: filesize,\n content_md5: md5,\n };\n }\n\n\n const res = await fetch(baseUrl + ShareApiEndpoints.upload.request, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: beginUploadHeaders,\n body: JSON.stringify(beginRequestBody),\n }).catch(err => {\n if (err.message == \"fetch failed\" || err.message == \"Failed to fetch\") {\n return `Network error. Make sure you are connected to the internet and ${baseUrl} is reachable.`;\n }\n console.error(\"Failed to begin upload\\n\", err);\n return null;\n });\n if (res === null || typeof res === \"string\") {\n return { success: false, error: res || \"Failed to begin upload\" };\n }\n if (!res.ok) {\n const text = await res.text();\n if (text.startsWith(\"{\")) {\n const json = JSON.parse(text);\n if (\"error\" in json) {\n return { success: false, status: res.status, error: json.error };\n }\n }\n if (loglevel != \"none\") console.error(\"Failed to begin upload\\n\", res.status, text);\n return { success: false, status: res.status, error: `${text}` };\n }\n\n /** @type { import(\"../types\").UploadBeginResponse} */\n const beginResponse = await res.json();\n if (loglevel === \"debug\") console.debug(\"BeginResponse\", beginResponse);\n\n const totalBytes = files.reduce((acc, f) => acc + f.size, 0);\n\n if (beginResponse.type === \"exists\") {\n if (loglevel != \"none\") console.log(\"Upload already exists\", beginResponse.id);\n return {\n success: true,\n uploadSkipped: true,\n id: beginResponse.id,\n type: beginResponse.job_type,\n view_id: beginResponse.view_id,\n filesUploaded: files.length,\n totalSize: totalBytes,\n url: beginResponse.url,\n };\n }\n\n const entrypointPath = data.entrypoint.webkitRelativePath || data.entrypoint.name;\n\n let uploadedBytes = 0;\n\n options?.abort?.addEventListener(\"abort\", async () => {\n console.log(\"Upload aborted: Cancelling upload\");\n await fetch(baseUrl + ShareApiEndpoints.upload.cancel, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: {\n authorization: authHeader,\n id: beginResponse.id,\n }\n });\n });\n\n /** This is set after a successful upload to ensure no async file upload that *might* be tangling is interfering */\n let uploadHasCompletedSuccessfully = false;\n let lastStatusUpdate = Date.now();\n /**\n * @param {string} message\n * @param {import(\"../types\").JobStatus} status\n */\n function updateStatus(message, status, force = false) {\n if (!force && Date.now() - lastStatusUpdate < 1000) return false;\n // safeguard to not override the status if it is already completed\n if (uploadHasCompletedSuccessfully && status !== \"completed\") {\n if (loglevel != \"none\") console.warn(\"Invalid status update...\");\n return;\n }\n lastStatusUpdate = Date.now();\n const progress = Math.floor(uploadedBytes / totalBytes * 100);\n if (loglevel === \"debug\") console.log(\"SET STATUS: \" + status, message, progress);\n updateJobStatus({\n identifier: beginResponse.id,\n status,\n status_message: message,\n progress,\n }, args);\n return true;\n }\n\n if (options?.onStart) {\n options.onStart(beginResponse.id, beginResponse.view_id);\n }\n\n const startTime = Date.now();\n const uploadEstimator = new UploadEstimator(files.length, totalBytes / 1024 / 1024);\n\n /** @type {Array<Promise<any>>} */\n const queue = new Array();\n const maxParallelUploads = 10;\n let anyUploadFailed = false;\n const filesCopy = [...files];\n const filesCount = files.length;\n for (let i = 0; i < filesCopy.length; i++) {\n if (options?.abort?.aborted) {\n console.debug(\"Upload aborted\");\n break;\n }\n else if (anyUploadFailed) {\n console.debug(\"Upload failed\");\n break;\n }\n if (queue.length < maxParallelUploads) {\n const file = files[i];\n console.debug(`Uploading file ${i}/${files.length}: ${file.name}`);\n let uploaded = 0;\n let lastUploaded = 0;\n const registeredFile = beginRequestBody.results.files[i];\n const fileName = registeredFile.filename;\n const fileBuffer = fileBuffers[i];\n const fileSize = registeredFile.content_length;\n const filetype = registeredFile.content_type;\n const originalFile = files[i];\n const contentEncoding = originalFile.name.endsWith(\".gz\") ? \"gzip\" : originalFile.name.endsWith(\".br\") ? \"br\" : undefined;\n const promise = performUpload({\n uploadId: beginResponse.id,\n uploadRequestPUTUrl: beginResponse.request_put_url,\n entrypointPath,\n file: files[i],\n fileName: fileName,\n fileMd5: registeredFile.content_md5,\n fileBuffer: fileBuffer,\n fileType: filetype,\n content_encoding: contentEncoding,\n fileSize,\n fileIndex: i,\n fileNumber: i + 1,\n fileCount: filesCount,\n loglevel,\n experimental: data.experimental,\n args,\n options,\n onProgress: progressEvent => {\n const fileProgress01 = progressEvent.progress || 0;\n uploaded = files[i].size * fileProgress01;\n const diff = uploaded - lastUploaded;\n lastUploaded = uploaded;\n uploadedBytes += diff;\n if (options?.progress) {\n const progress01 = uploadedBytes / totalBytes;\n const totalFiles = files.length;\n const fileSize = files[i].size;\n // let timeLeft = progressEvent.estimated ? \" (\" + progressEvent.estimated.toFixed(0) + \" seconds remaining)\" : \"\";\n const timePassedInSeconds = (Date.now() - startTime) / 1000;\n const estimation = uploadEstimator.updateProgress(uploadedBytes / 1024 / 1024);\n options.progress({\n uploadedBytes, totalBytes, progress01, fileName: files[i].name, fileSize, fileProgress01, fileIndex: i, totalFiles,\n estimatedTimeLeftDisplay: estimation.estimatedTimeRemainingString,\n estimatedTimeLeft: estimation.estimatedTimeRemaining,\n elapsedTime: timePassedInSeconds,\n });\n updateStatus(`Uploading file ${i + 1}/${totalFiles} (${fileName}): ${(fileProgress01 * 100).toFixed(0)}% of ${toHumanReadableSizeString(totalBytes)}. Finished in approx. ${estimation.estimatedTimeRemainingString}`,\n \"running\", false);\n }\n },\n }).then(_res => {\n if (_res !== true) {\n return _res;\n }\n for (let i = queue.length - 1; i >= 0; i--) {\n if (queue[i] === promise) {\n queue.splice(i, 1);\n }\n }\n let sizeString = toHumanReadableSizeString(uploadedBytes) + \" of \" + toHumanReadableSizeString(totalBytes);\n updateStatus(`Uploaded ${sizeString} for ${files[i].name}`, \"running\");\n }).catch(e => {\n if (options?.abort?.aborted) {\n console.warn(\"Upload aborted\");\n return;\n }\n console.error(e.message);\n anyUploadFailed = true;\n });\n queue.push(promise);\n }\n if (queue.length >= maxParallelUploads) {\n await Promise.race(queue);\n }\n }\n\n await Promise.all(queue).catch(e => {\n if (options?.abort?.aborted) {\n console.warn(\"Upload aborted\");\n return;\n }\n console.error(e.message);\n anyUploadFailed = true;\n });\n if (anyUploadFailed) {\n await updateJobStatus({\n identifier: beginResponse.id,\n status: \"failed\",\n error: \"Failed to upload files\",\n }, args);\n return { success: false, error: \"Failed to upload files\" };\n }\n if (options?.abort?.aborted) {\n await updateJobStatus({\n identifier: beginResponse.id,\n status: \"canceled\",\n status_message: \"Upload aborted\",\n error: \"Upload aborted\",\n }, args);\n return { success: false, error: \"Upload aborted\" };\n }\n\n uploadHasCompletedSuccessfully = true;\n\n console.log(`Upload Done: All files uploaded to ${beginResponse.id}`);\n /** @type {import(\"../types\").UploadDoneRequestHeaders}*/\n const doneRequestHeaders = {\n ...createAuthHeaders(args),\n id: beginResponse.id,\n }\n if (loglevel != \"none\") console.log(\"Completing upload - notify server\");\n\n /** @type {Response | null} */\n let doneResponse = null;\n const maxRetriesDone = 5;\n\n for (let i = 0; i < maxRetriesDone; i++) {\n await delay(i * 1000);\n const timeout = AbortSignal.timeout(20_000 + i * 1000);\n doneResponse = await fetch(baseUrl + ShareApiEndpoints.upload.done, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: doneRequestHeaders,\n signal: timeout,\n }).catch((e) => {\n console.error(`Failed to complete upload (${i + 1} / ${maxRetriesDone})`, e.message);\n return null;\n });\n // If the response is ok, we can break the loop\n if (doneResponse?.ok === true) {\n break;\n }\n if (loglevel != \"none\" && i < maxRetriesDone - 1) {\n console.warn(`Failed to complete upload (${doneResponse?.status || \"no status\"}): will retry in 1 second`);\n }\n }\n\n if (!doneResponse) {\n console.error(\"Failed to complete upload\");\n return { success: false, error: \"Failed to complete upload\" };\n }\n if (!doneResponse.ok) {\n if (doneResponse.status === 524) {\n console.error(\"Failed to complete upload: Gateway Timeout\");\n return { success: false, error: \"Failed to complete upload: Gateway Timeout\" };\n }\n else {\n const text = await doneResponse.text();\n console.error(`Failed to complete upload (${doneResponse.status}): ${text}`);\n return { success: false, error: \"Failed to complete upload\" };\n }\n }\n\n if (loglevel != \"none\") console.log(\"Upload complete\");\n\n /**\n * @type {import(\"../types\").UploadDoneRequestResponse}\n */\n const doneResponseJson = await doneResponse.json();\n return {\n success: true,\n type: doneResponseJson.type,\n uploadSkipped: false,\n id: doneResponseJson.id,\n view_id: doneResponseJson.view_id,\n url: doneResponseJson.url,\n filesUploaded: files.length,\n totalSize: totalBytes,\n };\n}\n\n\n\n\n/**\n * @param {{\n * uploadId:string,\n * uploadRequestPUTUrl:string,\n * entrypointPath:string,\n * file:import(\"../types\").FileWithPath,\n * fileName:string,\n * fileMd5:string,\n * fileBuffer:ArrayBuffer,\n * fileType:string,\n * fileSize:number,\n * fileNumber: number,\n * fileIndex:number,\n * fileCount:number,\n * content_encoding: undefined | \"gzip\" | \"br\",\n * loglevel: import(\"../types\").LogLevel,\n * args: {baseUrl:string} & import(\"../types\").AuthData,\n * options: import(\"../types\").UploadFilesOptions | undefined,\n * experimental: boolean | undefined,\n * onProgress: (evt:import(\"axios\").AxiosProgressEvent) => void,\n * }} params\n * @return {Promise<boolean>}\n */\nasync function performUpload(params) {\n const {\n uploadId,\n uploadRequestPUTUrl,\n entrypointPath,\n file,\n fileName,\n fileBuffer,\n fileMd5,\n fileSize,\n fileType,\n content_encoding,\n fileIndex,\n fileNumber,\n fileCount,\n loglevel,\n args,\n options,\n experimental,\n\n } = params;\n\n\n if (loglevel === \"info\") console.log(`Uploading file \\\"${file.name}\\\" type=${fileType} (${fileSize}) ${file.type} with hash ${fileMd5}`);\n /** @type {import(\"../types\").RequestPresignedUrlRequestHeaders} */\n const requestPresignedUrlHeaders = {\n ...createAuthHeaders(args),\n \"Content-Type\": \"application/json\",\n org: args.org,\n job_id: uploadId,\n filesize: fileSize.toString(),\n progress: (fileIndex / fileCount * 100).toFixed(0),\n }\n\n /**\n * @type {import(\"../types\").RequestPresignedUrlRequestBody}\n */\n const requestPresignedUrlBody = {\n filename: fileName,\n entrypoint: entrypointPath,\n \"content-type\": fileType,\n \"content-md5\": fileMd5,\n \"content-encoding\": content_encoding,\n }\n\n if (loglevel === \"debug\") {\n console.debug(\"Requesting presigned URL with headers\", requestPresignedUrlHeaders);\n }\n\n const jsonBody = JSON.stringify(requestPresignedUrlBody);\n\n /**\n * @type {null | import(\"../types\").RequestPutUrlResponse}\n */\n let json = null;\n let uploadErrorText = \"\";\n\n\n for (let k = 0; k < 5; k++) {\n if (json != null) break;\n if (options?.abort?.aborted) {\n throw new Error(\"Upload aborted\");\n }\n await delay(200 * k);\n json = await fetch(uploadRequestPUTUrl, {\n ...DEFAULT_FETCH_INIT,\n method: \"POST\",\n headers: requestPresignedUrlHeaders,\n body: jsonBody,\n }).then(async res => {\n if (!res.ok) {\n uploadErrorText = await res.text();\n const url = uploadRequestPUTUrl;\n console.log(url);\n console.warn(`Failed to get presigned url for \\\"${fileName}\\\" \\\"${fileType}\\\" (${res.status}).\\n→ Retrying...`);\n return null;\n }\n return await res.json();\n }).catch(err => {\n uploadErrorText = err.message;\n console.warn(\"Failed to get presigned url \" + err.message + \", retrying...\");\n return null;\n });\n }\n if (json == null) {\n throw new Error(`Failed to get presigned url for \\\"${fileName}\\\" \\\"${fileType}\\\" \\n${uploadErrorText}`);\n }\n\n const putUrl = json.presigned_url;\n var didUpload = false;\n /** @type {string | null} */\n let uploadError = null;\n for (let k = 0; k < 5; k++) {\n if (k > 0) {\n if (loglevel !== \"none\") console.log(`Retry PUT #${k} for file ${fileName}`);\n await delay(1000 * k);\n }\n if (options?.abort?.aborted) {\n throw new CanceledError(\"Upload aborted\");\n }\n /** @type {Record<string, string>} */\n const headers = {\n \"Content-Type\": fileType,\n \"Content-MD5\": fileMd5,\n }\n if (experimental) {\n headers[\"Content-Length\"] = fileSize.toString();\n }\n if (content_encoding) {\n headers[\"Content-Encoding\"] = content_encoding;\n }\n if (k === 0) {\n if (loglevel != \"none\") console.log(`Uploading file ${fileNumber}/${fileCount}: ${fileName}`);\n // else console.debug(`Uploading file ${fileNumber}/${fileCount}: ${fileName}`);\n }\n if (loglevel === \"debug\") {\n console.debug(\"PUT with headers\", headers);\n }\n const putResponse = await axios.put(putUrl, fileBuffer, {\n ...DEFAULT_FETCH_INIT,\n withCredentials: false,\n signal: options?.abort,\n headers,\n onUploadProgress: (progressEvent) => {\n params.onProgress(progressEvent);\n }\n }).catch((e) => {\n uploadError = e.message;\n if (!(e instanceof CanceledError)) {\n if (loglevel !== \"none\") {\n console.error(`Failed to upload file (PUT) (${fileNumber}, ${fileName}) \\\"${e.message}\\\"`);\n }\n if (loglevel === \"debug\") {\n console.log(headers, { fileSize });\n if (e.response) console.debug(e.response);\n else console.debug(e);\n }\n }\n return null;\n });\n if (!putResponse) {\n continue;\n }\n else if (putResponse.status !== 200) {\n uploadError = `${putResponse.statusText} (${putResponse.status})`;\n console.debug(`Failed (${putResponse.status} ${putResponse.status}) to upload file ${file.name} to \\\"${json.path}\\\". Retrying...`);\n continue;\n }\n else {\n didUpload = true;\n if (loglevel === \"info\") console.log(`Uploaded file ${fileNumber}/${fileCount} \"${fileName}\" (${fileType}, ${toHumanReadableSizeString(fileSize)})`);\n // else console.debug(`Uploaded file ${fileNumber}/${fileCount} \"${fileName}\" (${fileType}, ${toHumanReadableSizeString(fileSize)})`);\n break;\n }\n }\n if (!didUpload) {\n console.error(\"Failed to upload file \" + fileName);\n await updateJobStatus({\n identifier: uploadId,\n status: \"failed\",\n status_message: `Failed to upload file (${fileName}): ${uploadError?.substring(0, 200)}`,\n error: \"Failed to upload file \" + fileName,\n }, args);\n throw new Error(\"Failed to upload file \" + fileName);\n }\n\n return true;\n}","import { toFile } from \"./file.utils.js\";\n\n/**\n * @param {File | import(\"../types\").FileWithPath} file\n */\nexport function isZipFile(file) {\n return file.name.endsWith(\".zip\") ||\n file.type === \"application/zip\" ||\n file.type === \"application/x-zip-compressed\";\n}\n\n/**\n * Unzip all zip files found in an array of files - the unzipped files will be added to the array\n * @param {Array<File | import(\"../types\").FileWithPath>} files\n * @returns {Promise<{zipFiles:string[], files:Array<import(\"../types\").FileWithPath | File>}>}\n */\nexport async function unzipAllArchivesAndMerge(files) {\n const res = {\n zipFiles: Array(),\n files: files,\n }\n for (let i = res.files.length - 1; i >= 0; i--) {\n const file = res.files[i];\n if (isZipFile(file)) {\n const filesInZip = await unzipArchive(file);\n if (filesInZip) {\n res.zipFiles.push(file.name);\n res.files.splice(i, 1, ...filesInZip);\n }\n }\n }\n return res;\n}\n\n/**\n * @param {File | import(\"../types\").FileWithPath} file\n * @returns {Promise<null | import(\"../types\").FileWithPath[]>}\n */\nexport async function unzipArchive(file) {\n if (!file) {\n return null;\n }\n /**\n * @type {import(\"../types\").FileWithPath[]}\n */\n const result = [];\n const mod = await import(\"unzipit\");\n const array = await file.arrayBuffer();\n const { entries } = await mod.unzip(array);\n for (const [name, entry] of Object.entries(entries)) {\n const buffer = await entry.arrayBuffer();\n const file = toFile(entry.name, buffer);\n result.push(file);\n }\n return result;\n}\n\n\n/**\n * @param {File | import(\"../types\").FileWithPath} file\n * @returns {Promise<import(\"../types\").FileWithPath | null | {error:string}>}\n */\nexport async function gzipCompress(file) {\n const pako = await import(\"pako\");\n const inputArray = await file.arrayBuffer();\n const compUint = pako.gzip(new Uint8Array(inputArray));\n const compArr = compUint.buffer.slice(0);\n // if the file has at least 50 KB and gzip compression turns out larger\n if (compArr.byteLength > 1024 * 50 && compArr.byteLength >= inputArray.byteLength) {\n if (inputArray.byteLength > 0) // when compressing an empty file\n return null;\n }\n else if (!(compArr instanceof ArrayBuffer)) {\n console.error(\"gzipCompress: Invalid ArrayBuffer\");\n return { error: `Gzip compressing failed for \\\"${file.name}\\\" (unexpected result)` };\n }\n const name = \"path\" in file ? file.path : file.name;\n return toFile(`${name}.gz`, compArr, {\n type: \"application/gzip\",\n });\n}","import { MemoryCache } from \"./cache.js\";\nimport { emailToDisplayName } from \"./utils.js\";\n\n/**\n * @type {Array<{access_token:string, expires_at:number}>}\n */\nconst m2mAccessTokens = new Array();\n\n/**\n * @type {Promise<string> | null}\n */\nlet accessTokenPromise = null;\n/**\n * Request a new access token from logto for querying the logto API\n * @return {Promise<string>}\n */\nexport function getLogtoM2MAccessToken() {\n if (accessTokenPromise) {\n return accessTokenPromise;\n }\n accessTokenPromise = internalRequestM2MAccessToken();\n accessTokenPromise.finally(() => {\n accessTokenPromise = null;\n });\n return accessTokenPromise;\n}\n\n/**\n * @return {Promise<string>}\n */\nasync function internalRequestM2MAccessToken() {\n for (const token of m2mAccessTokens) {\n if (token.expires_at > Date.now()) {\n return token.access_token;\n }\n }\n m2mAccessTokens.length = 0;\n const tokenEndpoint = process.env.LOGTO_ENDPOINT + \"/oidc/token\";\n const username = process.env.LOGTO_APP_ID_M2M;\n const password = process.env.LOGTO_APP_SECRET_M2M;\n const resource = \"https://default.logto.app/api\";\n console.log(`[Logto API] Requesting a new access token for Logto API`);\n const body = {\n grant_type: \"client_credentials\",\n resource,\n scope: \"all\"\n }\n\n const res = await fetch(tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \"Basic \" + Buffer.from(username + \":\" + password).toString(\"base64\")\n },\n body: JSON.stringify(body)\n }).catch(e => {\n console.error(\"[Logto API]\", e);\n return null;\n });\n\n if (res == null || !res.ok) {\n if (res) console.error(\"[Logto API]\", res.status, await res?.text());\n throw new Error(\"Failed to get access token\");\n }\n\n console.log(`[Logto API] Received a new access token for Logto API`)\n\n /**\n * @type {{access_token:string, expires_in:number, token_type:\"Bearer\"}}\n */\n const json = await res.json();\n const expires_at = Date.now() + (json.expires_in * 1000);\n m2mAccessTokens.push({ access_token: json.access_token, expires_at });\n return json.access_token;\n}\n\n\n\n\n/**\n * @param {string} user_id\n * @param {string} accessToken\n * @param {object} customData\n * @returns {Promise<boolean>}\n */\nexport async function updateLogtoUserCustomData(user_id, accessToken, customData) {\n const logtoUrl = `${process.env.LOGTO_ENDPOINT}/api/users/${user_id}/custom-data`;\n const response = await fetch(logtoUrl, {\n method: \"PATCH\",\n headers: {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n customData: customData\n })\n }).catch(err => {\n return { error: err.message, status: 500 }\n })\n if (\"error\" in response) {\n console.error(\"Failed to update user custom data\", response.error);\n return false;\n }\n return response.ok;\n}\n\n\n\n/**\n * @param {string} userId\n * @returns {Promise<import(\"../types/logto.js\").LogtoOrganization[] | null>}\n */\nexport async function getOrganizationsForUser(userId) {\n const url = `${process.env.LOGTO_ENDPOINT}/api/users/${userId}/organizations`;\n const accessToken = await getLogtoM2MAccessToken();\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Authorization\": \"Bearer \" + accessToken\n }\n }).catch(e => {\n console.error(\"Failed to get organizations for user\", e);\n return null;\n });\n\n if (res?.ok) {\n /** @type {import(\"../types/logto.js\").LogtoOrganization[]} */\n const body = await res.json();\n return body;\n }\n return null;\n}\n\n\nconst organizationIdsCache = new MemoryCache({ default_expiration: 1000 * 60 * 5 }); // cache for 5 minute\n\n/**\n * @param {string} userId\n * @returns {Promise<string[]>}\n */\nexport async function getOrganizationsIdsForUser(userId, allowCache = true) {\n if (allowCache) {\n const cached = organizationIdsCache.tryGet(userId);\n if (cached) return cached;\n }\n const orgs = await getOrganizationsForUser(userId);\n const ids = orgs?.map(o => o.id) || [];\n organizationIdsCache.add(userId, ids);\n return ids;\n}\n\n\n\n\n/**\n * @param {string} orgId the organisation id \n * @param {undefined | { max: number }} opts\n * @link https://openapi.logto.io/operation/operation-get-api-organizations-parameter-users\n * @returns {Promise<null | Array<import(\"../types/logto.js\").OrganizationMember>>} the list of users in the organisation\n */\nexport async function getOrganisationUsers(orgId, opts = undefined) {\n\n const pageSize = opts?.max ? Math.min(Math.max(1, opts.max), 100) : 20;\n const url = `${process.env.LOGTO_ENDPOINT}/api/organizations/${orgId}/users?page=1&page_size=${pageSize}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n return { error: e.message, status: 500 }\n });\n\n if (\"error\" in res) {\n console.error(\"Failed to get organisation users\", res.error);\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n /** See https://openapi.logto.io/operation/operation-get-api-organizations-parameter-users\n * @type {Array<import(\"../types/logto.js\").OrganizationMember>}\n */\n const body = await res.json().catch(e => {\n console.error(\"Failed to parse response\", e);\n return null;\n });\n if (body.length >= 100) {\n console.warn(\"More than 100 users in the organization, pagination not implemented\");\n }\n return body;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-get-api-organization-invitations\n * @param {string} orgId the organisation id\n * @param {undefined | { pending_only?:boolean }} opts\n * @returns {Promise<Array<import(\"../types/logto.js\").OrgUserInvitation> | null>} the list of invitations\n */\nexport async function getOrganisationInvitations(orgId, opts = undefined) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations?organizationId=${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n });\n\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n let body = /** @type {Array<import(\"../types/logto.js\").OrgUserInvitation>} */ (await res.json());\n\n if (opts?.pending_only === true) {\n body = body.filter(inv => inv.status === \"Pending\");\n }\n\n return body;\n}\n\n/**\n * @link https://openapi.logto.io/operation/operation-get-api-organization-invitations-parameter\n * @param {string} invitationId \n * @returns \n */\nexport async function getOrganisationInvitation(invitationId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations/${invitationId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n });\n\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n const body = await res.json();\n return body;\n}\n\n// Current org template roles from https://auth.admin.cloud.needle.tools/console/organization-template/organization-roles\n\n/**\n * @type {Record<import(\"../types/logto.js\").OrgRoleName, string>}\n */\nconst roles = {\n \"guest\": \"1lxn40ssa30tgh5uci6or\",\n \"member\": \"omtpqeh9r2904ey2l7aeq\",\n \"manage\": \"sun5lg4leibleblceh6ml\",\n \"owner\": \"bmb0iscycu8bu8pit9way\",\n \"billing-manager\": \"h9i21zcn9n8vth0awoq7a\",\n}\n\n/**\n * @param {import(\"../types/logto.js\").OrganizationRole} role\n */\nexport function isPaidOrgMember(role) {\n switch (role.id) {\n case \"omtpqeh9r2904ey2l7aeq\": // member\n case \"sun5lg4leibleblceh6ml\": // manage\n case \"bmb0iscycu8bu8pit9way\": // owner\n return true;\n }\n return false;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-createorganizationinvitation\n * @param {string} userId the inviter id\n * @param {string} userName the inviter name\n * @param {string} orgId the organisation id\n * @param {string} orgName the organisation name\n * @param {string} email the email of the invitee\n * @param {string | URL} emailLink the email link\n * @param {import(\"../types/logto.js\").OrgRoleName | undefined} role the new role of the invitee. \"guest\" | \"member\" | \"manage\" | \"owner\"\n * @returns {Promise<{error:string} | import(\"../types/logto.js\").OrganizationInvitation>} the invitation\n */\nexport async function postOrganisationInvitation(userId, userName, orgId, orgName, email, emailLink, role) {\n if (!role) {\n console.debug(\"No role specified, defaulting to guest\");\n role = \"guest\"\n }\n const roleId = roles[role];\n if (!roleId) {\n console.error(\"Invalid role\", role);\n return { error: \"invalid role\" }\n }\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations?organizationId=${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n }\n const expiresAt = Date.now() + 1000 * 60 * 60 * 24 * 7; // valid for 7 days\n const body = {\n inviterId: userId,\n invitee: email,\n organizationId: orgId,\n expiresAt,\n organizationRoleIds: [roleId],\n messagePayload: {\n user_name: userName,\n org_name: orgName,\n link: emailLink,\n },\n };\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const error = await res.json();\n if (error.code == \"entity.unique_integrity_violation\") {\n return { error: \"User already invited\" };\n }\n else if (error.code == \"entity.not_found\") {\n return { error: \"User not found\" };\n }\n console.log(res.status, error);\n return { error: error.message };\n }\n /** @type {import(\"../types/logto.js\").OrganizationInvitation} */\n const responseBody = await res.json();\n return responseBody;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-delete-api-organization-invitations-parameter\n * @param {string} invitationId the invitation id\n * @returns {Promise<{error:string} | true>} whether the deletion was successful\n */\nexport async function deleteOrganisationInvitation(invitationId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations/${invitationId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n }\n const res = await fetch(url, {\n method: \"DELETE\",\n headers,\n });\n if (!res.ok) {\n const error = await res.json();\n console.log(\"Delete organisation invitation\", invitationId, res.status, error);\n return {\n error\n };\n }\n return true;\n}\n\n/** \n * @link https://openapi.logto.io/operation/operation-post-api-organization-invitations-parameter-message\n * @param {string} invitationId the invitation id\n * @returns {Promise<null | boolean>} whether the resend was successful\n */\nexport async function resendOrganisationInvitation(invitationId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organization-invitations/${invitationId}/message`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"POST\",\n headers\n });\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n return true;\n}\n\n/**\n * @param {string} orgId the organisation id \n * @link https://openapi.logto.io/operation/operation-get-api-organizations-parameter\n * @returns {Promise<null | { status: number, error: string } | import(\"../types/logto.js\").LogtoOrganization>} the organization\n */\nexport async function getOrganization(orgId) {\n\n const url = process.env.LOGTO_ENDPOINT + `/api/organizations/${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(\"Error getting org\", e);\n return null;\n });\n\n if (!res) {\n return null;\n }\n\n if (!res.ok) {\n const error = await res.text();\n return { status: res.status, error: error };\n }\n\n /**\n * @type {import(\"../types/logto.js\").LogtoOrganization}\n */\n const body = await res.json();\n return body;\n}\n\n/**\n * \n * @param {string} orgId \n * @param {string} userId \n * @returns {Promise<{error:string} | {success:boolean}>}\n */\nexport async function removeMemberFromOrganization(orgId, userId) {\n\n const url = `${process.env.LOGTO_ENDPOINT}/api/organizations/${orgId}/users/${userId}`;\n console.log(\"REMOVE USER\", url);\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n }\n const response = await fetch(url, {\n method: \"DELETE\",\n headers,\n });\n if (!response.ok) {\n const error = await response.text();\n console.log(response.status, error);\n return { error };\n }\n console.log(\"Removed user from organization\", response.status, response.statusText);\n return { success: true };\n}\n\n\n/**\n * @link https://openapi.logto.io/operation/operation-replaceorganizationuserroles\n * @param {string} orgId the organization id\n * @param {string} userId the user id\n * @param {import(\"../types/logto.js\").OrgRoleName[]} roleNames the role names\n * @returns {Promise<{error:string} | {success:boolean}>}\n */\nexport async function updateMemberRoleInOrganization(orgId, userId, roleNames) {\n const url = `${process.env.LOGTO_ENDPOINT}/api/organizations/${orgId}/users/${userId}/roles`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n };\n const body = JSON.stringify({\n organizationRoleIds: roleNames.map(role => roles[role])\n });\n const res = await fetch(url, {\n method: \"PUT\",\n headers,\n body\n });\n if (!res.ok) {\n console.log(res.status, await res.text());\n return { error: \"Failed to update user roles\" };\n }\n console.log(\"Updated user roles\", userId, roleNames);\n return { success: true };\n}\n\n\n/**\n * Allows adjusting name/description of an organization\n * @param {string} orgId organization id\n * @param {{name?: string, description?: string | null, customData?: any}} opts \n * @returns \n */\nexport async function updateOrganization(orgId, opts) {\n const url = process.env.LOGTO_ENDPOINT + `/api/organizations/${orgId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n }\n\n const body = JSON.stringify({\n id: orgId,\n ...opts\n });\n\n const res = await fetch(url, {\n method: \"PATCH\",\n headers,\n body\n });\n\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n\n const responseBody = await res.json();\n return responseBody;\n}\n\n\n\n\n\n/**\n * @link https://openapi.logto.io/operation/operation-get-api-users-parameter\n * \n * @param {string} userId the user id\n * @returns {Promise<null | import(\"../types/logto.js\").LogtoUser>} the user\n */\nexport async function getUser(userId) {\n\n const url = process.env.LOGTO_ENDPOINT + `/api/users/${userId}`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(e);\n return null;\n });\n if (res == null) {\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n const user = await res.json();\n return user;\n}\n\n/**\n * @param {{email?:string} | {domain?:string}} options\n * @link https://docs.logto.io/user-management/advanced-user-search\n * @returns {Promise<null | import(\"../types/logto.js\").LogtoUser[]>} the user\n */\nexport async function searchUser(options) {\n const url = new URL(process.env.LOGTO_ENDPOINT + `/api/users`);\n if (\"email\" in options && options.email) {\n url.searchParams.set(\"search.primaryEmail\", options.email);\n }\n if (\"domain\" in options && options.domain) {\n url.searchParams.set(\"search.primaryEmail\", `%${options.domain}`);\n }\n\n if (url.searchParams.size === 0) {\n console.error(\"Can not search user: No search parameters provided\");\n return null;\n }\n\n url.searchParams.set(\"page_size\", \"100\");\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n Authorization: \"Bearer \" + accessToken\n };\n // console.log(\"Searching user by email\", email, url.toString());\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(e);\n return null;\n });\n if (res == null) {\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n const users = await res.json();\n return users;\n}\n\n/**\n * @link https://openapi.logto.io/operation/operation-get-api-users-parameter-roles\n * @param {string} userId the user id\n * @returns {Promise<null | Array<{id:string, name:string, description:string, type:\"User\"}>>} the user roles\n */\nexport async function getUserRoles(userId) {\n const url = process.env.LOGTO_ENDPOINT + `/api/users/${userId}/roles`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken\n }\n const res = await fetch(url, {\n method: \"GET\",\n headers\n }).catch(e => {\n console.error(e);\n return null;\n });\n if (res == null) {\n return null;\n }\n if (!res.ok) {\n console.log(res.status, await res.text());\n return null;\n }\n const roles = await res.json();\n return roles;\n}\n\n/**\n * @link https://openapi.logto.io/operation/operation-post-api-users-parameter-roles\n * @param {string} userId the user id\n * @param {string | string[]} roleId the role id\n * @returns {Promise<{error:string} | true>} whether the role was added\n */\nexport async function addUserRole(userId, roleId) {\n\n const url = process.env.LOGTO_ENDPOINT + `/api/users/${userId}/roles`;\n const accessToken = await getLogtoM2MAccessToken();\n const headers = {\n \"Authorization\": \"Bearer \" + accessToken,\n \"Content-Type\": \"application/json\",\n };\n const roleIds = Array.isArray(roleId) ? roleId : [roleId];\n const body = JSON.stringify({\n roleIds: roleIds\n });\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body\n }).catch(e => {\n console.error(e);\n return { error: e.message }\n });\n if (res == null) {\n return { error: \"Failed to add user role\" };\n }\n else if (\"error\" in res) {\n return res;\n }\n if (!res.ok) {\n const error = await res.text();\n console.log(res.status, error);\n return { error };\n }\n console.log(\"Added user role\", userId, roleId);\n return true;\n}\n\n/**\n * @param {string} userId the user id\n */\nconst userIdToNameCache = new Map();\n\n/**\n * @param {string} userId the user id\n * @returns {Promise<string | null>} the username\n */\nexport async function getUserName(userId) {\n if (userIdToNameCache.has(userId)) {\n return userIdToNameCache.get(userId);\n }\n const user = await getUser(userId);\n if (user == null) {\n return null;\n }\n let name = user.username;\n if (!name) name = user.name;\n if (!name) name = user.profile?.preferredUsername;\n if (!name) name = emailToDisplayName(user.primaryEmail);\n\n if (name) name = name.trim();\n userIdToNameCache.set(userId, name);\n\n return name;\n}\n\n\n/**\n * @param {string[]} userIds the user ids\n * @returns {Promise<{[userId:string]:string | null}>} the user names\n */\nexport async function getUserNames(userIds) {\n const names = await Promise.all(userIds.map(getUserName));\n /** @type {any} */\n const result = {};\n for (let i = 0; i < userIds.length; i++) {\n result[userIds[i]] = names[i];\n }\n return result;\n}","import { Auth } from \"../auth\";\n\n\n/**\n * @param {string | null | undefined} [org]\n * @returns {Promise<import(\"../web.types\").AuthData>}\n */\nexport async function getAuthHeader(org) {\n return Auth.requestAccessToken(org).then(token => {\n return {\n authToken: token,\n org: org || undefined,\n }\n })\n}","import { uploadFiles as sdk_uploadFiles, toFileWithPath } from \"@needle-tools/cloud-sdk\";\nimport { api_endpoint } from \"../../constants.js\";\nimport { getAuthHeader } from \"./utils.js\";\n\n/**\n * @typedef {{ name: string, mimetype: string, buffer:Buffer }} Filelike\n * @typedef {import(\"../web.types.js\").AuthData} AuthData\n */\n\n/**\n * @param {Array<Filelike>} files\n * @param {{org?:string|null} & { name?:string, abort?:AbortSignal, }} opts\n * @returns {Promise<{error:string} | {job_id:string, view_id:string, url?:string | null, skipped?:boolean}>}\n */\nexport async function uploadFiles(files, opts) {\n\n const auth = await getAuthHeader(opts.org);\n if(!auth) { throw new Error(\"Not authenticated\"); }\n\n const content = files.map(f => toFileWithPath(f));\n\n return sdk_uploadFiles({\n baseUrl: api_endpoint,\n ...auth,\n ...opts,\n }, {\n triggered_by: \"web\",\n entrypoint: undefined,\n files: content,\n }, {\n name: opts.name,\n abort: opts.abort\n }).then(res => {\n if (\"error\" in res) {\n return { error: res.error };\n }\n return {\n job_id: res.id,\n view_id: res.view_id,\n url: res.url,\n skipped: res.uploadSkipped,\n }\n });\n}\n","import { listUploads as sdk_listUploads } from \"@needle-tools/cloud-sdk\";\nimport { api_endpoint } from \"../../constants.js\";\nimport { listDeployments } from \"../../list.js\";\nimport { getAuthHeader } from \"./utils.js\";\n\n/**\n * Unfortunately this doesnt get properly bundles in the final output so we have to write the types below directly\n * @typedef {import(\"@needle-tools/cloud-sdk/types\").JobType} JobType\n * @typedef {import(\"@needle-tools/cloud-sdk/types\").JobStatus} JobStatus \n */\n\n\n\n/**\n * @param {{ org?:string } & ({ name?: string, view_id?:string } | { page: number, limit: number })} opts\n * @returns {Promise<Array<import(\"../web.types.js\").Upload>>}\n */\nexport async function getUploads(opts) {\n\n const auth = await getAuthHeader(opts.org);\n if (!auth) throw new Error(\"Not authenticated\");\n\n if (\"limit\" in opts) {\n opts.limit = Math.min(100, opts.limit);\n }\n\n const isPaged = \"page\" in opts || \"limit\" in opts;\n const baseUrl = api_endpoint;\n return sdk_listUploads({\n baseUrl,\n ...auth,\n ...opts\n }, {\n view_name: \"name\" in opts ? opts.name : undefined,\n view_id: \"view_id\" in opts ? opts.view_id : undefined,\n type: \"upload\",\n page: isPaged ? opts.page : 1,\n limit: isPaged ? opts.limit : 100\n }\n ).then(res => {\n const list = res.uploads;\n return list.map(upload => {\n return {\n name: upload.name,\n created_at: upload.created_time,\n updated_at: upload.updated_time,\n thumbnail_url: upload.thumbnail_url,\n files: upload.jobs.map(job => {\n return {\n created_at: job.created_at,\n updated_at: job.updated_at || job.created_at,\n type: job.type,\n status: job.status,\n name: job.name,\n url: job.url,\n size: job.size,\n // parameter: {\n // job.parameter?.\n // }\n }\n })\n }\n })\n })\n}\n\n\n\n\n/**\n * @param {{ org?:string } & { offset?:number, limit?: number }} opts\n * @returns {Promise<Array<Deployment>>}\n * @typedef {{ name: string, url: string }} Deployment\n */\nexport async function getDeployments(opts) {\n\n const auth = await getAuthHeader(opts.org);\n if (!auth) throw new Error(\"Not authenticated\");\n\n const res = await listDeployments({\n endpoint: api_endpoint,\n ...auth,\n offset: opts.offset || 0,\n limit: opts.limit || 10\n }).catch(err => err);\n\n if (!res || res instanceof Error) {\n return [];\n }\n\n /** @type {import(\"@needle-tools/cloud-sdk/types\").ListDeploymentsResponseBody} */\n const data = res;\n\n return data.deployments.map(deployment => {\n return {\n name: deployment.name,\n url: deployment.url\n }\n });\n}\n\n\n\n\nimport { getLicenses as _getLicenses } from \"@needle-tools/cloud-sdk\"\nimport { Licenses } from \"../auth.config.js\";\n\n\n/**\n * Get licenses for a specific user. A product type is optional. \n * Only valid licenses are returned\n * @param {{product?:string | string[], includeInvalid?: boolean}} opts\n * @returns {Promise<null | import(\"../../../../needle-share/types/stripe.js\").License[]>}\n */\nexport async function getUserLicenses(opts) {\n const auth = await getAuthHeader();\n if (!auth) return null;\n\n const productsArr = Array.isArray(opts.product) ? opts.product : [opts.product];\n productsArr.push(...Licenses.NeedlePro);\n\n const licensesPromise = _getLicenses({\n baseUrl: api_endpoint,\n ...auth,\n }, {\n type: \"user\",\n \"x-needle-product\": productsArr.join(\",\"),\n })\n return licensesPromise.then(res => {\n if (opts.includeInvalid === true) return res;\n return res.filter(entry => entry.valid);\n })\n}\n\n\n/**\n * Checks if the current user owns a specific product. A product type is optional\n * @param {{product?:string | string[]}} opts\n * @returns {Promise<boolean>}\n */\nexport async function ownsProduct(opts) {\n const auth = await getAuthHeader();\n if (!auth) return false;\n\n const productsArr = Array.isArray(opts.product) ? opts.product : [opts.product];\n productsArr.push(...Licenses.NeedlePro);\n\n const licensesPromise = _getLicenses({\n baseUrl: api_endpoint,\n ...auth,\n }, {\n type: \"user\",\n \"x-needle-product\": productsArr.join(\",\"),\n })\n return licensesPromise.then(res => {\n for (const entry of res) {\n if (entry.valid) {\n return true;\n }\n }\n return false;\n })\n}","import { createAuthHeaders, ShareApiEndpoints } from \"@needle-tools/cloud-sdk\";\nimport { api_endpoint } from \"./constants\";\n\n\n/**\n * \n * @param {{endpoint:string, authToken:string, org?:string | null, limit:number, offset:number, names?:string[]}} args\n * @returns {Promise<import(\"@needle-tools/cloud-sdk/types\").ListDeploymentsResponseBody | { status: number, error: string }>}\n */\nexport async function listDeployments(args) {\n\n const endpoint = args.endpoint || api_endpoint;\n const url = new URL(endpoint + ShareApiEndpoints.get.deployments);\n url.searchParams.append(\"offset\", args.offset.toString());\n url.searchParams.append(\"limit\", args.limit.toString());\n if (args.names) url.searchParams.append(\"name\", args.names.map(n => n.trim()).join(\",\"));\n\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n ...createAuthHeaders({\n authToken: args.authToken,\n org: args.org\n })\n }\n });\n if (!res.ok) {\n return { status: res.status, error: await res.text() };\n }\n /**\n * @type {import(\"@needle-tools/cloud-sdk/types\").ListDeploymentsResponseBody}\n */\n const response = await res.json();\n return response;\n}","import { createAuthHeaders } from \"./api.auth.js\";\nimport { ShareApiEndpoints } from \"./api.js\";\nimport { DEFAULT_FETCH_INIT } from \"./utils.fetch.js\";\n\n\n/**\n * @typedef {import(\"../types\").ListJobsRequestResponse & {jobs:Array<import(\"../types\").JobWithRelations>}} JobsResponseWithRelations\n */\n\n/** \n * @param {{baseUrl:string, authToken:string}} args \n * @param {{sort_by_upload:boolean, page:number, limit:number}} opts\n * @returns {Promise<JobsResponseWithRelations>}}\n*/\nexport async function listJobs(args, opts = { sort_by_upload: true, page: 1, limit: 100 }) {\n\n if (opts.page <= 0) {\n throw new Error(\"Invalid page. Must be greater than 0\");\n }\n\n const url = args.baseUrl + ShareApiEndpoints.get.jobs;\n /**\n * @type {import(\"../types\").ListJobsRequestHeaders}\n */\n const headers = {\n authorization: \"Bearer \" + args.authToken,\n max: opts.limit.toString(),\n page: opts.page.toString(),\n }\n return fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers\n }).then(async res => {\n if (!res.ok) {\n throw new Error(\"Failed to list uploads\");\n }\n\n /** @type {JobsResponseWithRelations} */\n const json = await res.json();\n\n if (opts?.sort_by_upload == true) {\n\n const uploadJobs = [];\n for (const job of json.jobs) {\n if (job.type == \"upload\") {\n uploadJobs.push({ ...job, related: new Array() });\n }\n }\n const optimizationJobs = json.jobs.filter(j => j.type != \"upload\").sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n const sortedUploads = uploadJobs.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n for (let i = sortedUploads.length - 1; i >= 0; i--) {\n const main = sortedUploads[i];\n const related = optimizationJobs.filter(o => o.view_id == main.view_id);\n for (let j = related.length - 1; j >= 0; j--) {\n const optimizationJob = related[j];\n // insert optimization job before upload job\n // @ts-ignore\n sortedUploads.splice(i, 0, optimizationJob);\n }\n main.related = related;\n }\n\n\n json.jobs = sortedUploads;\n\n }\n\n return json\n });\n}\n\n\n\n/** \n * @param {{baseUrl:string} & import(\"../types\").AuthData} args \n * @param {{sort_by_upload?:boolean, page:number, limit:number, view_name?:string | undefined, view_id?: string | undefined, type: import(\"../types\").ListUploadsRequestHeaders[\"type\"], search?:string}} opts\n * @returns {Promise<import(\"../types\").ListUploadsRequestResponse>}}\n*/\nexport async function listUploads(args, opts = { sort_by_upload: true, page: 1, limit: 20, view_id: undefined, type: \"upload\", }) {\n\n if (opts.page <= 0) {\n throw new Error(\"Invalid page. Must be greater than 0\");\n }\n\n\n const url = new URL(args.baseUrl + ShareApiEndpoints.get.uploads);\n\n if(opts.search?.trim()?.length) {\n url.searchParams.set(\"search\", opts.search.trim());\n }\n\n /**\n * @type {import(\"../types\").ListUploadsRequestHeaders}\n */\n const headers = {\n type: (opts.type || \"upload\"),\n max: (opts.limit || 0).toString(),\n page: (opts.page || 1).toString(),\n ...createAuthHeaders(args)\n }\n if (opts.view_id != undefined)\n headers.view_id = opts.view_id;\n if (opts.view_name != undefined)\n headers.view_name = opts.view_name;\n\n return fetch(url, {\n ...DEFAULT_FETCH_INIT,\n method: \"GET\",\n headers: /** @type {HeadersInit} */ (/** @type {unknown} */ (headers)),\n })\n .then(async res => {\n if (!res.ok) {\n throw new Error(`Failed to list uploads (${res.status}): ${await res.text()}`);\n }\n if (opts.sort_by_upload === undefined) opts.sort_by_upload = true;\n /** @type {import(\"../types\").ListUploadsRequestResponse} */\n const json = await res.json();\n if (opts.sort_by_upload)\n json.uploads.sort((a, b) => new Date(b.updated_time).getTime() - new Date(a.updated_time).getTime());\n return json;\n });\n}\n\n// /** \n// * @param {{baseUrl:string} & import(\"../types\").AuthData} args \n// * @param {{sort_by_upload?:boolean, page:number, limit:number, view_name?:string | undefined, view_id?: string | undefined, type: import(\"../types\").ListUploadsRequestHeaders[\"type\"]}} opts\n// * @returns {Promise<import(\"../types\").ListUploadsRequestResponse>}}\n// */\n// export async function listDeleted(args) {\n\n// }","import { createAuthHeaders, ShareApiEndpoints } from \"@needle-tools/cloud-sdk\"\nimport { api_endpoint } from \"../../constants.js\"\nimport { getAuthHeader } from \"./utils.js\";\n\n\n/**\n * Start the checkout process\n * @param {{ price_id:string }} args\n */\nexport async function startCheckoutSession(args) {\n\n const url = new URL(api_endpoint + ShareApiEndpoints.account.buy_licenses);\n\n const auth = await getAuthHeader();\n\n /** @type {import(\"@needle-tools/cloud-sdk/types\").BuyLicenseRequestBody} */\n const body = {\n mode: \"payment\",\n price_id: args.price_id,\n return_url: window.location.href,\n cancel_url: window.location.href,\n }\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...createAuthHeaders(auth),\n },\n body: JSON.stringify(body)\n });\n if (!res.ok) {\n return { ok: false, status: res.status }\n }\n\n /** @type {import(\"@needle-tools/cloud-sdk/types\").BuyLicenseResponseBody} */\n const obj = await res.json();\n\n if (\"session_url\" in obj) {\n window.location.href = obj.session_url;\n // return {\n // continue: () => window.location.href = obj.session_url,\n // session_url: obj.session_url\n // }\n return { ok: true, status: 200 }\n }\n return { ok: false, status: 400 }\n}"],"names":["globalThis","Buffer","_isAuthenticated","AuthScopes","Basic","UserScope","Profile","Email","Payment","All","Roles","CustomData","Organizations","OrganizationRoles","concat","Licenses","appId","undefined","scopes","_userInfo","_init","requestUserInfoPromise","_client","changedListeners","Array","invokeChange","forEach","callback","err","console","error","debug","Auth","setDebug","_debug","baseUrl","window","location","origin","redirectUri","postSignOutRedirectUri","onChanged","includes","push","index","indexOf","splice","ready","then","Promise","reject","Error","init","opts","_temp2","_scopes","_client2","query","restoreQueryParamsDuringAuth","checkIsAuthenticated","res","requestUserInfo","url","URL","href","search","history","replaceState","resolve","length","apply","logtoConfig","sign_int","_url$searchParams$get","searchParams","has","get","client","handleSignInCallback","newUrl","pathname","replace","log","handleSignin","_temp","_","e","internalInit","isAuthenticated","getUserInfo","getUserId","sub","getName","username","name","email","split","fetchUserInfo","_userInfo2","requestAccessToken","org_id","getOrganizationToken","getAccessToken","signIn","_appId","saveQueryParamsDuringAuth","signOut","_appId2","sessionStorage","setItem","del","getItem","removeItem","config","endpoint","resources","warn","LogtoClient","NeedleLoginButton","_HTMLButtonElement","_this","call","this","addEventListener","_proto","prototype","connectedCallback","_this2","__update","__unsubscribeOnChange","disconnectedCallback","_this$__unsubscribeOn","innerHTML","_wrapNativeSuper","HTMLButtonElement","createAuthHeaders","authData","authHeaders","authorization","authToken","org","roles","join","roles_org","customElements","define","extends","DEFAULT_FETCH_INIT","credentials","getLicenses","args","options","licensesRequestHeaders","_extends","headers","fetch","method","_exit","_temp3","_result","json","licenses","ok","_res$statusText","statusText","text","_res$text","bind","fn","thisArg","arguments","toString","Object","getPrototypeOf","kindOf","cache","create","thing","str","slice","toLowerCase","kindOfTest","type","typeOfTest","isArray","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","map","obj","allOwnKeys","i","l","keys","getOwnPropertyNames","len","key","findKey","_key","_global","self","global","isContextDefined","context","isTypedArray","TypedArray","Uint8Array","isHTMLForm","hasOwnProperty","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","ret","defineProperties","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","toUpperCase","isAsyncFn","_setImmediate","setImmediateSupported","setImmediate","postMessageSupported","postMessage","token","Math","random","callbacks","source","data","shift","cb","setTimeout","asap","queueMicrotask","process","nextTick","utils$1","isBuffer","constructor","isFormData","kind","FormData","append","isArrayBufferView","result","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","extend","a","b","trim","stripBOM","content","charCodeAt","inherits","superConstructor","props","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","String","lastIndex","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","hasOwnProp","freezeMethods","enumerable","writable","set","toObjectSet","arrayOrString","delimiter","toCamelCase","m","p1","p2","noop","toFiniteNumber","defaultValue","Number","isFinite","generateString","size","alphabet","isSpecCompliantForm","toJSONObject","stack","visit","target","reducedValue","isThenable","catch","AxiosError","message","code","request","response","captureStackTrace","utils","toJSON","description","number","fileName","lineNumber","columnNumber","status","isVisitable","removeBrackets","renderKey","path","dots","from","customProps","axiosError","cause","predicates","test","toFormData","formData","TypeError","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","JSON","stringify","some","isFlatArray","el","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","buildURL","_encode","serializeFn","serialize","serializedParams","hashmarkIndex","encoder","InterceptorManager$1","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","id","clear","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","classes","URLSearchParams","protocols","hasBrowserEnv","document","hasStandardBrowserEnv","product","navigator","platform","WorkerGlobalScope","importScripts","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","contentType","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","parse","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","Accept","defaults$1","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","rawHeaders","parsed","line","substring","parseHeaders","tokens","tokensRE","parseTokens","matcher","deleted","deleteHeader","normalize","format","normalized","w","char","formatHeader","targets","asStrings","first","computed","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","configurable","buildAccessors","mapped","headerValue","AxiosHeaders$2","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","ERR_BAD_REQUEST","floor","progressEventReducer","listener","isDownloadStream","freq","bytesNotified","_speedometer","samplesCount","min","bytes","timestamps","firstSampleTS","head","tail","chunkLength","now","Date","startedAt","bytesCount","passed","round","speedometer","lastArgs","timer","timestamp","threshold","invoke","clearTimeout","throttle","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","event","progressEventDecorator","throttled","asyncDecorator","isURLSameOrigin","msie","userAgent","urlParsingNode","createElement","originURL","resolveURL","setAttribute","protocol","host","hash","hostname","port","charAt","requestURL","cookies","write","expires","domain","secure","cookie","toGMTString","read","RegExp","decodeURIComponent","remove","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","paramsSerializer","timeoutMessage","withCredentials","withXSRFToken","onUploadProgress","onDownloadProgress","decompress","beforeRedirect","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding","configValue","resolveConfig","newConfig","auth","btoa","password","unescape","hasStandardBrowserWebWorkerEnv","Boolean","xsrfValue","xhrAdapter","XMLHttpRequest","_config","requestData","requestHeaders","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","unsubscribe","signal","removeEventListener","onloadend","responseHeaders","getAllResponseHeaders","responseText","open","onreadystatechange","readyState","responseURL","onabort","ECONNABORTED","onerror","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","setRequestHeader","upload","cancel","abort","subscribe","aborted","parseProtocol","send","composeSignals$1","signals","controller","AbortController","reason","streamChunk","chunk","chunkSize","byteLength","end","pos","trackStream","stream","onProgress","onFinish","async","iterable","readBytes","_onFinish","ReadableStream","pull","close","loadedBytes","enqueue","return","highWaterMark","isFetchSupported","Request","Response","isReadableStreamSupported","encodeText","TextEncoder","arrayBuffer","supportsRequestStream","duplexAccessed","hasContentType","body","duplex","supportsResponseStream","resolvers","ERR_NOT_SUPPORT","knownAdapters","http","xhr","fetchOptions","finished","composedSignal","stopTimeout","composeSignals","requestContentLength","getContentLength","getBodyLength","resolveBodyLength","contentTypeHeader","_request","flush","isStreamResponse","responseContentLength","responseData","renderReason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","validators","deprecatedWarnings","validator","version","formatMessage","opt","desc","ERR_DEPRECATED","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","InterceptorManager","configOrUrl","dummy","boolean","function","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","Axios$2","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","c","CancelToken$2","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","HttpStatusCode$2","axios","createInstance","defaultConfig","instance","VERSION","Cancel","all","promises","spread","isAxiosError","payload","formToJSON","getAdapter","default","axios$1","updateJobStatus","job","job_id","identifier","status_message","INPUT_ERROR","WINDOW","root","JS_MD5_NO_WINDOW","WEB_WORKER","NODE_JS","JS_MD5_NO_NODE_JS","versions","node","buffer8","COMMON_JS","JS_MD5_NO_COMMON_JS","module","exports","ARRAY_BUFFER","JS_MD5_NO_ARRAY_BUFFER","HEX_CHARS","EXTRA","SHIFT","OUTPUT_TYPES","BASE64_ENCODE_CHAR","blocks","Uint32Array","JS_MD5_NO_ARRAY_BUFFER_IS_VIEW","createOutputMethod","outputType","Md5","update","createHmacOutputMethod","HmacMd5","sharedMemory","h0","h1","h2","h3","start","hBytes","finalized","hashed","array","oKeyPad","iKeyPad","inner","lastByteIndex","finalize","d","bc","da","hex","digest","base64","v1","v2","v3","base64Str","innerHash","bufferFrom","crypto","require$$0","require$$1","JS_MD5_NO_BUFFER_FROM","createHash","nodeWrap","createMethod","md5","hmac","createHmacMethod","getUint16","offset","getBufferView","getUint32","getString","decoder","decode","compareBytes","sample","element","DataView","TextDecoder","signatures","exact","flatten","flatMap","ext","mime","subSignatures","parseZipLikeFiles","xmlFormat","compressedSize","uncompressedSize","extraFieldLength","parseOpenDocumentFile","UPPER_LIMIT","_ext","_mime","reduce","lim","getUpperLimit","parseBytes","ext2","mime2","sample2","offset2","hashContentMD5","getFileMimeType","file","filename","extra","hint","signature","findMatches","result2","isText","parseTxtLikeFiles","parseExtraTypes","subarray","getFileMimeTypeFromName","lcname","toHumanReadableSizeString","precision","postfix","absoluteSize","abs","pp","toFixed","delay","ms","lod_asset_filename_regex","_wrapRegExp","image_lod","mesh_lod","_settle","pact","s","_Pact","o","v","observer","_isSettledPact","thenable","tryToDecodeFilename","findFileWithShortestPath","shortest","Infinity","f","UploadEstimator","totalFiles","estimatedTotalSize","uploadedSize","startTime","lastUpdateTime","lastUploadedSize","speedEMA","emaFactor","smoothedRemainingTime","recentSpeeds","maxRecentSpeeds","initialEstimateThreshold","updateProgress","totalUploadedSize","timeDiff","newlyUploadedSize","averageRecentSpeed","remainingTime","elapsedTime","effectiveSpeed","max","estimatedTimeRemaining","estimatedTimeRemainingString","__formatTime","seconds","minutes","_forTo","check","_cycle","_for","stage","shouldContinue","updateValue","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","currentUploads","getAuthHeader","uploadFiles","files","dir","mimetype","mimeType","File","myFile","webkitRelativePath","toFileWithPath","uploadPromise","_options","loglevel","success","entrypoint","entryPointFile","indexHtml","htmlFiles","_step3","htmlFilesByDirectory","Map","_iterator3","_createForOfIteratorHelperLoose","parts","bucket","sortedKeys","sort","_step4","_iterator4","find","glTF_Files","_step5","candidates","lodRegex","_iterator5","tryFindEntrypointGLTF","usdFiles","fbxFiles","objFiles","stlFiles","startsWith","packageJsons","tryDetermineEntrypoint","_result2","vrm_count","vrm_files","gltf_count","gltf_files","glb_count","glb_files","totalSize","_success$error","lowercaseFilename","toLocaleLowerCase","_file$path","uris","asset","_success$error2","_step","basePath","_iterator","_uri$groups","groups","found","resourcePath","_step2","_iterator2","_success$error3","validateFiles","validation","_data$entrypoint3","_data$entrypoint4","_data$entrypoint5","_data$entrypoint6","_temp17","_result3","_options9","_options10","_options11","_options12","_data$entrypoint","_data$entrypoint2","_temp15","_result4","beginUploadHeaders","beginRequestBody","_exit3","_temp13","_result5","beginResponse","_options4","_options5","_interrupt","_temp11","queue","_options2","anyUploadFailed","_exit4","_temp9","_result6","_exit5","_temp7","_result7","_interrupt2","_temp5","_exit6","_result8","doneResponse","doneResponseJson","uploadSkipped","view_id","filesUploaded","totalBytes","uploadHasCompletedSuccessfully","doneRequestHeaders","_temp4","AbortSignal","_fetch$catch","_doneResponse","_doneResponse2","maxRetriesDone","_temp6","_options3","_temp8","acc","job_type","entrypointPath","uploadedBytes","authHeader","updateStatus","force","lastStatusUpdate","onStart","uploadEstimator","filesCopy","filesCount","_temp10","_options6","uploaded","lastUploaded","registeredFile","results","fileBuffer","fileBuffers","fileSize","content_length","filetype","content_type","originalFile","contentEncoding","_interrupt3","_temp24","_result9","_interrupt4","_temp22","_result10","_temp20","_uploadError","didUpload","uploadId","uploadError","_result11","fileType","uploadErrorText","putUrl","presigned_url","k","_temp21","_temp19","_options$abort","fileMd5","experimental","content_encoding","fileNumber","fileCount","put","progressEvent","putResponse","_temp18","uploadRequestPUTUrl","fileIndex","requestPresignedUrlHeaders","filesize","requestPresignedUrlBody","jsonBody","_temp23","_options$abort2","_temp27","_exit10","_result12","_temp26","_fetch$then$catch","performUpload","request_put_url","content_md5","_options7","fileProgress01","diff","progress01","timePassedInSeconds","estimation","estimatedTimeLeftDisplay","estimatedTimeLeft","_res","_options8","race","_temp12","triggered_by","parent_job_id","_temp14","_fileName","_filetype","_options13","nameLowercase","uncompressedName","_exit2","_temp16","raw","lowercaseName","_options14","import","pako","inputArray","compArr","gzip","filepath","_opts","replacement","replaceAll","toFile","gzipCompress","compressedFile","_options16","_success$error$status2","isEntrypoint","_options15","internalUploadFiles","sdk_uploadFiles","skipped","ownsProduct","productsArr","_getLicenses","valid","getUserLicenses","includeInvalid","entry","getDeployments","limit","names","n","_res$status","listDeployments","deployments","deployment","getUploads","isPaged","sort_by_upload","page","_opts$search","view_name","uploads","updated_time","getTime","sdk_listUploads","created_at","created_time","updated_at","thumbnail_url","jobs","startCheckoutSession","mode","price_id","return_url","cancel_url","session_url"],"mappings":"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"}