{"version":3,"sources":["jsdelivr-header.js","/npm/node_modules/friendly-pow/base64.js","/npm/node_modules/friendly-pow/constants.js","/npm/src/dom.ts","/npm/src/headless.ts","/npm/src/puzzle.ts","/npm/node_modules/friendly-pow/puzzle.js","/npm/node_modules/friendly-pow/encoding.js","/npm/src/localization.ts","/npm/node_modules/friendly-pow/diagnostics.js","/npm/src/workergroup.ts","/npm/src/captcha.ts"],"names":[],"mappings":"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","file":"/npm/friendly-challenge@0.9.19/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/friendly-challenge@0.9.19/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// Adapted from the base64-arraybuffer package implementation\n// (https://github.com/niklasvh/base64-arraybuffer, MIT licensed)\nconst CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst EQ_CHAR = \"=\".charCodeAt(0);\n// Use a lookup table to find the index.\nconst lookup = new Uint8Array(256);\nfor (let i = 0; i < CHARS.length; i++) {\n    lookup[CHARS.charCodeAt(i)] = i;\n}\nexport function encode(bytes) {\n    const len = bytes.length;\n    let base64 = \"\";\n    for (let i = 0; i < len; i += 3) {\n        const b0 = bytes[i + 0];\n        const b1 = bytes[i + 1];\n        const b2 = bytes[i + 2];\n        // This temporary variable stops the NextJS 13 compiler from breaking this code in optimization.\n        // See issue https://github.com/FriendlyCaptcha/friendly-challenge/issues/165\n        let t = \"\";\n        t += CHARS.charAt(b0 >>> 2);\n        t += CHARS.charAt(((b0 & 3) << 4) | (b1 >>> 4));\n        t += CHARS.charAt(((b1 & 15) << 2) | (b2 >>> 6));\n        t += CHARS.charAt(b2 & 63);\n        base64 += t;\n    }\n    if (len % 3 === 2) {\n        base64 = base64.substring(0, base64.length - 1) + \"=\";\n    }\n    else if (len % 3 === 1) {\n        base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n    return base64;\n}\nexport function decode(base64) {\n    const len = base64.length;\n    let bufferLength = (len * 3) >>> 2; // * 0.75\n    if (base64.charCodeAt(len - 1) === EQ_CHAR)\n        bufferLength--;\n    if (base64.charCodeAt(len - 2) === EQ_CHAR)\n        bufferLength--;\n    const bytes = new Uint8Array(bufferLength);\n    for (let i = 0, p = 0; i < len; i += 4) {\n        const encoded1 = lookup[base64.charCodeAt(i + 0)];\n        const encoded2 = lookup[base64.charCodeAt(i + 1)];\n        const encoded3 = lookup[base64.charCodeAt(i + 2)];\n        const encoded4 = lookup[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return bytes;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2U2NC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsaUVBQWlFO0FBRWpFLE1BQU0sS0FBSyxHQUFHLGtFQUFrRSxDQUFDO0FBQ2pGLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEMsd0NBQXdDO0FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2pDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUFpQjtJQUN0QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsZ0dBQWdHO1FBQ2hHLDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWCxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFD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YXB0ZWQgZnJvbSB0aGUgYmFzZTY0LWFycmF5YnVmZmVyIHBhY2thZ2UgaW1wbGVtZW50YXRpb25cbi8vIChodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyLCBNSVQgbGljZW5zZWQpXG5cbmNvbnN0IENIQVJTID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG5jb25zdCBFUV9DSEFSID0gXCI9XCIuY2hhckNvZGVBdCgwKTtcblxuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuY29uc3QgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUlMubGVuZ3RoOyBpKyspIHtcbiAgbG9va3VwW0NIQVJTLmNoYXJDb2RlQXQoaSldID0gaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGNvbnN0IGxlbiA9IGJ5dGVzLmxlbmd0aDtcbiAgbGV0IGJhc2U2NCA9IFwiXCI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgIGNvbnN0IGIwID0gYnl0ZXNbaSArIDBdO1xuICAgIGNvbnN0IGIxID0gYnl0ZXNbaSArIDFdO1xuICAgIGNvbnN0IGIyID0gYnl0ZXNbaSArIDJdO1xuICAgIC8vIFRoaXMgdGVtcG9yYXJ5IHZhcmlhYmxlIHN0b3BzIHRoZSBOZXh0SlMgMTMgY29tcGlsZXIgZnJvbSBicmVha2luZyB0aGlzIGNvZGUgaW4gb3B0aW1pemF0aW9uLlxuICAgIC8vIFNlZSBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vRnJpZW5kbHlDYXB0Y2hhL2ZyaWVuZGx5LWNoYWxsZW5nZS9pc3N1ZXMvMTY1XG4gICAgbGV0IHQgPSBcIlwiO1xuICAgIHQgKz0gQ0hBUlMuY2hhckF0KGIwID4+PiAyKTtcbiAgICB0ICs9IENIQVJTLmNoYXJBdCgoKGIwICYgMykgPDwgNCkgfCAoYjEgPj4+IDQpKTtcbiAgICB0ICs9IENIQVJTLmNoYXJBdCgoKGIxICYgMTUpIDw8IDIpIHwgKGIyID4+PiA2KSk7XG4gICAgdCArPSBDSEFSUy5jaGFyQXQoYjIgJiA2Myk7XG4gICAgYmFzZTY0ICs9IHQ7XG4gIH1cblxuICBpZiAobGVuICUgMyA9PT0gMikge1xuICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgXCI9XCI7XG4gIH0gZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgXCI9PVwiO1xuICB9XG5cbiAgcmV0dXJuIGJhc2U2NDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShiYXNlNjQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBsZW4gPSBiYXNlNjQubGVuZ3RoO1xuICBsZXQgYnVmZmVyTGVuZ3RoID0gKGxlbiAqIDMpID4+PiAyOyAvLyAqIDAuNzVcblxuICBpZiAoYmFzZTY0LmNoYXJDb2RlQXQobGVuIC0gMSkgPT09IEVRX0NIQVIpIGJ1ZmZlckxlbmd0aC0tO1xuICBpZiAoYmFzZTY0LmNoYXJDb2RlQXQobGVuIC0gMikgPT09IEVRX0NIQVIpIGJ1ZmZlckxlbmd0aC0tO1xuXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBjb25zdCBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMCldO1xuICAgIGNvbnN0IGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgY29uc3QgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICBjb25zdCBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuXG4gICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMSA8PCAyKSB8IChlbmNvZGVkMiA+PiA0KTtcbiAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuIl19","// This is not an enum to save some bytes in the output bundle.\nexport const SOLVER_TYPE_JS = 1;\nexport const SOLVER_TYPE_WASM = 2;\nexport const CHALLENGE_SIZE_BYTES = 128;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUNoQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBpcyBub3QgYW4gZW51bSB0byBzYXZlIHNvbWUgYnl0ZXMgaW4gdGhlIG91dHB1dCBidW5kbGUuXG5leHBvcnQgY29uc3QgU09MVkVSX1RZUEVfSlMgPSAxO1xuZXhwb3J0IGNvbnN0IFNPTFZFUl9UWVBFX1dBU00gPSAyO1xuXG5leHBvcnQgY29uc3QgQ0hBTExFTkdFX1NJWkVfQllURVMgPSAxMjg7XG4iXX0=","// @ts-ignore\nimport css from \"./styles.css\";\nimport { ProgressMessage, DoneMessage } from \"./types\";\nimport { SOLVER_TYPE_JS } from \"friendly-pow/constants\";\nimport { Localization } from \"./localization\";\n\nconst loaderSVG = `<circle cx=\"12\" cy=\"12\" r=\"8\" stroke-width=\"3\" stroke-dasharray=\"15 10\" fill=\"none\" stroke-linecap=\"round\" transform=\"rotate(0 12 12)\"><animateTransform attributeName=\"transform\" type=\"rotate\" repeatCount=\"indefinite\" dur=\"0.9s\" values=\"0 12 12;360 12 12\"/></circle>`;\nconst errorSVG = `<path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>`;\n\n/**\n * Base template used for all widget states\n * The reason we use raw string interpolation here is so we don't have to ship something like lit-html.\n */\nfunction getTemplate(\n  fieldName: string,\n  rtl: boolean | undefined,\n  svgContent: string,\n  svgAriaHidden: boolean,\n  textContent: string,\n  solutionString: string,\n  buttonText?: string,\n  progress = false,\n  debugData?: string,\n  additionalContainerClasses?: string\n) {\n  return `<div class=\"frc-container${additionalContainerClasses ? \" \" + additionalContainerClasses : \"\"}${rtl?\" frc-rtl\":\"\"}\">\n<svg class=\"frc-icon\"${\n    svgAriaHidden ? ' aria-hidden=\"true\"' : \"\"\n  } role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\">${svgContent}</svg>\n<div class=\"frc-content\">\n    <span class=\"frc-text\" ${debugData ? `data-debug=\"${debugData}\"` : ``}>${textContent}</span>\n    ${buttonText ? `<button type=\"button\" class=\"frc-button\">${buttonText}</button>` : \"\"}\n    ${progress ? `<progress class=\"frc-progress\" value=\"0\">0%</progress>` : \"\"}\n</div>\n</div><span class=\"frc-banner${rtl?\" frc-rtl\":\"\"}\"><a lang=\"en\" href=\"https://friendlycaptcha.com/\" rel=\"noopener\" target=\"_blank\"><b>Friendly</b>Captcha ⇗</a></span>\n${fieldName === \"-\" ? \"\":`<input name=\"${fieldName}\" class=\"frc-captcha-solution\" type=\"hidden\" value=\"${solutionString}\">`}`;\n}\n\n/**\n * Used when the widget is ready to start solving.\n */\nexport function getReadyHTML(fieldName: string, l: Localization) {\n  return getTemplate(\n    fieldName,\n    l.rtl,\n    `<path d=\"M17,11c0.34,0,0.67,0.04,1,0.09V6.27L10.5,3L3,6.27v4.91c0,4.54,3.2,8.79,7.5,9.82c0.55-0.13,1.08-0.32,1.6-0.55 C11.41,19.47,11,18.28,11,17C11,13.69,13.69,11,17,11z\"/><path d=\"M17,13c-2.21,0-4,1.79-4,4c0,2.21,1.79,4,4,4s4-1.79,4-4C21,14.79,19.21,13,17,13z M17,14.38\"/>`,\n    true,\n    l.text_ready,\n    \".UNSTARTED\",\n    l.button_start,\n    false\n  );\n}\n\n/**\n * Used when the widget is retrieving a puzzle\n */\nexport function getFetchingHTML(fieldName: string, l: Localization) {\n  return getTemplate(fieldName, l.rtl, loaderSVG, true, l.text_fetching, \".FETCHING\", undefined, true);\n}\n\n/**\n * Used when the solver is running, displays a progress bar.\n */\nexport function getRunningHTML(fieldName: string, l: Localization) {\n  return getTemplate(fieldName, l.rtl, loaderSVG, true, l.text_solving, \".UNFINISHED\", undefined, true);\n}\n\nexport function getDoneHTML(fieldName: string, l: Localization, solution: string, data: DoneMessage) {\n  const timeData = `${data.t.toFixed(0)}s (${((data.h / data.t) * 0.001).toFixed(0)}K/s)${\n    data.solver === SOLVER_TYPE_JS ? \" JS Fallback\" : \"\"\n  }`;\n  return getTemplate(\n    fieldName,\n    l.rtl, \n    `<title>${l.text_completed_sr}</title><path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z\"></path>`,\n    false,\n    l.text_completed,\n    solution,\n    undefined,\n    false,\n    timeData,\n    \"frc-success\"\n  );\n}\n\nexport function getExpiredHTML(fieldName: string, l: Localization) {\n  return getTemplate(fieldName,  l.rtl, errorSVG, true, l.text_expired, \".EXPIRED\", l.button_restart);\n}\n\nexport function getErrorHTML(\n  fieldName: string,\n  l: Localization,\n  errorDescription: string,\n  recoverable = true,\n  headless = false\n) {\n  return getTemplate(\n    fieldName,\n    l.rtl, \n    errorSVG,\n    true,\n    `<b>${l.text_error}</b><br>${errorDescription}`,\n    headless ? \".HEADLESS_ERROR\" : \".ERROR\",\n    recoverable ? l.button_retry : undefined\n  );\n}\n\nexport function findCaptchaElements() {\n  const elements = document.querySelectorAll(\".frc-captcha\");\n  if (elements.length === 0) {\n    console.warn(\"FriendlyCaptcha: No div was found with .frc-captcha class\");\n  }\n  return elements;\n}\n\n/**\n * Injects the style if no #frc-style element is already present\n * (to support custom stylesheets)\n */\nexport function injectStyle(styleNonce: string | null = null) {\n  if (!document.querySelector(\"#frc-style\")) {\n    const styleSheet = document.createElement(\"style\");\n    styleSheet.id = \"frc-style\";\n    styleSheet.innerHTML = css;\n\n    if (styleNonce) {\n      styleSheet.setAttribute('nonce', styleNonce);\n    }\n\n    document.head.appendChild(styleSheet);\n  }\n}\n\n/**\n * @param element parent element of friendlycaptcha\n * @param progress value between 0 and 1\n */\nexport function updateProgressBar(element: HTMLElement, data: ProgressMessage) {\n  const p = element.querySelector(\".frc-progress\") as HTMLProgressElement;\n  const perc = (data.i + 1) / data.n;\n  if (p) {\n    p.value = perc;\n    p.innerText = (perc*100).toFixed(1) + \"%\";\n    p.title = data.i + 1 + \"/\" + data.n + \" (\" + ((data.h / data.t) * 0.001).toFixed(0) + \"K/s)\";\n  }\n}\n\n/**\n * Traverses parent nodes until a <form> is found, returns null if not found.\n */\nexport function findParentFormElement(element: HTMLElement) {\n  while (element.tagName !== \"FORM\") {\n    element = element.parentElement as HTMLElement;\n    if (!element) {\n      return null;\n    }\n  }\n  return element;\n}\n\n/**\n * Add listener to specified element that will only fire once on focus.\n */\nexport function executeOnceOnFocusInEvent(element: HTMLElement, listener: (this: HTMLElement, fe: FocusEvent) => any) {\n  element.addEventListener(\"focusin\", listener, { once: true, passive: true });\n}\n","// Defensive init to make it easier to integrate with Gatsby, NextJS, and friends.\nlet nav: Navigator;\nlet ua: string;\nif (typeof navigator !== \"undefined\" && typeof navigator.userAgent === \"string\") {\n  nav = navigator;\n  ua = nav.userAgent.toLowerCase();\n}\n\n/**\n * Headless browser detection on the clientside is imperfect. One can modify any clientside code to disable or change this check,\n * and one can spoof whatever is checked here. However, that doesn't make it worthless: it's yet another hurdle for spammers and\n * it stops unsophisticated scripters from making any request whatsoever.\n */\nexport function isHeadless() {\n  return (\n    //tell-tale bot signs\n    ua.indexOf(\"headless\") !== -1 ||\n    nav.appVersion.indexOf(\"Headless\") !== -1 ||\n    ua.indexOf(\"bot\") !== -1 || // http://www.useragentstring.com/pages/useragentstring.php?typ=Browser\n    ua.indexOf(\"crawl\") !== -1 || // Only IE5 has two distributions that has this on windows NT.. so yeah.\n    nav.webdriver === true ||\n    !nav.language ||\n    (nav.languages !== undefined && !nav.languages.length) // IE 11 does not support NavigatorLanguage.languages https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages\n  );\n}\n","import { decode } from \"friendly-pow/base64\";\nimport { difficultyToThreshold } from \"friendly-pow/encoding\";\nimport { NUMBER_OF_PUZZLES_OFFSET, PUZZLE_DIFFICULTY_OFFSET, PUZZLE_EXPIRY_OFFSET } from \"friendly-pow/puzzle\";\nimport { Localization } from \"./localization\";\n\nexport interface Puzzle {\n  signature: string;\n  base64: string;\n  buffer: Uint8Array; // input puzzle\n  threshold: number; // Related to difficulty\n  n: number; // Amount of puzzles to solve\n  expiry: number; // Expiry in milliseconds from now\n}\n\nexport function decodeBase64Puzzle(base64Puzzle: string): Puzzle {\n  const parts = base64Puzzle.split(\".\");\n  const puzzle = parts[1];\n  const arr = decode(puzzle);\n  return {\n    signature: parts[0],\n    base64: puzzle,\n    buffer: arr,\n    n: arr[NUMBER_OF_PUZZLES_OFFSET],\n    threshold: difficultyToThreshold(arr[PUZZLE_DIFFICULTY_OFFSET]),\n    expiry: arr[PUZZLE_EXPIRY_OFFSET] * 300000,\n  };\n}\n\nexport async function getPuzzle(urlsSeparatedByComma: string, siteKey: string, lang: Localization): Promise<string> {\n  const urls = urlsSeparatedByComma.split(\",\");\n  for (let i = 0; i < urls.length; i++) {\n    try {\n      const response = await fetchAndRetryWithBackoff(\n        urls[i] + \"?sitekey=\" + siteKey,\n        { headers: [[\"x-frc-client\", \"js-0.9.19\"]], mode: \"cors\" },\n        2\n      );\n      if (response.ok) {\n        const json = await response.json();\n        return json.data.puzzle;\n      } else {\n        let json;\n        try {\n          json = await response.json();\n        } catch (e) {\n          /* Do nothing, the error is not valid JSON */\n        }\n\n        if (json && json.errors && json.errors[0] === \"endpoint_not_enabled\") {\n          throw Error(`Endpoint not allowed (${response.status})`);\n        }\n\n        if (i === urls.length - 1) {\n          throw Error(`Response status ${response.status} ${response.statusText} ${json ? json.errors : \"\"}`);\n        }\n      }\n    } catch (e) {\n      console.error(\"[FRC Fetch]:\", e);\n      const err = new Error(`${lang.text_fetch_error} <a class=\"frc-err-url\" href=\"${urls[i]}\">${urls[i]}</a>`);\n      (err as any).rawError = e;\n      throw err;\n    }\n  }\n  // This code should never be reached.\n  throw Error(`Internal error`);\n}\n\n/**\n * Retries given request with exponential backoff (starting with 1000ms delay, multiplying by 4 every time)\n * @param url Request (can be string url) to fetch\n * @param opts Options for fetch\n * @param n Number of times to attempt before giving up.\n */\nexport async function fetchAndRetryWithBackoff(url: RequestInfo, opts: RequestInit, n: number): Promise<Response> {\n  let time = 1000;\n  return fetch(url, opts).catch(async (error) => {\n    if (n === 0) throw error;\n    await new Promise((r) => setTimeout(r, time));\n    time *= 4;\n    return fetchAndRetryWithBackoff(url, opts, n - 1);\n  });\n}\n","import { expiryToDurationInSeconds } from \"./encoding\";\nimport { CHALLENGE_SIZE_BYTES } from \"./constants\";\nexport const PUZZLE_TIMESTAMP_OFFSET = 0;\nexport const ACCOUNT_ID_OFFSET = 4;\nexport const APP_ID_OFFSET = 8;\nexport const PUZZLE_VERSION_OFFSET = 12;\nexport const PUZZLE_EXPIRY_OFFSET = 13;\nexport const NUMBER_OF_PUZZLES_OFFSET = 14;\nexport const PUZZLE_DIFFICULTY_OFFSET = 15;\nexport const PUZZLE_NONCE_OFFSET = 24;\nexport const PUZZLE_USER_DATA_OFFSET = 32;\nexport const PUZZLE_USER_DATA_MAX_LENGTH = 32;\nexport function getPuzzleSolverInputs(puzzleBuffer, numPuzzles) {\n    const startingPoints = [];\n    for (let i = 0; i < numPuzzles; i++) {\n        const input = new Uint8Array(CHALLENGE_SIZE_BYTES);\n        input.set(puzzleBuffer);\n        input[120] = i;\n        startingPoints.push(input);\n    }\n    return startingPoints;\n}\n/**\n * Combine multiple solutions (8 byte values) into a single array\n * @param solutions\n */\nexport function combineSolutions(solutions) {\n    const combined = new Uint8Array(solutions.length * 8);\n    for (let i = 0; i < solutions.length; i++) {\n        combined.set(solutions[i], i * 8);\n    }\n    return combined;\n}\n/**\n * Time in seconds the puzzle is valid for.\n * @param puzzleBuffer\n */\nexport function getPuzzleTTL(puzzleBuffer) {\n    return expiryToDurationInSeconds(puzzleBuffer[PUZZLE_EXPIRY_OFFSET]);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHV6emxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3B1enpsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFlBQXdCLEVBQUUsVUFBa0I7SUFDaEYsTUFBTSxjQUFjLEdBQWlCLEVBQUUsQ0FBQztJQUV4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1QjtJQUNELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsU0FBdUI7SUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDbkM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxZQUF3QjtJQUNuRCxPQUFPLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4cGlyeVRvRHVyYXRpb25JblNlY29uZHMgfSBmcm9tIFwiLi9lbmNvZGluZ1wiO1xuaW1wb3J0IHsgQ0hBTExFTkdFX1NJWkVfQllURVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGNvbnN0IFBVWlpMRV9USU1FU1RBTVBfT0ZGU0VUID0gMDtcbmV4cG9ydCBjb25zdCBBQ0NPVU5UX0lEX09GRlNFVCA9IDQ7XG5leHBvcnQgY29uc3QgQVBQX0lEX09GRlNFVCA9IDg7XG5leHBvcnQgY29uc3QgUFVaWkxFX1ZFUlNJT05fT0ZGU0VUID0gMTI7XG5leHBvcnQgY29uc3QgUFVaWkxFX0VYUElSWV9PRkZTRVQgPSAxMztcbmV4cG9ydCBjb25zdCBOVU1CRVJfT0ZfUFVaWkxFU19PRkZTRVQgPSAxNDtcbmV4cG9ydCBjb25zdCBQVVpaTEVfRElGRklDVUxUWV9PRkZTRVQgPSAxNTtcbmV4cG9ydCBjb25zdCBQVVpaTEVfTk9OQ0VfT0ZGU0VUID0gMjQ7XG5leHBvcnQgY29uc3QgUFVaWkxFX1VTRVJfREFUQV9PRkZTRVQgPSAzMjtcblxuZXhwb3J0IGNvbnN0IFBVWlpMRV9VU0VSX0RBVEFfTUFYX0xFTkdUSCA9IDMyO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHV6emxlU29sdmVySW5wdXRzKHB1enpsZUJ1ZmZlcjogVWludDhBcnJheSwgbnVtUHV6emxlczogbnVtYmVyKTogVWludDhBcnJheVtdIHtcbiAgY29uc3Qgc3RhcnRpbmdQb2ludHM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUHV6emxlczsgaSsrKSB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgVWludDhBcnJheShDSEFMTEVOR0VfU0laRV9CWVRFUyk7XG4gICAgaW5wdXQuc2V0KHB1enpsZUJ1ZmZlcik7XG4gICAgaW5wdXRbMTIwXSA9IGk7XG4gICAgc3RhcnRpbmdQb2ludHMucHVzaChpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0aW5nUG9pbnRzO1xufVxuXG4vKipcbiAqIENvbWJpbmUgbXVsdGlwbGUgc29sdXRpb25zICg4IGJ5dGUgdmFsdWVzKSBpbnRvIGEgc2luZ2xlIGFycmF5XG4gKiBAcGFyYW0gc29sdXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lU29sdXRpb25zKHNvbHV0aW9uczogVWludDhBcnJheVtdKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoc29sdXRpb25zLmxlbmd0aCAqIDgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvbHV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbWJpbmVkLnNldChzb2x1dGlvbnNbaV0sIGkgKiA4KTtcbiAgfVxuICByZXR1cm4gY29tYmluZWQ7XG59XG5cbi8qKlxuICogVGltZSBpbiBzZWNvbmRzIHRoZSBwdXp6bGUgaXMgdmFsaWQgZm9yLlxuICogQHBhcmFtIHB1enpsZUJ1ZmZlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHV6emxlVFRMKHB1enpsZUJ1ZmZlcjogVWludDhBcnJheSkge1xuICByZXR1cm4gZXhwaXJ5VG9EdXJhdGlvbkluU2Vjb25kcyhwdXp6bGVCdWZmZXJbUFVaWkxFX0VYUElSWV9PRkZTRVRdKTtcbn1cbiJdfQ==","/**\n * Maps a value between 0 and 255 to a difficulty threshold (as uint32)\n * Difficulty 0 maps to 99.99% probability of being right on the first attempt\n * Anything above 250 needs 2^32 tries on average to solve.\n * 150 to 180 seems reasonable\n */\nexport function difficultyToThreshold(value) {\n    if (value > 255) {\n        value = 255;\n    }\n    else if (value < 0) {\n        value = 0;\n    }\n    return Math.pow(2, (255.999 - value) / 8.0) >>> 0;\n}\n/**\n * Maps a value between 0 and 255 to a time duration in seconds that a puzzle is valid for.\n */\nexport function expiryToDurationInSeconds(value) {\n    if (value > 255) {\n        value = 255;\n    }\n    else if (value < 0) {\n        value = 0;\n    }\n    return value * 300;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBUztJQUM3QyxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDZixLQUFLLEdBQUcsR0FBRyxDQUFDO0tBQ2I7U0FBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDcEIsS0FBSyxHQUFHLENBQUMsQ0FBQztLQUNYO0lBRUQsT0FBUSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBSSxLQUFhLENBQUMsR0FBRyxHQUFHLENBQVMsS0FBSyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQVM7SUFDakQsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2YsS0FBSyxHQUFHLEdBQUcsQ0FBQztLQUNiO1NBQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDWDtJQUVELE9BQVEsS0FBYSxHQUFHLEdBQUcsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXBzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgdG8gYSBkaWZmaWN1bHR5IHRocmVzaG9sZCAoYXMgdWludDMyKVxuICogRGlmZmljdWx0eSAwIG1hcHMgdG8gOTkuOTklIHByb2JhYmlsaXR5IG9mIGJlaW5nIHJpZ2h0IG9uIHRoZSBmaXJzdCBhdHRlbXB0XG4gKiBBbnl0aGluZyBhYm92ZSAyNTAgbmVlZHMgMl4zMiB0cmllcyBvbiBhdmVyYWdlIHRvIHNvbHZlLlxuICogMTUwIHRvIDE4MCBzZWVtcyByZWFzb25hYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmaWN1bHR5VG9UaHJlc2hvbGQodmFsdWU6IHU4KTogdTMyIHtcbiAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgdmFsdWUgPSAyNTU7XG4gIH0gZWxzZSBpZiAodmFsdWUgPCAwKSB7XG4gICAgdmFsdWUgPSAwO1xuICB9XG5cbiAgcmV0dXJuIChNYXRoLnBvdygyLCAoMjU1Ljk5OSAtICh2YWx1ZSBhcyBmNjQpKSAvIDguMCkgYXMgdTMyKSA+Pj4gMDtcbn1cblxuLyoqXG4gKiBNYXBzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgdG8gYSB0aW1lIGR1cmF0aW9uIGluIHNlY29uZHMgdGhhdCBhIHB1enpsZSBpcyB2YWxpZCBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBpcnlUb0R1cmF0aW9uSW5TZWNvbmRzKHZhbHVlOiB1OCk6IHUzMiB7XG4gIGlmICh2YWx1ZSA+IDI1NSkge1xuICAgIHZhbHVlID0gMjU1O1xuICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgIHZhbHVlID0gMDtcbiAgfVxuXG4gIHJldHVybiAodmFsdWUgYXMgdTMyKSAqIDMwMDtcbn1cbiJdfQ==","/* eslint-disable @typescript-eslint/camelcase */\n// Tip: keep the messages short, there isn't a lot of space in the widget\nexport interface Localization {\n  // While the widget is starting: usually not visible as it initializes instantly.\n  text_init: string;\n\n  // Before the widget is started\n  text_ready: string;\n  button_start: string;\n\n  // While the widget is downloading a puzzle (usually only takes a split second)\n  // If this is hard to translate, you could put something simple like \"Loading...\"\n  text_fetching: string;\n\n  // While the widget is solving\n  text_solving: string;\n\n  // Completed\n  text_completed: string;\n  // Additional text shown in label. Especially useful for screen readers used by blind users.\n  text_completed_sr: string;\n\n  // Expired (the puzzle was solved, but then waited say a day without submitting)\n  text_expired: string;\n  button_restart: string;\n\n  // Error\n  text_error: string;\n  button_retry: string;\n  // This error message is followed by the URL, a space is added.\n  text_fetch_error: string;\n\n  // Right to left language\n  rtl?: boolean;\n}\n\n// English\nconst LANG_EN: Localization = {\n  text_init: \"Initializing...\",\n\n  text_ready: \"Anti-Robot Verification\",\n  button_start: \"Click to start verification\",\n\n  text_fetching: \"Fetching Challenge\",\n\n  text_solving: \"Verifying you are human...\",\n  text_completed: \"I am human\",\n  text_completed_sr: \"Automatic spam check completed\",\n\n  text_expired: \"Anti-Robot verification expired\",\n  button_restart: \"Restart\",\n\n  text_error: \"Verification failed\",\n  button_retry: \"Retry\",\n  text_fetch_error: \"Failed to connect to\",\n};\n\n// French\nconst LANG_FR: Localization = {\n  text_init: \"Chargement...\",\n\n  text_ready: \"Vérification Anti-Robot\",\n  button_start: \"Clique ici pour vérifier\",\n\n  text_fetching: \"Chargement du défi\",\n\n  text_solving: \"Nous vérifions que vous n'êtes pas un robot...\",\n  text_completed: \"Je ne suis pas un robot\",\n  text_completed_sr: \"Vérification automatique des spams terminée\",\n\n  text_expired: \"Vérification anti-robot expirée\",\n  button_restart: \"Redémarrer\",\n\n  text_error: \"Échec de la vérification\",\n  button_retry: \"Recommencer\",\n  text_fetch_error: \"Problème de connexion avec\",\n};\n\n// German\nconst LANG_DE: Localization = {\n  text_init: \"Initialisierung...\",\n\n  text_ready: \"Anti-Roboter-Verifizierung\",\n  button_start: \"Hier klicken\",\n\n  text_fetching: \"Herausforderung laden...\",\n\n  text_solving: \"Verifizierung, dass Sie ein Mensch sind...\",\n  text_completed: \"Ich bin ein Mensch\",\n  text_completed_sr: \"Automatische Spamprüfung abgeschlossen\",\n\n  text_expired: \"Verifizierung abgelaufen\",\n  button_restart: \"Erneut starten\",\n\n  text_error: \"Verifizierung fehlgeschlagen\",\n  button_retry: \"Erneut versuchen\",\n  text_fetch_error: \"Verbindungsproblem mit\",\n};\n\n// Dutch\nconst LANG_NL: Localization = {\n  text_init: \"Initializeren...\",\n\n  text_ready: \"Anti-robotverificatie\",\n  button_start: \"Klik om te starten\",\n\n  text_fetching: \"Aan het laden...\",\n\n  text_solving: \"Anti-robotverificatie bezig...\",\n  text_completed: \"Ik ben een mens\",\n  text_completed_sr: \"Automatische anti-spamcheck voltooid\",\n\n  text_expired: \"Verificatie verlopen\",\n  button_restart: \"Opnieuw starten\",\n\n  text_error: \"Verificatie mislukt\",\n  button_retry: \"Opnieuw proberen\",\n  text_fetch_error: \"Verbinding mislukt met\",\n};\n\n// Italian\nconst LANG_IT: Localization = {\n  text_init: \"Inizializzazione...\",\n\n  text_ready: \"Verifica Anti-Robot\",\n  button_start: \"Clicca per iniziare\",\n\n  text_fetching: \"Caricamento...\",\n\n  text_solving: \"Verificando che sei umano...\",\n  text_completed: \"Non sono un robot\",\n  text_completed_sr: \"Controllo automatico dello spam completato\", // TODO: verify by native speaker\n\n  text_expired: \"Verifica Anti-Robot scaduta\",\n  button_restart: \"Ricomincia\",\n\n  text_error: \"Verifica fallita\",\n  button_retry: \"Riprova\",\n  text_fetch_error: \"Problema di connessione con\",\n};\n\n// Portuguese\nconst LANG_PT: Localization = {\n  text_init: \"Inicializando...\",\n\n  text_ready: \"Verificação Anti-Robô\",\n  button_start: \"Clique para iniciar verificação\",\n\n  text_fetching: \"Carregando...\",\n\n  text_solving: \"Verificando se você é humano...\",\n  text_completed: \"Eu sou humano\",\n  text_completed_sr: \"Verificação automática de spam concluída\", // TODO: verify by native speaker\n\n  text_expired: \"Verificação Anti-Robô expirada\",\n  button_restart: \"Reiniciar\",\n\n  text_error: \"Verificação falhou\",\n  button_retry: \"Tentar novamente\",\n  text_fetch_error: \"Falha de conexão com\",\n};\n\n// Spanish\nconst LANG_ES: Localization = {\n  text_init: \"Inicializando...\",\n\n  text_ready: \"Verificación Anti-Robot\",\n  button_start: \"Haga clic para iniciar la verificación\",\n\n  text_fetching: \"Cargando desafío\",\n\n  text_solving: \"Verificando que eres humano...\",\n  text_completed: \"Soy humano\",\n  text_completed_sr: \"Verificación automática de spam completada\", // TODO: verify by native speaker\n\n  text_expired: \"Verificación Anti-Robot expirada\",\n  button_restart: \"Reiniciar\",\n\n  text_error: \"Ha fallado la verificación\",\n  button_retry: \"Intentar de nuevo\",\n  text_fetch_error: \"Error al conectarse a\",\n};\n\n// Catalan\nconst LANG_CA: Localization = {\n  text_init: \"Inicialitzant...\",\n\n  text_ready: \"Verificació Anti-Robot\",\n  button_start: \"Fes clic per començar la verificació\",\n\n  text_fetching: \"Carregant repte\",\n\n  text_solving: \"Verificant que ets humà...\",\n  text_completed: \"Soc humà\",\n  text_completed_sr: \"Verificació automàtica de correu brossa completada\", // TODO: verify by native speaker\n\n  text_expired: \"La verificació Anti-Robot ha expirat\",\n  button_restart: \"Reiniciar\",\n\n  text_error: \"Ha fallat la verificació\",\n  button_retry: \"Tornar a provar\",\n  text_fetch_error: \"Error connectant a\",\n};\n\n// Japanese\nconst LANG_JA: Localization = {\n  text_init: \"開始しています...\",\n\n  text_ready: \"アンチロボット認証\",\n  button_start: \"クリックして認証を開始\",\n\n  text_fetching: \"ロードしています\",\n\n  text_solving: \"認証中...\",\n  text_completed: \"私はロボットではありません\",\n  text_completed_sr: \"自動スパムチェックが完了しました\", // TODO: verify by native speaker\n\n  text_expired: \"認証の期限が切れています\",\n  button_restart: \"再度認証を行う\",\n\n  text_error: \"認証にエラーが発生しました\",\n  button_retry: \"再度認証を行う\",\n  text_fetch_error: \"接続ができませんでした\",\n};\n\n// Danish\nconst LANG_DA: Localization = {\n  text_init: \"Aktiverer...\",\n\n  text_ready: \"Jeg er ikke en robot\",\n  button_start: \"Klik for at starte verifikationen\",\n\n  text_fetching: \"Henter data\",\n\n  text_solving: \"Kontrollerer at du er et menneske...\",\n  text_completed: \"Jeg er et menneske.\",\n  text_completed_sr: \"Automatisk spamkontrol gennemført\",\n\n  text_expired: \"Verifikationen kunne ikke fuldføres\",\n  button_restart: \"Genstart\",\n\n  text_error: \"Bekræftelse mislykkedes\",\n  button_retry: \"Prøv igen\",\n  text_fetch_error: \"Forbindelsen mislykkedes\",\n};\n\n// Russian\nconst LANG_RU: Localization = {\n  text_init: \"Инициализация...\",\n\n  text_ready: \"АнтиРобот проверка\",\n  button_start: \"Нажмите, чтобы начать проверку\",\n\n  text_fetching: \"Получаю задачу\",\n\n  text_solving: \"Проверяю, что вы человек...\",\n  text_completed: \"Я человек\",\n  text_completed_sr: \"Aвтоматическая проверка на спам завершена\", // TODO: verify by native speaker\n\n  text_expired: \"Срок АнтиРоботной проверки истёк\",\n  button_restart: \"Начать заново\",\n\n  text_error: \"Ошибка проверки\",\n  button_retry: \"Повторить ещё раз\",\n  text_fetch_error: \"Ошибка подключения\",\n};\n\n// Swedish\nconst LANG_SV: Localization = {\n  text_init: \"Aktiverar...\",\n\n  text_ready: \"Jag är inte en robot\",\n  button_start: \"Klicka för att verifiera\",\n\n  text_fetching: \"Hämtar data\",\n\n  text_solving: \"Kontrollerar att du är människa...\",\n  text_completed: \"Jag är en människa\",\n  text_completed_sr: \"Automatisk spamkontroll slutförd\",\n\n  text_expired: \"Anti-robot-verifieringen har löpt ut\",\n  button_restart: \"Börja om\",\n\n  text_error: \"Verifiering kunde inte slutföras\",\n  button_retry: \"Omstart\",\n  text_fetch_error: \"Verifiering misslyckades\",\n};\n\n// Turkish\nconst LANG_TR: Localization = {\n  text_init: \"Başlatılıyor...\",\n\n  text_ready: \"Anti-Robot Doğrulaması\",\n  button_start: \"Doğrulamayı başlatmak için tıklayın\",\n\n  text_fetching: \"Yükleniyor\",\n\n  text_solving: \"Robot olmadığınız doğrulanıyor...\",\n  text_completed: \"Ben bir insanım\",\n  text_completed_sr: \"Otomatik spam kontrolü tamamlandı\",\n\n  text_expired: \"Anti-Robot doğrulamasının süresi doldu\",\n  button_restart: \"Yeniden başlat\",\n\n  text_error: \"Doğrulama başarısız oldu\",\n  button_retry: \"Tekrar dene\",\n  text_fetch_error: \"Bağlantı başarısız oldu\",\n};\n\n// Greek\nconst LANG_EL: Localization = {\n  text_init: \"Προετοιμασία...\",\n\n  text_ready: \"Anti-Robot Επαλήθευση\",\n  button_start: \" Κάντε κλικ για να ξεκινήσει η επαλήθευση\",\n\n  text_fetching: \" Λήψη πρόκλησης\",\n\n  text_solving: \" Επιβεβαίωση ανθρώπου...\",\n  text_completed: \"Είμαι άνθρωπος\",\n  text_completed_sr: \" Ο αυτόματος έλεγχος ανεπιθύμητου περιεχομένου ολοκληρώθηκε\",\n\n  text_expired: \" Η επαλήθευση Anti-Robot έληξε\",\n  button_restart: \" Επανεκκίνηση\",\n\n  text_error: \" Η επαλήθευση απέτυχε\",\n  button_retry: \" Δοκιμάστε ξανά\",\n  text_fetch_error: \" Αποτυχία σύνδεσης με\",\n};\n\n// Ukrainian\nconst LANG_UK: Localization = {\n  text_init: \"Ініціалізація...\",\n\n  text_ready: \"Антиробот верифікація\",\n  button_start: \"Натисніть, щоб розпочати верифікацію\",\n\n  text_fetching: \"З’єднання\",\n\n  text_solving: \"Перевірка, що ви не робот...\",\n  text_completed: \"Я не робот\",\n  text_completed_sr: \"Автоматична перевірка спаму завершена\",\n\n  text_expired: \"Час вичерпано\",\n  button_restart: \"Почати знову\",\n\n  text_error: \"Верифікація не вдалась\",\n  button_retry: \"Спробувати знову\",\n  text_fetch_error: \"Не вдалось з’єднатись\",\n};\n\n// Bulgarian\nconst LANG_BG: Localization = {\n  text_init: \"Инициализиране...\",\n\n  text_ready: \"Анти-робот проверка\",\n  button_start: \"Щракнете, за да започнете проверката\",\n\n  text_fetching: \"Предизвикателство\",\n\n  text_solving: \"Проверяваме дали си човек...\",\n  text_completed: \"Аз съм човек\",\n  text_completed_sr: \"Автоматичната проверка за спам е завършена\",\n\n  text_expired: \"Анти-Робот проверката изтече\",\n  button_restart: \"Рестартирайте\",\n\n  text_error: \"Неуспешна проверка\",\n  button_retry: \"Опитайте пак\",\n  text_fetch_error: \"Неуспешно свързване с\",\n};\n\n// Czech\nconst LANG_CS: Localization = {\n  text_init: \"Inicializace...\",\n\n  text_ready: \"Ověření proti robotům\",\n  button_start: \"Klikněte pro ověření\",\n\n  text_fetching: \"Problém při načítání\",\n\n  text_solving: \"Ověření, že jste člověk...\",\n  text_completed: \"Jsem člověk\",\n  text_completed_sr: \"Automatická kontrola spamu dokončena\",\n\n  text_expired: \"Ověření proti robotům vypršelo\",\n  button_restart: \"Restartovat\",\n\n  text_error: \"Ověření se nezdařilo\",\n  button_retry: \"Zkusit znovu\",\n  text_fetch_error: \"Připojení se nezdařilo\",\n};\n\n// Slovak\nconst LANG_SK: Localization = {\n  text_init: \"Inicializácia...\",\n\n  text_ready: \"Overenie proti robotom\",\n  button_start: \"Kliknite pre overenie\",\n\n  text_fetching: \"Problém pri načítaní\",\n\n  text_solving: \"Overenie, že ste človek...\",\n  text_completed: \"Som človek\",\n  text_completed_sr: \"Automatická kontrola spamu dokončená\",\n\n  text_expired: \"Overenie proti robotom vypršalo\",\n  button_restart: \"Reštartovať\",\n\n  text_error: \"Overenie sa nepodarilo\",\n  button_retry: \"Skúsiť znova\",\n  text_fetch_error: \"Pripojenie sa nepodarilo\",\n};\n\n// Norwegian\nconst LANG_NO: Localization = {\n  text_init: \" Aktiverer...\",\n\n  text_ready: \"Jeg er ikke en robot\",\n  button_start: \"Klikk for å starte verifiseringen\",\n\n  text_fetching: \"Henter data\",\n\n  text_solving: \"Sjekker at du er et menneske...\",\n  text_completed: \"Jeg er et menneske\",\n  text_completed_sr: \"Automatisk spam-sjekk fullført\",\n\n  text_expired: \"Verifisering kunne ikke fullføres\",\n  button_restart: \"Omstart\",\n\n  text_error: \"Bekreftelsen mislyktes\",\n  button_retry: \"Prøv på nytt\",\n  text_fetch_error: \"Tilkoblingen mislyktes\",\n};\n\n// Finnish\nconst LANG_FI: Localization = {\n  text_init: \"Aktivoidaan...\",\n\n  text_ready: \"En ole robotti\",\n  button_start: \"Aloita vahvistus klikkaamalla\",\n\n  text_fetching: \"Haetaan tietoja\",\n\n  text_solving: \"Tarkistaa, että olet ihminen...\",\n  text_completed: \"Olen ihminen\",\n  text_completed_sr: \"Automaattinen roskapostin tarkistus suoritettu\",\n\n  text_expired: \"Vahvistusta ei voitu suorittaa loppuun\",\n  button_restart: \"Uudelleenkäynnistys\",\n\n  text_error: \"Vahvistus epäonnistui\",\n  button_retry: \"Yritä uudelleen\",\n  text_fetch_error: \"Yhteys epäonnistui\",\n};\n\n// Latvian\nconst LANG_LV: Localization = {\n  text_init: \"Notiek inicializēšana...\",\n\n  text_ready: \"Verifikācija, ka neesat robots\",\n  button_start: \"Noklikšķiniet, lai sāktu verifikāciju\",\n\n  text_fetching: \"Notiek drošības uzdevuma izgūšana\",\n\n  text_solving: \"Notiek pārbaude, vai esat cilvēks...\",\n  text_completed: \"Es esmu cilvēks\",\n  text_completed_sr: \"Automātiska surogātpasta pārbaude pabeigta\",\n\n  text_expired: \"Verifikācijas, ka neesat robots, derīgums beidzies\",\n  button_restart: \"Restartēt\",\n\n  text_error: \"Verifikācija neizdevās\",\n  button_retry: \"Mēģināt vēlreiz\",\n  text_fetch_error: \"Neizdevās izveidot savienojumu ar\",\n};\n\n// Lithuanian\nconst LANG_LT: Localization = {\n  text_init: \"Inicijuojama...\",\n\n  text_ready: \"Patikrinimas, ar nesate robotas\",\n  button_start: \"Spustelėkite patikrinimui pradėti\",\n\n  text_fetching: \"Gavimo iššūkis\",\n\n  text_solving: \"Tikrinama, ar esate žmogus...\",\n  text_completed: \"Esu žmogus\",\n  text_completed_sr: \"Automatinė patikra dėl pašto šiukšlių atlikta\",\n\n  text_expired: \"Patikrinimas, ar nesate robotas, baigė galioti\",\n  button_restart: \"Pradėti iš naujo\",\n\n  text_error: \"Patikrinimas nepavyko\",\n  button_retry: \"Kartoti\",\n  text_fetch_error: \"Nepavyko prisijungti prie\",\n};\n\n// Polish\nconst LANG_PL: Localization = {\n  text_init: \"Inicjowanie...\",\n\n  text_ready: \"Weryfikacja antybotowa\",\n  button_start: \"Kliknij, aby rozpocząć weryfikację\",\n\n  text_fetching: \"Pobieranie\",\n\n  text_solving: \"Weryfikacja, czy nie jesteś robotem...\",\n  text_completed: \"Nie jestem robotem\",\n  text_completed_sr: \"Zakończono automatyczne sprawdzanie spamu\",\n\n  text_expired: \"Weryfikacja antybotowa wygasła\",\n  button_restart: \"Uruchom ponownie\",\n\n  text_error: \"Weryfikacja nie powiodła się\",\n  button_retry: \"Spróbuj ponownie\",\n  text_fetch_error: \"Nie udało się połączyć z\",\n};\n\n// Estonian\nconst LANG_ET: Localization = {\n  text_init: \"Initsialiseerimine...\",\n\n  text_ready: \"Robotivastane kinnitus\",\n  button_start: \"Kinnitamisega alustamiseks klõpsake\",\n\n  text_fetching: \"Väljakutse toomine\",\n\n  text_solving: \"Kinnitatakse, et sa oled inimene...\",\n  text_completed: \"Ma olen inimene\",\n  text_completed_sr: \"Automaatne rämpsposti kontroll on lõpetatud\",\n\n  text_expired: \"Robotivastane kinnitus aegus\",\n  button_restart: \"Taaskäivita\",\n\n  text_error: \"Kinnitamine nurjus\",\n  button_retry: \"Proovi uuesti\",\n  text_fetch_error: \"Ühenduse loomine nurjus\",\n};\n\n// Croatian\nconst LANG_HR: Localization = {\n  text_init: \"Početno postavljanje...\",\n\n  text_ready: \"Provjera protiv robota\",\n  button_start: \"Kliknite za početak provjere\",\n\n  text_fetching: \"Dohvaćanje izazova\",\n\n  text_solving: \"Provjeravamo jeste li čovjek...\",\n  text_completed: \"Nisam robot\",\n  text_completed_sr: \"Automatska provjera je završena\",\n\n  text_expired: \"Vrijeme za provjeru protiv robota je isteklo\",\n  button_restart: \"Osvježi\",\n\n  text_error: \"Provjera nije uspjlela\",\n  button_retry: \" Ponovo pokreni\",\n  text_fetch_error: \"Nije moguće uspostaviti vezu\",\n};\n\n// Serbian\nconst LANG_SR: Localization = {\n  text_init: \"Pokretanje...\",\n\n  text_ready: \"Anti-Robot Verifikacija\",\n  button_start: \"Kliknite da biste započeli verifikaciju\",\n\n  text_fetching: \"Učitavanje izazova\",\n\n  text_solving: \"Verifikacija da ste čovek...\",\n  text_completed: \"Ja sam čovek\",\n  text_completed_sr: \"Automatska provera neželjene pošte je završena\",\n\n  text_expired: \"Anti-Robot verifikacija je istekla\",\n  button_restart: \"Ponovo pokrenuti\",\n\n  text_error: \"Verifikacija nije uspela\",\n  button_retry: \"Pokušajte ponovo\",\n  text_fetch_error: \"Neuspelo povezivanje sa...\",\n};\n\n// Slovenian\nconst LANG_SL: Localization = {\n  text_init: \"Inicializiranje...\",\n\n  text_ready: \"Preverjanje robotov\",\n  button_start: \"Kliknite za začetek preverjanja\",\n\n  text_fetching: \"Prenašanje izziva\",\n\n  text_solving: \"Preverjamo, ali ste človek\",\n  text_completed: \"Nisem robot\",\n  text_completed_sr: \"Avtomatsko preverjanje je zaključeno\",\n\n  text_expired: \"Preverjanje robotov je poteklo\",\n  button_restart: \"Osveži\",\n\n  text_error: \"Preverjanje ni uspelo\",\n  button_retry: \"Poskusi ponovno\",\n  text_fetch_error: \"Povezave ni bilo mogoče vzpostaviti\",\n};\n\n// Hungarian\nconst LANG_HU: Localization = {\n  text_init: \"Inicializálás...\",\n\n  text_ready: \"Robotellenes ellenőrzés\",\n  button_start: \"Kattintson az ellenőrzés megkezdéséhez\",\n\n  text_fetching: \"Feladvány lekérése\",\n\n  text_solving: \"Annak igazolása, hogy Ön nem robot...\",\n  text_completed: \"Nem vagyok robot\",\n  text_completed_sr: \"Automatikus spam ellenőrzés befejeződött\",\n\n  text_expired: \"Robotellenes ellenőrzés lejárt\",\n  button_restart: \"Újraindítás\",\n\n  text_error: \"Az ellenőrzés nem sikerült\",\n  button_retry: \"Próbálja újra\",\n  text_fetch_error: \"Nem sikerült csatlakozni\",\n};\n\n// Romanian\nconst LANG_RO: Localization = {\n  text_init: \"Se inițializează...\",\n\n  text_ready: \"Verificare anti-robot\",\n  button_start: \"Click pentru a începe verificarea\",\n\n  text_fetching: \"Downloading\",\n\n  text_solving: \"Verificare că ești om...\",\n  text_completed: \"Sunt om\",\n  text_completed_sr: \"Verificarea automată a spam-ului a fost finalizată\",\n\n  text_expired: \"Verificarea anti-robot a expirat\",\n  button_restart: \"Restart\",\n\n  text_error: \"Verificare eșuată\",\n  button_retry: \"Reîncearcă\",\n  text_fetch_error: \"Nu s-a putut conecta\",\n};\n\n// Chinese\nconst LANG_ZH: Localization = {\n  text_init: \"初始化中……\",\n\n  text_ready: \"人机验证\",\n  button_start: \"点击开始\",\n\n  text_fetching: \"正在加载\",\n\n  text_solving: \"人机校验中……\",\n  text_completed: \"我不是机器人\",\n  text_completed_sr: \"人机验证完成\",\n\n  text_expired: \"验证已过期\",\n  button_restart: \"重新开始\",\n\n  text_error: \"校验失败\",\n  button_retry: \"重试\",\n  text_fetch_error: \"无法连接到\",\n};\n\n// Traditional Chinese\nconst LANG_ZH_TW: Localization = {\n  text_init: \"正在初始化……\",\n\n  text_ready: \"反機器人驗證\",\n  button_start: \"點擊開始驗證\",\n\n  text_fetching: \"載入中\",\n\n  text_solving: \"反機器人驗證中……\",\n  text_completed: \"我不是機器人\",\n  text_completed_sr: \"驗證完成\",\n\n  text_expired: \"驗證超時\",\n  button_restart: \"重新開始\",\n\n  text_error: \"驗證失敗\",\n  button_retry: \"重試\",\n  text_fetch_error: \"無法連線到\",\n};\n\n// Vietnamese\nconst LANG_VI: Localization = {\n  text_init: \"Đang khởi tạo...\",\n\n  text_ready: \"Xác minh chống Robot\",\n  button_start: \"Bấm vào đây để xác minh\",\n\n  text_fetching: \"Tìm nạp và xử lý thử thách\",\n\n  text_solving: \"Xác minh bạn là người...\",\n  text_completed: \"Bạn là con người\",\n  text_completed_sr: \"Xác minh hoàn tất\",\n\n  text_expired: \"Xác minh đã hết hạn\",\n  button_restart: \"Khởi động lại\",\n\n  text_error: \"Xác minh thất bại\",\n  button_retry: \"Thử lại\",\n  text_fetch_error: \"Không kết nối được\",\n};\n\n// Hebrew\nconst LANG_HE: Localization = {\n  text_init: \"בביצוע...\",\n\n  text_ready: \"אימות אנוש\",\n  button_start: \"צריך ללחוץ להתחלת האימות\",\n\n  text_fetching: \"אתגר המענה בהכנה\",\n\n  text_solving: \"מתבצע אימות אנוש...\",\n  text_completed: \"אני לא רובוט\",\n  text_completed_sr: \"בדיקת הספאם האוטומטית הסתיימה\",\n\n  text_expired: \"פג תוקף אימות האנוש\",\n  button_restart: \"להתחיל שוב\",\n\n  text_error: \"אימות האנוש נכשל\",\n  button_retry: \"לנסות שוב\",\n  text_fetch_error: \"נכשל החיבור אל\",\n\n  rtl: true,\n};\n\n// Thai\nconst LANG_TH: Localization = {\n  text_init: \"การเริ่มต้น...\",\n\n  text_ready: \" การตรวจสอบต่อต้านหุ่นยนต์\",\n  button_start: \"คลิกเพื่อเริ่มการตรวจสอบ\",\n\n  text_fetching: \"การดึงความท้าทาย\",\n\n  text_solving: \"ยืนยันว่าคุณเป็นมนุษย์...\",\n  text_completed: \"ฉันเป็นมนุษย์\",\n  text_completed_sr: \"การตรวจสอบสแปมอัตโนมัติเสร็จสมบูรณ์\",\n\n  text_expired: \"การตรวจสอบ ต่อต้านหุ่นยนต์ หมดอายุ\",\n  button_restart: \"รีสตาร์ท\",\n\n  text_error: \"การยืนยันล้มเหลว\",\n  button_retry: \"ลองใหม่\",\n  text_fetch_error: \"ไม่สามารถเชื่อมต่อได้\"\n};\n\n// South Korean\nconst LANG_KR: Localization = {\n  text_init: \"초기화 중\",\n\n  text_ready: \"Anti-Robot 검증\",\n  button_start: \"검증을 위해 클릭해 주세요\",\n\n  text_fetching: \"검증 준비 중\",\n\n  text_solving: \"검증 중\",\n  text_completed: \"검증이 완료되었습니다\",\n  text_completed_sr: \"자동 스팸 확인 완료\",\n\n  text_expired: \"Anti-Robot 검증 만료\",\n  button_restart: \"다시 시작합니다\",\n\n  text_error: \"검증 실패\",\n  button_retry: \"다시 시도해 주세요\",\n  text_fetch_error: \"연결하지 못했습니다\",\n};\n\n// Arabic\nconst LANG_AR: Localization = {\n  text_init: \"...التهيئة\",\n\n  text_ready: \"يتم التحقيق\",\n  button_start: \"إضغط هنا للتحقيق\",\n\n  text_fetching: \"تهيئة التحدي\",\n\n  text_solving: \"نتحقق من أنك لست روبوتًا...\",\n  text_completed: \"أنا لست روبوتًا\",\n  text_completed_sr: \"تم الانتهاء من التحقق التلقائي من البريد العشوائي\",\n\n  text_expired: \"انتهت صلاحية التحقق\",\n  button_restart: \"إعادة تشغيل\",\n\n  text_error: \"فشل التحقق\",\n  button_retry: \"ابدأ مرة أخرى\",\n  text_fetch_error: \"مشكلة في الاتصال مع\",\n};\n\nexport const localizations = {\n  en: LANG_EN,\n  de: LANG_DE,\n  nl: LANG_NL,\n  fr: LANG_FR,\n  it: LANG_IT,\n  pt: LANG_PT,\n  es: LANG_ES,\n  ca: LANG_CA,\n  ja: LANG_JA,\n  da: LANG_DA,\n  ru: LANG_RU,\n  sv: LANG_SV,\n  tr: LANG_TR,\n  el: LANG_EL,\n  uk: LANG_UK,\n  bg: LANG_BG,\n  cs: LANG_CS,\n  sk: LANG_SK,\n  no: LANG_NO,\n  fi: LANG_FI,\n  lv: LANG_LV,\n  lt: LANG_LT,\n  pl: LANG_PL,\n  et: LANG_ET,\n  hr: LANG_HR,\n  sr: LANG_SR,\n  sl: LANG_SL,\n  hu: LANG_HU,\n  ro: LANG_RO,\n  zh: LANG_ZH,\n  zh_tw: LANG_ZH_TW,\n  vi: LANG_VI,\n  he: LANG_HE,\n  th: LANG_TH,\n  kr: LANG_KR,\n  ar: LANG_AR,\n\n  // alternative language codes\n  nb: LANG_NO,\n};\n","export function createDiagnosticsBuffer(solverID, timeToSolved) {\n    const arr = new Uint8Array(3);\n    const view = new DataView(arr.buffer);\n    view.setUint8(0, solverID);\n    view.setUint16(1, timeToSolved);\n    return arr;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGlhZ25vc3RpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFFBQWUsRUFBRSxZQUFvQjtJQUMzRSxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFaEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpYWdub3N0aWNzQnVmZmVyKHNvbHZlcklEOiAxIHwgMiwgdGltZVRvU29sdmVkOiBudW1iZXIpIHtcbiAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyLmJ1ZmZlcik7XG4gIHZpZXcuc2V0VWludDgoMCwgc29sdmVySUQpO1xuICB2aWV3LnNldFVpbnQxNigxLCB0aW1lVG9Tb2x2ZWQpO1xuXG4gIHJldHVybiBhcnI7XG59XG4iXX0=","import { Puzzle } from \"./puzzle\";\nimport { getPuzzleSolverInputs } from \"friendly-pow/puzzle\";\nimport { createDiagnosticsBuffer } from \"friendly-pow/diagnostics\";\nimport { DoneMessage, ProgressMessage, MessageFromWorker, SolverMessage, StartMessage } from \"./types\";\n// @ts-ignore\nimport workerString from \"../dist/worker.min.js\";\n\n// Defensive init to make it easier to integrate with Gatsby and friends.\nlet URL: any;\nif (typeof window !== \"undefined\") {\n  URL = window.URL || window.webkitURL;\n}\n\nexport class WorkerGroup {\n  private workers: Worker[] = [];\n\n  private puzzleNumber = 0;\n\n  private numPuzzles = 0;\n  private threshold = 0;\n  private startTime = 0;\n  private progress = 0;\n  private totalHashes = 0;\n  private puzzleSolverInputs: Uint8Array[] = [];\n  // The index of the next puzzle\n  private puzzleIndex = 0;\n  private solutionBuffer: Uint8Array = new Uint8Array(0);\n  // initialize some value, so ts is happy\n  private solverType: 1 | 2 = 1;\n\n  private readyPromise: Promise<void> = new Promise(() => {});\n  private readyCount = 0;\n  private startCount = 0;\n\n  public progressCallback: (p: ProgressMessage) => any = () => 0;\n  public readyCallback: () => any = () => 0;\n  public startedCallback: () => any = () => 0;\n  public doneCallback: (d: DoneMessage) => any = () => 0;\n  public errorCallback: (e: any) => any = () => 0;\n\n  public init() {\n    this.terminateWorkers();\n\n    this.progress = 0;\n    this.totalHashes = 0;\n\n    let setReady: () => void;\n    this.readyPromise = new Promise((resolve) => (setReady = resolve));\n\n    this.readyCount = 0;\n    this.startCount = 0;\n\n    // Setup four workers for now - later we could calculate this depending on the device\n    this.workers = new Array(4);\n    const workerBlob = new Blob([workerString] as any, { type: \"text/javascript\" });\n\n    for (let i = 0; i < this.workers.length; i++) {\n      this.workers[i] = new Worker(URL.createObjectURL(workerBlob));\n      this.workers[i].onerror = (e: ErrorEvent) => this.errorCallback(e);\n\n      this.workers[i].onmessage = (e: any) => {\n        const data: MessageFromWorker = e.data;\n        if (!data) return;\n        if (data.type === \"ready\") {\n          this.readyCount++;\n          this.solverType = data.solver;\n          // We are ready, when all workers are ready\n          if (this.readyCount == this.workers.length) {\n            setReady();\n            this.readyCallback();\n          }\n        } else if (data.type === \"started\") {\n          this.startCount++;\n          // We started, when the first worker starts working\n          if (this.startCount == 1) {\n            this.startTime = Date.now();\n            this.startedCallback();\n          }\n        } else if (data.type === \"done\") {\n          if (data.puzzleNumber !== this.puzzleNumber) return; // solution belongs to a previous puzzle\n\n          if (this.puzzleIndex < this.puzzleSolverInputs.length) {\n            this.workers[i].postMessage({\n              type: \"start\",\n              puzzleSolverInput: this.puzzleSolverInputs[this.puzzleIndex],\n              threshold: this.threshold,\n              puzzleIndex: this.puzzleIndex,\n              puzzleNumber: this.puzzleNumber,\n            } as StartMessage);\n            this.puzzleIndex++;\n          }\n\n          this.progress++;\n          this.totalHashes += data.h;\n\n          this.progressCallback({\n            n: this.numPuzzles,\n            h: this.totalHashes,\n            t: (Date.now() - this.startTime) / 1000,\n            i: this.progress,\n          });\n\n          this.solutionBuffer.set(data.solution, data.puzzleIndex * 8);\n          // We are done, when all puzzles have been solved\n          if (this.progress == this.numPuzzles) {\n            const totalTime = (Date.now() - this.startTime) / 1000;\n            this.doneCallback({\n              solution: this.solutionBuffer,\n              h: this.totalHashes,\n              t: totalTime,\n              diagnostics: createDiagnosticsBuffer(this.solverType, totalTime),\n              solver: this.solverType,\n            });\n          }\n        } else if (data.type === \"error\") {\n          this.errorCallback(data);\n        }\n      };\n    }\n  }\n\n  public setupSolver(forceJS = false) {\n    const msg: SolverMessage = { type: \"solver\", forceJS: forceJS };\n    for (let i = 0; i < this.workers.length; i++) {\n      this.workers[i].postMessage(msg);\n    }\n  }\n\n  async start(puzzle: Puzzle) {\n    await this.readyPromise;\n\n    this.puzzleSolverInputs = getPuzzleSolverInputs(puzzle.buffer, puzzle.n);\n    this.solutionBuffer = new Uint8Array(8 * puzzle.n);\n    this.numPuzzles = puzzle.n;\n    this.threshold = puzzle.threshold;\n    this.puzzleIndex = 0;\n    this.puzzleNumber++;\n\n    for (let i = 0; i < this.workers.length; i++) {\n      if (this.puzzleIndex === this.puzzleSolverInputs.length) break;\n\n      this.workers[i].postMessage({\n        type: \"start\",\n        puzzleSolverInput: this.puzzleSolverInputs[i],\n        threshold: this.threshold,\n        puzzleIndex: this.puzzleIndex,\n        puzzleNumber: this.puzzleNumber,\n      } as StartMessage);\n      this.puzzleIndex++;\n    }\n  }\n\n  public terminateWorkers() {\n    if (this.workers.length == 0) return;\n    for (let i = 0; i < this.workers.length; i++) {\n      this.workers[i].terminate();\n    }\n    this.workers = [];\n  }\n}\n","import { encode } from \"friendly-pow/base64\";\nimport {\n  getRunningHTML,\n  getReadyHTML,\n  getDoneHTML,\n  updateProgressBar,\n  findParentFormElement,\n  executeOnceOnFocusInEvent,\n  getErrorHTML,\n  getFetchingHTML,\n  injectStyle,\n  getExpiredHTML,\n} from \"./dom\";\nimport { isHeadless } from \"./headless\";\nimport { DoneMessage } from \"./types\";\nimport { Puzzle, decodeBase64Puzzle, getPuzzle } from \"./puzzle\";\nimport { Localization, localizations } from \"./localization\";\nimport { WorkerGroup } from \"./workergroup\";\n\nconst PUZZLE_ENDPOINT_URL = \"https://api.friendlycaptcha.com/api/v1/puzzle\";\n\nexport interface WidgetInstanceOptions {\n  /**\n   * Don't set this to true unless you want to see what the experience is like for people using very old browsers.\n   * This does not increase security.\n   */\n  forceJSFallback: boolean;\n  skipStyleInjection: boolean;\n  startMode: \"auto\" | \"focus\" | \"none\";\n  puzzleEndpoint: string;\n  language: keyof typeof localizations | Localization;\n  solutionFieldName: string;\n  styleNonce: string;\n\n  sitekey: string;\n\n  readyCallback: () => any;\n  startedCallback: () => any;\n  doneCallback: (solution: string) => any;\n  errorCallback: (error: any) => any;\n}\n\nexport class WidgetInstance {\n  private puzzle?: Puzzle;\n\n  private workerGroup: WorkerGroup = new WorkerGroup();\n\n  /**\n   * The root element of this widget instance.\n   * Warning: it is undefined after `destroy()` has been called.\n   */\n  private e!: HTMLElement & { friendlyChallengeWidget?: WidgetInstance };\n\n  /**\n   * The captcha has been succesfully solved.\n   */\n  public valid = false;\n  private opts: WidgetInstanceOptions;\n\n  /**\n   * Some errors may cause a need for the (worker) to be reinitialized. If this is\n   * true `init` will be called again when start is called.\n   */\n  private needsReInit = false;\n\n  /**\n   * Start() has been called at least once ever.\n   */\n  private hasBeenStarted = false;\n\n  private hasBeenDestroyed = false;\n\n  private lang!: Localization;\n\n  private expiryTimeout: ReturnType<typeof setTimeout> | undefined;\n\n  constructor(element: HTMLElement, options: Partial<WidgetInstanceOptions> = {}) {\n    this.opts = Object.assign(\n      {\n        forceJSFallback: false,\n        skipStyleInjection: false,\n        startMode: \"focus\",\n        puzzleEndpoint: element.dataset[\"puzzleEndpoint\"] || PUZZLE_ENDPOINT_URL,\n        startedCallback: () => 0,\n        readyCallback: () => 0,\n        doneCallback: () => 0,\n        errorCallback: () => 0,\n        sitekey: element.dataset[\"sitekey\"] || \"\",\n        language: element.dataset[\"lang\"] || \"en\",\n        solutionFieldName: element.dataset[\"solutionFieldName\"] || \"frc-captcha-solution\",\n        styleNonce: null,\n      },\n      options\n    );\n    this.e = element;\n    this.e.friendlyChallengeWidget = this;\n\n    this.loadLanguage();\n    // @ts-ignore Ignore is required as TS thinks that `this.lang` is not assigned yet, but it happens in `this.loadLanguage()` above.\n    element.innerText = this.lang.text_init;\n    if (!this.opts.skipStyleInjection) {\n      injectStyle(this.opts.styleNonce);\n    }\n    this.init(this.opts.startMode === \"auto\" || this.e.dataset[\"start\"] === \"auto\");\n  }\n\n  public init(forceStart?: boolean) {\n    if (this.hasBeenDestroyed) {\n      console.error(\"FriendlyCaptcha widget has been destroyed using destroy(), it can not be used anymore.\");\n      return;\n    }\n    this.initWorkerGroup();\n\n    if (forceStart) {\n      this.start();\n    } else if (\n      this.e.dataset[\"start\"] !== \"none\" &&\n      (this.opts.startMode === \"focus\" || this.e.dataset[\"start\"] === \"focus\")\n    ) {\n      const form = findParentFormElement(this.e);\n      if (form) {\n        executeOnceOnFocusInEvent(form, () => this.start());\n      } else {\n        console.log(\"FriendlyCaptcha div seems not to be contained in a form, autostart will not work\");\n      }\n    }\n  }\n\n  /**\n   * Loads the configured language, or a language passed to this function.\n   * Note that only the next update will be in the new language, consider calling `reset()` after switching languages.\n   */\n  public loadLanguage(lang?: keyof typeof localizations | Localization) {\n    if (lang !== undefined) {\n      this.opts.language = lang;\n    } else if (this.e.dataset[\"lang\"]) {\n      this.opts.language = this.e.dataset[\"lang\"] as keyof typeof localizations;\n    }\n\n    if (typeof this.opts.language === \"string\") {\n      let langCode = this.opts.language.toLowerCase();\n      let l = (localizations as any)[langCode];\n      if (l === undefined && langCode[2] === \"-\") {\n        // Language has a locale '-' separator, remove it and try again\n        langCode = langCode.substring(0, 2);\n        l = (localizations as any)[langCode];\n      }\n      if (l === undefined) {\n        console.error('FriendlyCaptcha: language \"' + this.opts.language + '\" not found.');\n        // Fall back to English\n        l = localizations.en;\n      }\n      this.lang = l;\n    } else {\n      // We assign to a copy of the English language localization, so that any missing values will be English\n      this.lang = Object.assign(Object.assign({}, localizations.en), this.opts.language);\n    }\n  }\n\n  /**\n   * Add a listener to the button that calls `this.start` on click.\n   */\n  private makeButtonStart() {\n    const b = this.e.querySelector(\"button\");\n    if (b) {\n      b.addEventListener(\"click\", (e) => this.start(), { once: true, passive: true });\n      b.addEventListener(\"touchstart\", (e) => this.start(), { once: true, passive: true });\n    }\n  }\n\n  private onWorkerError(e: any) {\n    this.hasBeenStarted = false;\n    this.needsReInit = true;\n    if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n    console.error(\"[FRC]\", e);\n    this.e.innerHTML = getErrorHTML(this.opts.solutionFieldName, this.lang, \"Background worker error \" + e.message);\n    this.makeButtonStart();\n\n    // Just out of precaution\n    this.opts.forceJSFallback = true;\n  }\n\n  private initWorkerGroup() {\n    this.workerGroup.progressCallback = (progress) => {\n      updateProgressBar(this.e, progress);\n    };\n    this.workerGroup.readyCallback = () => {\n      this.e.innerHTML = getReadyHTML(this.opts.solutionFieldName, this.lang);\n      this.makeButtonStart();\n      this.opts.readyCallback();\n    };\n    this.workerGroup.startedCallback = () => {\n      this.e.innerHTML = getRunningHTML(this.opts.solutionFieldName, this.lang);\n      this.opts.startedCallback();\n    };\n    this.workerGroup.doneCallback = (data) => {\n      const solutionPayload = this.handleDone(data);\n      this.opts.doneCallback(solutionPayload);\n      const callback = this.e.dataset[\"callback\"];\n      if (callback) {\n        (window as any)[callback](solutionPayload);\n      }\n    };\n    this.workerGroup.errorCallback = (e) => {\n      this.onWorkerError(e);\n    };\n\n    this.workerGroup.init();\n    this.workerGroup.setupSolver(this.opts.forceJSFallback);\n  }\n\n  private expire() {\n    this.hasBeenStarted = false;\n    // Node.isConnected will be undefined in older browsers\n    if (this.e.isConnected !== false) {\n      this.e.innerHTML = getExpiredHTML(this.opts.solutionFieldName, this.lang);\n      this.makeButtonStart();\n    }\n  }\n\n  public async start() {\n    if (this.hasBeenDestroyed) {\n      console.error(\"Can not start FriendlyCaptcha widget which has been destroyed\");\n      return;\n    }\n\n    if (this.hasBeenStarted) {\n      console.warn(\"Can not start FriendlyCaptcha widget which has already been started\");\n      return;\n    }\n\n    const sitekey = this.opts.sitekey || this.e.dataset[\"sitekey\"];\n    if (!sitekey) {\n      console.error(\"FriendlyCaptcha: sitekey not set on frc-captcha element\");\n      this.e.innerHTML = getErrorHTML(\n        this.opts.solutionFieldName,\n        this.lang,\n        \"Website problem: sitekey not set\",\n        false\n      );\n      return;\n    }\n\n    if (isHeadless()) {\n      this.e.innerHTML = getErrorHTML(\n        this.opts.solutionFieldName,\n        this.lang,\n        \"Browser check failed, try a different browser\",\n        false,\n        true\n      );\n      return;\n    }\n\n    if (this.needsReInit) {\n      this.needsReInit = false;\n      this.init(true);\n      return;\n    }\n\n    this.hasBeenStarted = true;\n\n    try {\n      this.e.innerHTML = getFetchingHTML(this.opts.solutionFieldName, this.lang);\n      this.puzzle = decodeBase64Puzzle(await getPuzzle(this.opts.puzzleEndpoint, sitekey, this.lang));\n      if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n      this.expiryTimeout = setTimeout(() => this.expire(), this.puzzle.expiry - 30000); // 30s grace\n    } catch (e: any) {\n      console.error(\"[FRC]\", e);\n      this.hasBeenStarted = false;\n      if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n      this.e.innerHTML = getErrorHTML(this.opts.solutionFieldName, this.lang, e.message);\n      this.makeButtonStart();\n      const code = \"error_getting_puzzle\";\n\n      this.opts.errorCallback({ code, description: e.toString(), error: e });\n      const callback = this.e.dataset[\"callback-error\"];\n      if (callback) {\n        (window as any)[callback](this);\n      }\n      return;\n    }\n\n    await this.workerGroup.start(this.puzzle);\n  }\n\n  /**\n   * This is to be called when the puzzle has been succesfully completed.\n   * Here the hidden field gets updated with the solution.\n   * @param data message from the webworker\n   */\n  private handleDone(data: DoneMessage) {\n    this.valid = true;\n    const puzzleSolutionMessage = `${this.puzzle!.signature}.${this.puzzle!.base64}.${encode(data.solution)}.${encode(\n      data.diagnostics\n    )}`;\n    this.e.innerHTML = getDoneHTML(this.opts.solutionFieldName, this.lang, puzzleSolutionMessage, data);\n    // this.worker = null; // This literally crashes very old browsers..\n    this.needsReInit = true;\n\n    return puzzleSolutionMessage;\n  }\n\n  /**\n   * Cleans up the widget entirely, removing any DOM elements and terminating any background workers.\n   * After it is destroyed it can no longer be used for any purpose.\n   */\n  public destroy() {\n    this.workerGroup.terminateWorkers();\n    this.needsReInit = false;\n    this.hasBeenStarted = false;\n    if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n    if (this.e) {\n      this.e.remove();\n      // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n      // @ts-ignore\n      delete this.e;\n    }\n    this.hasBeenDestroyed = true;\n  }\n\n  /**\n   * Resets the widget to the initial state.\n   * This is useful in situations where the page does not refresh when you submit and the form may be re-submitted again\n   */\n  public reset() {\n    if (this.hasBeenDestroyed) {\n      console.error(\"FriendlyCaptcha widget has been destroyed, it can not be used anymore\");\n      return;\n    }\n\n    this.workerGroup.terminateWorkers();\n    this.needsReInit = false;\n    this.hasBeenStarted = false;\n    if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n    this.init(this.opts.startMode === \"auto\" || this.e.dataset[\"start\"] === \"auto\");\n  }\n}\n"]}