{"version":3,"file":"js/27-a5401d04c65b8ffc53dd.js","mappings":"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","sources":["webpack://hnry-rails/./app/javascript/API/config/fetch.api.ts","webpack://hnry-rails/./app/javascript/components/_atoms/icons/icon/DoubleEllipsisIcon.tsx","webpack://hnry-rails/./app/javascript/components/_atoms/icons/icon/Icon.tsx","webpack://hnry-rails/./app/javascript/components/_atoms/icons/icon/InvoicingDollarIcon.tsx","webpack://hnry-rails/./app/javascript/components/_atoms/icons/icon/InvoicingPoundIcon.tsx","webpack://hnry-rails/./app/javascript/components/_atoms/icons/icon/PDFIcon.tsx","webpack://hnry-rails/./app/javascript/components/_atoms/icons/icon/SmsMobileIcon.tsx","webpack://hnry-rails/./app/javascript/components/_atoms/icons/icon/SnowFlakeIcon.tsx","webpack://hnry-rails/./app/javascript/components/toastr/CloseToast.tsx","webpack://hnry-rails/./app/javascript/components/toastr/ToastIcon.tsx","webpack://hnry-rails/./app/javascript/components/toastr/multiple_errors.jsx","webpack://hnry-rails/./app/javascript/components/toastr/toastr.jsx","webpack://hnry-rails/./app/javascript/es_utilities/disableFormSubmitUntilValid.ts","webpack://hnry-rails/./app/javascript/utilities/admin/amplitude_analytics.js","webpack://hnry-rails/./app/javascript/utilities/base_logic/cleanValueToNumbers.ts","webpack://hnry-rails/./app/javascript/utilities/base_logic/convertStringToNumber.ts","webpack://hnry-rails/./app/javascript/utilities/base_logic/globalRegexValues.ts","webpack://hnry-rails/./app/javascript/utilities/base_logic/replaceAt.ts","webpack://hnry-rails/./app/javascript/utilities/base_logic/setCaretPosition.ts","webpack://hnry-rails/./app/javascript/utilities/case-conversions/snakeCase.ts","webpack://hnry-rails/./app/javascript/utilities/cryptography/aes.ts","webpack://hnry-rails/./app/javascript/utilities/cryptography/rsa.ts","webpack://hnry-rails/./app/javascript/utilities/currency/convert_element_input_to_currency.ts","webpack://hnry-rails/./app/javascript/utilities/currency/currency_format.ts","webpack://hnry-rails/./app/javascript/utilities/currency/currency_jurisdiction_values.ts","webpack://hnry-rails/./app/javascript/utilities/debounce.ts","webpack://hnry-rails/./app/javascript/utilities/dismissive.ts","webpack://hnry-rails/./app/javascript/utilities/feature_flags.ts","webpack://hnry-rails/./app/javascript/utilities/income_estimates.js","webpack://hnry-rails/./app/javascript/API/starting_rates_calculator.api.ts","webpack://hnry-rails/./app/javascript/utilities/income_forecast_rates.ts","webpack://hnry-rails/./app/javascript/utilities/isValidEmail.ts","webpack://hnry-rails/./app/javascript/utilities/redirect.ts","webpack://hnry-rails/./app/javascript/utilities/user_attributes.ts"],"sourcesContent":["/**\n * create a helper method that enables sub methods to just call the route they desire and go!\n *\n * This should be only consumed at the \"API\" layer!\n */\n\ntype mimeTypes =\n | \"application/json\"\n | \"multipart/form-data\"\n | \"application/x-www-form-urlencoded\"\n | \"text/plain\";\n\nexport interface ResponseBody {\n status?: string;\n data: Record | string;\n}\n\nexport interface ApiResponseBody extends ResponseBody {\n apiVersion: number;\n context: Record;\n method: HttpMethod;\n}\n\nexport interface ApiErrorResponse {\n error: {\n apiVersion: number;\n method: string;\n error: {\n error: string;\n }[];\n };\n}\n\nconst constructRequest = (\n path: RequestInfo | URL,\n method: HttpMethod,\n body?: BodyInit,\n contentType?: mimeTypes,\n accept?: mimeTypes,\n): { input: RequestInfo | URL; init?: RequestInit } => {\n const csrfToken: HTMLMetaElement | undefined = document.querySelector(\n \"meta[name='csrf-token']\",\n );\n const contentTypeHeader = contentType ? { \"Content-Type\": contentType } : {};\n const acceptHeaders = accept ? { Accept: accept } : {};\n\n return {\n input: path,\n init: {\n method,\n headers: {\n \"X-CSRF-Token\": csrfToken?.content || \"\",\n ...contentTypeHeader,\n ...acceptHeaders,\n },\n body: body || undefined,\n credentials: \"same-origin\",\n },\n };\n};\n\nconst localFetch = async (\n input: RequestInfo | URL,\n method: HttpMethod,\n body?: BodyInit,\n contentType?: mimeTypes,\n accept?: mimeTypes,\n errorOnFailure = true,\n) => {\n try {\n const val = constructRequest(input, method, body, contentType, accept);\n const response = await fetch(val.input, val.init);\n if (!response.ok && errorOnFailure) throw new Error(response.statusText);\n return await response.json();\n } catch (err) {\n throw new Error(err);\n }\n};\n\nexport const post = async (\n input: RequestInfo | URL,\n body: BodyInit,\n contentType?: mimeTypes,\n errorOnFailure?: boolean,\n) => localFetch(input, \"POST\", body, contentType, contentType, errorOnFailure);\n\nexport const postJson = async (\n input: RequestInfo | URL,\n body: BodyInit,\n errorOnFailure?: boolean,\n) =>\n localFetch(\n input,\n \"POST\",\n body,\n \"application/json\",\n \"application/json\",\n errorOnFailure,\n );\n\nexport const putJson = async (\n input: RequestInfo | URL,\n body: BodyInit,\n errorOnFailure?: boolean,\n) =>\n localFetch(\n input,\n \"PUT\",\n body,\n \"application/json\",\n \"application/json\",\n errorOnFailure,\n );\n\nexport const patchJson = async (\n input: RequestInfo | URL,\n body: BodyInit,\n errorOnFailure?: boolean,\n) =>\n localFetch(\n input,\n \"PATCH\",\n body,\n \"application/json\",\n \"application/json\",\n errorOnFailure,\n );\n\nexport const get = async (input: RequestInfo | URL) => localFetch(input, \"GET\");\n\nexport const put = async (input: RequestInfo | URL, body: BodyInit) =>\n localFetch(input, \"PUT\", body);\n\nexport const patch = async (input: RequestInfo | URL, body: BodyInit) =>\n localFetch(input, \"PATCH\", body);\n\n/**\n * can't be called delete as that's a protected word\n * @param input\n * @returns\n */\nexport const deleteReq = async (input: RequestInfo | URL, errorOnFailure?: boolean) =>\n localFetch(\n input,\n \"DELETE\",\n null,\n \"application/json\",\n \"application/json\",\n errorOnFailure\n );\n","import React from \"react\";\n\ninterface iDoubleEllipsisIcon {\n className?: string;\n}\n\nconst DoubleEllipsisIcon = ({ className }: iDoubleEllipsisIcon) => (\n \n \n \n \n \n \n \n \n\n);\n\nexport default DoubleEllipsisIcon;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport {\n AdjustmentsVerticalIcon,\n ArrowLeftIcon,\n ArrowRightOnRectangleIcon,\n ArrowTopRightOnSquareIcon,\n ArrowUpRightIcon,\n ArrowUpTrayIcon,\n ArrowPathIcon,\n BellAlertIcon,\n BoltIcon,\n BuildingLibraryIcon,\n CalendarDaysIcon,\n ChartPieIcon,\n ChatBubbleLeftRightIcon,\n CheckCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CircleStackIcon,\n ClipboardDocumentIcon,\n ClipboardDocumentListIcon,\n CreditCardIcon,\n CurrencyDollarIcon,\n CurrencyPoundIcon,\n DevicePhoneMobileIcon,\n DocumentArrowUpIcon,\n DocumentDuplicateIcon,\n DocumentTextIcon,\n EllipsisHorizontalIcon,\n EllipsisVerticalIcon,\n EnvelopeIcon,\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n EyeIcon,\n EyeSlashIcon,\n FingerPrintIcon,\n ForwardIcon,\n HandThumbUpIcon,\n HomeIcon,\n InformationCircleIcon,\n LightBulbIcon,\n LockClosedIcon,\n MagnifyingGlassIcon,\n PaperClipIcon,\n PauseIcon,\n PencilIcon,\n PencilSquareIcon,\n PlayIcon,\n PlusIcon,\n ReceiptPercentIcon,\n Square2StackIcon,\n SunIcon,\n TrashIcon,\n UserCircleIcon,\n UserIcon,\n XCircleIcon,\n XMarkIcon,\n} from \"@heroicons/react/24/outline\";\n\nimport SmsMobileIcon from \"./SmsMobileIcon\";\nimport SnowFlakeIcon from \"./SnowFlakeIcon\";\nimport DoubleEllipsisIcon from \"./DoubleEllipsisIcon\";\nimport InvoicingDollarIcon from \"./InvoicingDollarIcon\";\nimport InvoicingPoundIcon from \"./InvoicingPoundIcon\";\nimport PDFIcon from \"./PDFIcon\";\n\nexport const sizeClasses = {\n xs: \"tw-w-3.5 tw-h-3.5\",\n sm: \"tw-w-4 tw-h-4\",\n base: \"tw-w-5 tw-h-5\",\n lg: \"tw-w-7 tw-h-7\",\n xl: \"tw-w-12 tw-h-12\",\n} as const;\n\nconst HeroIcons = {\n AdjustmentsVerticalIcon,\n ArrowLeftIcon,\n ArrowRightOnRectangleIcon,\n ArrowTopRightOnSquareIcon,\n ArrowUpRightIcon,\n ArrowUpTrayIcon,\n ArrowPathIcon,\n BellAlertIcon,\n BoltIcon,\n BuildingLibraryIcon,\n CalendarDaysIcon,\n ChartPieIcon,\n ChatBubbleLeftRightIcon,\n CheckCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CircleStackIcon,\n ClipboardDocumentIcon,\n ClipboardDocumentListIcon,\n CreditCardIcon,\n CurrencyDollarIcon,\n CurrencyPoundIcon,\n DevicePhoneMobileIcon,\n DocumentArrowUpIcon,\n DocumentDuplicateIcon,\n DocumentTextIcon,\n DoubleEllipsisIcon,\n EllipsisHorizontalIcon,\n EllipsisVerticalIcon,\n EnvelopeIcon,\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n EyeIcon,\n EyeSlashIcon,\n FingerPrintIcon,\n ForwardIcon,\n HandThumbUpIcon,\n HomeIcon,\n InformationCircleIcon,\n InvoicingDollarIcon,\n InvoicingPoundIcon,\n LightBulbIcon,\n LockClosedIcon,\n MagnifyingGlassIcon,\n PaperClipIcon,\n PauseIcon,\n PDFIcon,\n PencilIcon,\n PencilSquareIcon,\n PlayIcon,\n PlusIcon,\n ReceiptPercentIcon,\n SmsMobileIcon,\n SnowFlakeIcon,\n Square2StackIcon,\n SunIcon,\n TrashIcon,\n UserCircleIcon,\n UserIcon,\n XCircleIcon,\n XMarkIcon,\n} as const;\n\nexport const IconTypes = Object.keys(HeroIcons);\n\nexport type IconType = (typeof IconTypes)[number];\nexport type IconSizes = \"xs\" | \"sm\" | \"base\" | \"lg\" | \"xl\";\n\ninterface iIcon {\n hoverOn?: boolean;\n type?: IconType;\n classes?: string;\n size?: IconSizes;\n strokeWidth?: string\n}\n\nconst Icon = ({\n type = \"PencilSquareIcon\",\n hoverOn = false,\n classes = undefined,\n size = \"base\",\n strokeWidth = \"1.5\"\n}: iIcon) => {\n const className = classNames(\"tw-text-gray-800\", {\n \"hover:tw-text-gray-600\": hoverOn,\n [`${classes}`]: classes,\n [`${sizeClasses[size]}`]: size,\n });\n\n const SingleIcon = HeroIcons[type];\n return ;\n};\n\nexport default Icon;\n","import React from \"react\";\n\ninterface iInvoicingDollarIcon {\n className?: string;\n}\n\nconst InvoicingDollarIcon = ({ className }: iInvoicingDollarIcon) => (\n \n \n \n \n \n \n \n \n \n);\n\nexport default InvoicingDollarIcon;\n","import React from \"react\";\n\ninterface iInvoicingPoundIcon {\n className?: string;\n}\n\nconst InvoicingPoundIcon = ({ className }: iInvoicingPoundIcon) => (\n \n \n \n \n \n \n \n \n \n\n);\n\nexport default InvoicingPoundIcon;\n","import React from \"react\";\n\ninterface iPDFIcon {\n className?: string;\n}\n\nconst PDFIcon = ({ className }: iPDFIcon) => (\n \n \n \n \n \n \n \n \n \n \n \n \n\n);\n\nexport default PDFIcon;\n","import React from \"react\";\n\ninterface iSmsMobileIcon {\n className?: string;\n}\n\nconst SmsMobileIcon = ({ className }: iSmsMobileIcon) => (\n \n \n\n\n);\n\nexport default SmsMobileIcon;\n","import React from \"react\";\n\ninterface iSnowFlakeIcon {\n className?: string;\n}\n\nconst SnowFlakeIcon = ({ className }: iSnowFlakeIcon) => (\n \n \n \n);\n\nexport default SnowFlakeIcon;\n","import React from \"react\";\nimport Icon from \"../_atoms/icons/icon/Icon\";\n\ninterface iCloseToast {\n handler: () => void;\n}\n\nconst CloseToast = ({ handler }: iCloseToast) => (\n \n \n Dismiss\n \n);\n\nexport default CloseToast;\n","import React from \"react\";\nimport Icon from \"../_atoms/icons/icon/Icon\"\n\ninterface iToastIcon {\n type: string;\n}\n\nconst ToastIcon = ({ type }: iToastIcon) => {\n const getIconName = () => {\n switch (type) {\n case \"success\":\n return \"CheckCircleIcon\";\n case \"error\":\n return \"XCircleIcon\";\n case \"warning\":\n return \"ExclamationTriangleIcon\";\n default:\n return \"InformationCircleIcon\";\n }\n };\n\n return (\n \n \n \n );\n};\n\nexport default ToastIcon;\n","import React, { useEffect } from \"react\";\nimport DOMPurify from \"dompurify\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport ToastIcon from \"./ToastIcon\";\nimport CloseToast from \"./CloseToast\";\n\nconst MultipleErrorsMessage = ({\n errors, errorType, toggleToast, setToastWidth, toastRef, isExpanded, setExpanded,\n}) => {\n const [firstError, secondError, thirdError, ...otherErrors] = errors;\n\n useEffect(() => {\n setExpanded(isExpanded);\n });\n\n const handleExpandToggle = () => {\n setExpanded(!isExpanded);\n setToastWidth(toastRef.current.offsetWidth);\n };\n\n const sanitizedData = (data) => ({\n // eslint-disable-next-line xss/no-mixed-html\n __html: data !== undefined ? DOMPurify.sanitize(new DOMParser().parseFromString((data), \"text/html\").documentElement.textContent, { USE_PROFILES: { html: true }}) : \"\"\n });\n\n return (\n <>\n
\n \n
\n \n {(secondError || thirdError) &&
    3 ? \"tw-mb-1\": \"tw-mb-0\"}`}>\n
  • \n
  • \n
}\n \n { isExpanded && (\n \n {otherErrors.map((error, index) =>
  • ) }\n
    \n )}\n
    \n {/* Since we pull out and display the first three errors without needing to expand the list,\n only give an option to expand the list if there are more than three errors in total */}\n {errors.size > 3 && (\n handleExpandToggle()}\n >\n {isExpanded ? `Hide ${otherErrors.length} errors` : `Show ${otherErrors.length} more errors` }\n \n )}\n
    \n
    \n \n \n );\n};\n\nexport default MultipleErrorsMessage;\n","import React, {\n useState, useEffect, useLayoutEffect, useRef,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport DOMPurify from \"dompurify\";\nimport MultipleErrorsMessage from \"./multiple_errors\";\nimport CloseToast from \"./CloseToast\";\nimport ToastIcon from \"./ToastIcon\";\n\nconst Toastr = ({ type, message }) => {\n const [isShowing, setShowing] = useState(true);\n const [messageItems, setMessageItems] = useState(undefined);\n const [toastWidth, setToastWidth] = useState(0);\n const [isExpanded, setExpanded] = useState(false);\n const toastRef = useRef(null);\n\n const sanitizedData = (data) => ({\n // eslint-disable-next-line xss/no-mixed-html\n __html: DOMPurify.sanitize(new DOMParser().parseFromString((data), \"text/html\").documentElement.textContent, { USE_PROFILES: { html: true }})\n });\n\n // Determine on mount whether there's one or multiple messages to display\n useEffect(() => {\n try {\n const messages = new Set(JSON.parse(message));\n // If the messages comes through as an array with only one value,\n // extract that one value so it is treated as one message rather than an array of many\n if (typeof messages === \"object\" && messages.length === 1) {\n setMessageItems(messages[0]);\n } else {\n setMessageItems(messages);\n }\n } catch (error) {\n setMessageItems(\"\");\n }\n }, []);\n\n // Hide component after 6 seconds if its a short message,\n // or 10 seconds if it is an expandable one\n useEffect(() => {\n if (messageItems !== undefined) {\n const delay = typeof messageItems === \"string\" ? 7000 : 13000;\n\n const timerID = setTimeout(() => {\n setShowing(false);\n }, delay);\n\n // Cleanup - remove timers on unmount\n return () => {\n clearTimeout(timerID);\n };\n }\n }, [messageItems]);\n\n // Unmount the component if the component is hidden\n useLayoutEffect(() => {\n if (!isShowing) {\n const timer = setTimeout(() => {\n if (document.querySelector(\".toastr-mount\") !== null) {\n ReactDOM.unmountComponentAtNode(document.querySelector(\".toastr-mount\"));\n }\n }, 800);\n\n return () => clearTimeout(timer);\n }\n }, [isShowing]);\n\n const handleDrag = (dragDetails) => {\n const { y: dragDirection } = dragDetails.delta;\n if (dragDirection > 10) {\n // A swipe down, expand the notifcation if possible\n setExpanded(true);\n } else if (dragDirection < -10) {\n if (isExpanded) {\n // A swipe up, collapse the notification if it's open\n // and close notification\n setExpanded(false);\n }\n setShowing(false);\n }\n };\n\n const dismiss = () => {\n setShowing(false);\n }\n\n return (\n \n {isShowing && (\n handleDrag(info)}\n >\n {messageItems && typeof messageItems !== \"string\" ? (\n \n\n ) : (\n <>\n
    \n \n \n
    \n \n \n )}\n \n )}\n
    \n );\n};\n\nexport default Toastr;\n","const toggleSubmitOnFormValidity = (form) => {\n const formIsValid = form.checkValidity();\n document\n .querySelectorAll(`[id=\"should-disable-${form.id}\"]`)\n .forEach((submit) => {\n if (formIsValid) {\n submit.removeAttribute(\"disabled\");\n } else {\n submit.setAttribute(\"disabled\", \"disabled\");\n }\n });\n};\n\nconst toggleSubmitOnFormValidityListener = (e) =>\n toggleSubmitOnFormValidity(e.currentTarget);\n\nconst addInputListener = (form) => {\n form.removeEventListener(\"change\", toggleSubmitOnFormValidityListener);\n form.addEventListener(\"change\", toggleSubmitOnFormValidityListener);\n toggleSubmitOnFormValidity(form);\n};\n\n/*\n * MutationObserver is used to detect changes in the form\n * This is necessary because the form may be changed by JavaScript\n * e.g. when a React component is mounted inside the form\n */\nconst addMutationObserver = (form) => {\n const formObserver = new MutationObserver((e) => {\n if (!(e[0].target instanceof HTMLElement)) return;\n const observedForm = e[0].target.closest(\"form\");\n toggleSubmitOnFormValidity(observedForm);\n });\n\n formObserver.observe(form, { childList: true, subtree: true });\n\n document.addEventListener(\"turbolinks:before-visit\", () => {\n formObserver.disconnect();\n });\n};\n\nconst disableFormSubmitUntilValid = () => {\n document.querySelectorAll(\".disable-submit-until-valid\").forEach((form) => {\n addMutationObserver(form);\n addInputListener(form);\n });\n};\n\nexport default disableFormSubmitUntilValid;\n","import * as amplitude from \"@amplitude/analytics-browser\";\nimport { getEnvironment, getAmplitudeAdminApiKey, getAdminUserId } from \"../user_attributes\";\n\nconst AMPLITUDE_API_KEY = getAmplitudeAdminApiKey();\n\nconst getAmplitudeInstance = () => {\n\n const options = {\n minIdLength: 1,\n userId: getAdminUserId(),\n defaultTracking: true\n }\n\n amplitude.init(AMPLITUDE_API_KEY, options);\n return amplitude\n};\n\nconst acceptableEnvironments = [\"production\", \"staging\", \"uat\"];\nexport default () => {\n // If segment is present, we don't want to load amplitude\n if (typeof window.analytics === \"object\") {\n return;\n }\n\n if (AMPLITUDE_API_KEY && acceptableEnvironments.includes(getEnvironment())) {\n const amplitude = getAmplitudeInstance();\n // explose amplitude to the window\n window.amplitude = amplitude;\n }\n};\n","/**\n *\n * @param value string\n * @returns string value that only contains numbers\n */\nexport const cleanValueToJustNumbers = (value: string) => ((/[^0-9-.]/g.test(value) || value === \"\") ? value.replace(/[^0-9-.]/g, \"\") : value);\nexport default cleanValueToJustNumbers;\n","/**\n * using parseFloat here so we can\n * @param stringVal\n * @returns\n */\nexport const convertStringToNumber = (stringVal: string): number => parseFloat(stringVal);\n\nexport default convertStringToNumber;\n","export const specialCharRegexGlobal = /[@#$£%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/g;\nexport const numbersOnlyRegex = /^\\d+$/;\n\nexport default { specialCharRegexGlobal, numbersOnlyRegex };\n","const replaceAt = (str, index, chr) => {\n if (index > str.length - 1) return str;\n return str.substring(0, index) + chr + str.substring(index + 1);\n};\n\nexport default replaceAt;\n","const setCaretPosition = (elemId: string, caretPos: number) => {\n // eslint-disable-next-line xss/no-mixed-html\n const elem = document.getElementById(elemId);\n\n if (elem !== null) {\n if (elem.selectionStart) {\n elem.focus();\n elem.setSelectionRange(caretPos, caretPos);\n } else elem.focus();\n }\n};\n\nexport default setCaretPosition;\n","import { snakeCase } from \"lodash\"\n\nconst convertCamelToSnakeCase = data => Object.keys(data).reduce((acc, key) => {\n\n const snakedKey = snakeCase(key)\n \n acc[snakedKey] = data[key]\n\n /**\n * If the accumulator value is an object it should recurse down to ensure that all children are updated as well\n */\n if (acc[snakedKey] && typeof acc[snakedKey] === \"object\" && !Array.isArray(acc[snakedKey])) {\n acc[snakedKey] = convertCamelToSnakeCase(acc[snakedKey])\n }\n return acc\n}, {})\n\nexport default convertCamelToSnakeCase","import forge, { util } from \"node-forge\"\n\n// node-forge uses PKCS7 padding as default for CBC algorithm encryption\n\nexport const decryptPKCS7CBC = ({key, initializationVector, encryptedBytes }: {key: util.ByteBuffer | forge.Bytes, initializationVector: string | util.ByteStringBuffer | number[], encryptedBytes: util.ByteBuffer }): string => {\n \n const decipher = forge.cipher.createDecipher(\"AES-CBC\", key)\n \n decipher.start({iv: initializationVector});\n decipher.update(encryptedBytes);\n decipher.finish();\n\n return decipher.output.data;\n}\nexport const encryptPKCS7CBC = ({key, initializationVector, encryptionText}: {key: util.ByteBuffer | string, initializationVector: string | util.ByteStringBuffer | number[], encryptionText: string}): util.ByteBuffer => {\n const cipher = forge.cipher.createCipher(\"AES-CBC\", key)\n const bytes = forge.util.encodeUtf8(encryptionText);\n\n cipher.start({iv: initializationVector})\n cipher.update(forge.util.createBuffer(bytes));\n cipher.finish();\n\n const resultByteBuffer = cipher.output\n return resultByteBuffer; \n}\n","import forge from \"node-forge\"\n\nexport function encryptRSAOAEP(message: string, publicKey: forge.pki.rsa.PublicKey): string {\n const encrypted = publicKey.encrypt(forge.util.encodeUtf8(message), \"RSA-OAEP\", {\n md: forge.md.sha512.create(),\n mgf1: forge.mgf.mgf1.create(forge.md.sha512),\n });\n\n return forge.util.encode64(encrypted);\n}\n\nexport function decryptRSAOAEP(encryptedMessage: string, privateKey: forge.pki.rsa.PrivateKey): string {\n const decrypted = privateKey.decrypt(encryptedMessage, \"RSA-OAEP\", {\n md: forge.md.sha512.create(),\n mgf1: forge.mgf.mgf1.create(forge.md.sha512),\n });\n\n return decrypted;\n}\n","import hnryJurisdictions from \"../../types/jurisdictions.type\";\nimport cleanValueToJustNumbers from \"../base_logic/cleanValueToNumbers\";\nimport convertStringToNumber from \"../base_logic/convertStringToNumber\";\nimport { specialCharRegexGlobal } from \"../base_logic/globalRegexValues\";\nimport replaceAt from \"../base_logic/replaceAt\";\nimport setCaretPosition from \"../base_logic/setCaretPosition\";\nimport formatToLocalCurrency from \"./currency_format\";\n\nfunction updateHiddenInput(input: HTMLInputElement, amount: string) {\n const inputIdValue = input.dataset.inputId;\n // eslint-disable-next-line xss/no-mixed-html\n const hiddenInput = document.getElementById(inputIdValue);\n input.value = amount;\n\n if (hiddenInput) {\n hiddenInput.value = cleanValueToJustNumbers(amount);\n\n if (hiddenInput.dataset.dispatchInputEvent) {\n // Sometimes we will have downstream listeners watching for changes to the\n // value of this field\n hiddenInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n }\n}\n\nconst convertElementInputToCurrency = (element: HTMLInputElement, type: \"keyup\" | \"blur\", jurisdiction: hnryJurisdictions, hideSymbol = false) => {\n // step 1, get current value and caret position and store as consts\n\n const startingValue = element.value;\n\n if (startingValue) {\n // get current value of special characters for use in placing the caret later\n const startingSpecialCharacterCount = startingValue.match(specialCharRegexGlobal);\n\n // get starting caret position as a reference\n const startingCaretPosition = element.selectionStart;\n\n // step 2 clean string to just be numerical values, removes all special chars outside of the decimals\n\n let cleanedVal = cleanValueToJustNumbers(startingValue);\n\n // step 3, ensure there is only one decimal place\n\n if (cleanedVal.indexOf(\".\") !== cleanedVal.lastIndexOf(\".\")) {\n cleanedVal = replaceAt(cleanedVal, cleanedVal.indexOf(\".\"), \"\");\n }\n\n // convert string to number\n const numberFormat = convertStringToNumber(cleanedVal);\n\n // check to see if its still a number, if its not, get out and return 0\n if (Number.isNaN(numberFormat)) {\n element.value = formatToLocalCurrency(0, jurisdiction, { decimals: true });\n element.value = null;\n return;\n }\n\n // check if decimal place exists or user is bluring away from field for what formatting should be applied\n const isDecimalPlace = cleanedVal.indexOf(\".\") !== -1 || type === \"blur\";\n\n // format number to local currency\n const formattedNumber = formatToLocalCurrency(numberFormat, jurisdiction, { decimals: isDecimalPlace }, hideSymbol);\n\n // get special characters from formatted number to compare to original nubmer of special chars when placing the caret backs\n const allFoundCharacters = formattedNumber.match(specialCharRegexGlobal);\n\n // apply value to element\n element.value = formattedNumber;\n\n // get length of special chars to avoid accidentally blowing things up by ensuring this is a number\n const allFoundNumber = allFoundCharacters?.length ?? 0;\n const initSpecialChars = startingSpecialCharacterCount?.length ?? 0;\n updateHiddenInput(element, formattedNumber);\n\n // if user is typing, place the caret back in a good place\n if (type === \"keyup\") {\n const caretPos2Add = allFoundNumber - initSpecialChars;\n // doing this to push the char forward on initial character typing so that we can account for the pound being added\n\n // replace carrot if required\n setCaretPosition(element.id, startingCaretPosition + caretPos2Add);\n }\n } else {\n updateHiddenInput(element, \"0\");\n // if field is deleted by user, place it back to 0\n element.value = null;\n }\n};\n\nexport default convertElementInputToCurrency;\n","import hnryJurisdictions from \"../../types/jurisdictions.type\";\nimport { acceptedCurrencyLocaleTypes, acceptedCurrencyValues, currencyDisplayType } from \"../../types/currency.type\";\nimport jurisdictionValues from \"./currency_jurisdiction_values\";\n\n/**\n *\n */\nexport const formatToLocalCurrency = (\n value: number,\n jurisdiction: hnryJurisdictions,\n options?: {\n currency?: acceptedCurrencyValues,\n locale?: acceptedCurrencyLocaleTypes,\n currencyDisplay?: currencyDisplayType,\n decimals?: boolean\n },\n hideSymbol = false\n) => {\n if (typeof value === \"string\") {\n throw new Error(\"value cannot be a string, bring me a number OR ELSE...\");\n }\n const localizedCurrencyToUse = jurisdictionValues[jurisdiction];\n const currencyValue = options?.currency || localizedCurrencyToUse.currencyValue;\n const localeToUse = options?.locale || localizedCurrencyToUse.locale;\n\n\n if (hideSymbol) {\n const formatter = {\n minimumFractionDigits: 2,\n };\n return new Intl.NumberFormat(localeToUse, formatter).format(value);\n }\n\n if (options?.decimals) {\n const formatter = {\n style: \"currency\",\n currency: currencyValue,\n currencyDisplay: options?.currencyDisplay,\n minimumFractionDigits: 2,\n };\n return new Intl.NumberFormat(localeToUse, formatter).format(value);\n }\n const fraction = {\n style: \"currency\",\n currency: currencyValue,\n currencyDisplay: options?.currencyDisplay,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n };\n return new Intl.NumberFormat(localeToUse, fraction).format(value);\n};\n\nexport default formatToLocalCurrency;\n","import hnryJurisdictions from \"../../types/jurisdictions.type\";\nimport { acceptedCurrencyLocaleTypes, acceptedCurrencyValues } from \"../../types/currency.type\";\n\ninterface jurisdictionCurrencyOptions {\n locale: acceptedCurrencyLocaleTypes,\n currencyValue: acceptedCurrencyValues\n}\n\nexport const jurisdictionValues:Record = {\n au: { locale: \"en-AU\", currencyValue: \"AUD\" },\n nz: { locale: \"en-NZ\", currencyValue: \"NZD\" },\n uk: { locale: \"en-GB\", currencyValue: \"GBP\" },\n};\n\nexport default jurisdictionValues;\n","export interface DebounceFunction {\n func: (...args: any[]) => void; // eslint-disable-line @typescript-eslint/no-explicit-any\n timeout?: number;\n}\n\nexport default (func, timeout = 100) => {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func.apply(this, args);\n }, timeout);\n };\n};\n","/*\n * Expects a DOM element with a data-dismiss attribute\n * When clicked, the first parent with a data-dismissable attribute will be hidden\n * and a request is sent to add a dismiss UserEvent to the database\n * Eg.\n *
    \n * \n *
    \n * The dismissable data attribute string needs to be allowed in UserEvent::VALID_EVENTS\n * Suggested format is \"_dismissed\", eg\n * \"au_cards_banner_082023_dismissed\"\n */\n\nconst animationInitialState = [\"tw-opacity-100\", \"tw-scale-100\"];\nconst animationAfterState = [\"tw-opacity-0\", \"tw-scale-95\"];\n\nconst sendDismissEvent = async (eventName: string) => {\n const csrfToken: HTMLMetaElement | undefined = document.querySelector(\n \"meta[name='csrf-token']\",\n );\n\n if (!csrfToken) {\n if (typeof Rollbar !== \"undefined\") { Rollbar.warning(\"Unable to send DismissEvent, no CSRF token found\"); }\n return;\n }\n\n const response = await fetch(\n Routes.user_event_index_path({ event_name: eventName }),\n {\n method: \"POST\",\n headers: {\n \"X-CSRF-Token\": csrfToken?.content,\n \"Content-Type\": \"application/json\",\n },\n credentials: \"same-origin\",\n },\n );\n\n if (!response.ok) {\n throw new Error(\n \"Unable to create DismissEvent, server responded with an error.\",\n );\n }\n};\n\nexport default () => {\n document.addEventListener(\"click\", async (event) => {\n const { target } = event;\n if (!(target instanceof HTMLElement || target instanceof SVGElement)) {\n return;\n }\n\n const dismissTrigger = target.closest(\"[data-dismiss]\");\n if (!dismissTrigger || !(dismissTrigger instanceof HTMLElement)) {\n return;\n }\n\n const dismissable = target.closest(\"[data-dismissable]\");\n\n // We'll assume this is correctly set up, so we don't need to check for it\n if (dismissable) {\n dismissable.classList.add(\n \"tw-transition-all\",\n ...animationInitialState,\n ...animationAfterState,\n );\n dismissable.classList.remove(...animationInitialState);\n\n dismissable.addEventListener(\"transitionend\", () => {\n dismissable.classList.add(\"-tw-translate-y-full\");\n setTimeout(() => {\n dismissable.remove();\n }, 300);\n });\n\n try {\n await sendDismissEvent(dismissTrigger.dataset.dismiss);\n } catch (error) {\n if (typeof Rollbar !== \"undefined\") {\n Rollbar.error(error);\n }\n }\n }\n });\n};\n","import { getUserFeatures } from \"./user_attributes\";\n\n/**\n * Retrieves the feature flags for the current user.\n * @returns {Object} The feature flags array string[].\n */\nexport const getFeatureFlags = () => getUserFeatures();\n/**\n * Check if a feature flag is set for a given user.\n * @param {string} flag The single feature flag to check.\n * @return {boolen} Whether or not the provided flag is set for the user.\n */\nexport const hasFeatureFlag = (flag?: string): boolean => {\n if (!flag) return false;\n const featureFlags = getUserFeatures();\n return featureFlags.includes(flag);\n};\n\nexport default getFeatureFlags;\n","import formatToLocalCurrency from \"./currency/currency_format\";\n\ndocument.addEventListener((\"keyup\"), function (e) {\n const idsArray = [\"self-employed-income-amount\", \"salary-income-amount\", \"other-income-amount\"];\n if (idsArray.includes(e.target.id)) {\n updateTotalEstimatedIncome();\n }\n});\n\nfunction updateTotalEstimatedIncome() {\n const totalEstimatedIncomeElement = document.getElementById(\"total-estimated-income\");\n const incomeEstimate = getIncomeEstimate();\n if (totalEstimatedIncomeElement && incomeEstimate) {\n const incomeEstimateLocale = totalEstimatedIncomeElement?.dataset?.jsUserLocale;\n // format number to local currency\n const formattedNumber = formatToLocalCurrency(incomeEstimate.totalIncome, incomeEstimateLocale, { decimals: true });\n totalEstimatedIncomeElement.innerText = formattedNumber;\n }\n}\n\nfunction getIncomeEstimate() {\n const selfEmployedInput = document.getElementById(\"self-employed-income-amount\");\n const salaryInput = document.getElementById(\"salary-income-amount\");\n const otherInput = document.getElementById(\"other-income-amount\");\n\n const selfEmployedIncome = cleanAndParseDollarAmount((selfEmployedInput) ? selfEmployedInput.value : 0);\n const salaryIncome = cleanAndParseDollarAmount((salaryInput) ? salaryInput.value : 0);\n const otherIncome = cleanAndParseDollarAmount((otherInput) ? otherInput.value : 0);\n const totalIncome = selfEmployedIncome + salaryIncome + otherIncome;\n\n return {\n selfEmployedIncome,\n salaryIncome,\n otherIncome,\n totalIncome,\n };\n}\n\nexport { getIncomeEstimate };\n","import { get, ResponseBody } from \"./config/fetch.api\";\n\nexport interface iApiResponseBodyPercentage extends ResponseBody {\n data: { percentage: string};\n}\n\nexport const getStartingEffectiveTaxRate = async (\n selfEmployedIncome: number,\n salaryIncome: number,\n otherIncome: number): Promise =>\n get(Routes.get_starting_effective_tax_rate_starting_rates_calculator_index_path({ \n self_employed_income: selfEmployedIncome,\n salary_income: salaryIncome,\n other_income: otherIncome }));\n\n export const getStartingStudentLoanRate = async (\n totalIncome: number): Promise =>\n get(Routes.get_starting_student_loan_rate_starting_rates_calculator_index_path({ \n total_income: totalIncome }));","/* eslint-disable xss/no-mixed-html */\nimport { getIncomeEstimate } from \"./income_estimates\";\nimport formatToLocalCurrency from \"./currency/currency_format\";\nimport { getUserJurisdictionCode } from \"./user_attributes\";\nimport { getStartingEffectiveTaxRate, getStartingStudentLoanRate } from \"../API/starting_rates_calculator.api\";\n\ninterface IncomeEstimate {\n selfEmployedIncome: number;\n salaryIncome: number;\n otherIncome: number;\n totalIncome: number;\n}\n\nconst updateStartingTaxRate = async ({ selfEmployedIncome, salaryIncome, otherIncome }: IncomeEstimate) => {\n const startingIncomeTaxRateField = document.getElementById(\"starting-income-tax-rate\") as HTMLInputElement;\n \n if (startingIncomeTaxRateField) {\n const {status, data: {percentage}} = await getStartingEffectiveTaxRate(\n selfEmployedIncome,\n salaryIncome,\n otherIncome,\n );\n\n if (status === \"bad_request\") {\n return toastr.error(\"Sorry, we're unable to estimate your starting tax rate right now\");\n }\n\n startingIncomeTaxRateField.innerText = percentage;\n }\n}\n\nconst updateStartingStudentLoanRate = async (totalIncome: number) => {\n const startingStudentLoanRateField = document.getElementById(\"starting-student-loan-rate\") as HTMLInputElement;\n\n if (startingStudentLoanRateField) {\n\n const {status, data: {percentage}} = await getStartingStudentLoanRate(\n totalIncome\n );\n\n if (status === \"bad_request\") {\n return toastr.error(\"Sorry, we're unable to estimate your starting student loan rate right now\");\n }\n\n startingStudentLoanRateField.innerText = percentage;\n }\n}\n\nconst updateTotalEstimatedIncome = (totalIncome: number) => {\n const totalEstimatedIncome = document.getElementById(\"confirm-page-total-income\") as HTMLInputElement;\n\n if (totalEstimatedIncome) {\n const formattedIncome = formatToLocalCurrency(\n totalIncome,\n getUserJurisdictionCode(),\n {\n decimals: true,\n },\n );\n totalEstimatedIncome.innerText = formattedIncome;\n };\n}\n\nconst updateIncomeForecastRates = () => {\n const incomeEstimate: IncomeEstimate = getIncomeEstimate();\n\n if (incomeEstimate) {\n updateStartingTaxRate(incomeEstimate);\n updateStartingStudentLoanRate(incomeEstimate.totalIncome);\n updateTotalEstimatedIncome(incomeEstimate.totalIncome);\n }\n}\n\nexport default updateIncomeForecastRates;","/**\n * Function to validate email(s) passed as a string\n * @return {boolean}\n */\n\nconst isValidEmail = (inputValue: string) => {\n const EMAIL_REGEX = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n const emails: string[] = inputValue.split(/;|,/);\n\n const emailsAreValid: boolean = emails\n .map((email) => EMAIL_REGEX.test(email.trim()))\n .every((email) => email);\n\n return emailsAreValid;\n};\n\nexport default isValidEmail;\n","\nconst redirectToExternalURL = async (url: string) => {\n const w = window as Window\n w.location = url; \n}\n\nexport default redirectToExternalURL","import hnryJurisdictions from \"../types/jurisdictions.type\";\nimport { acceptedCurrencyValues } from \"../types/currency.type\";\nimport { Config } from \"../types/config.type\";\n\nexport const getUser = () => window.Hnry?.User;\nexport const getUserId = (): number | null => getUser()?.id;\nexport const getUserJurisdictionCode = (): hnryJurisdictions | null =>\n getUser()?.jurisdiction?.code;\nexport const getUserJurisdictionCurrencyCode =\n (): acceptedCurrencyValues | null => getUser()?.jurisdiction?.currencyCode;\nexport const getUserJurisdictionLocale = (): string | null =>\n getUser()?.jurisdiction?.locale;\nexport const getUserJurisdictionIconUrl = (): string | null =>\n getUser()?.jurisdiction?.iconUrl;\nexport const getUserJurisdictionSupportEmail = (): string | null =>\n getUser()?.jurisdiction?.supportEmail;\nexport const getUserFirstName = (): string | null => getUser()?.name.first;\nexport const getUserLastName = (): string | null => getUser()?.name.last;\nexport const getUserInitials = (): string | null => getUser()?.name.initials;\nexport const getUserPreferredName = (): string | null =>\n getUser()?.name.preferred;\nexport const getUserFullName = (): string | null => getUser()?.name.full;\nexport const getUserStatusColour = (): string | null =>\n getUser()?.status.colour;\nexport const getUserStatusName = (): string | null => getUser()?.status.name;\nexport const getUserEmail = (): string | null => getUser()?.email;\nexport const getUserTin = (): string | null => getUser()?.tin;\nexport const getUserFeatures = (): string[] => getUser()?.features || [];\n\nexport const getAdminUser = () => window.Hnry?.AdminUser;\nexport const getAdminUserId = (): number | null => getAdminUser()?.id;\n\nconst getConfig = (): Config => window.Hnry?.Config;\nexport const getEnvironment = (): Config[\"environment\"] | null =>\n getConfig()?.environment;\nexport const getVersion = (): Config[\"version\"] | null => getConfig()?.version;\nexport const getAmplitudeApiKey = (): Config[\"amplitudeApiKey\"] | null =>\n getConfig()?.amplitudeApiKey;\nexport const getAmplitudeAdminApiKey = ():\n | Config[\"amplitudeAdminApiKey\"]\n | null => getConfig()?.amplitudeAdminApiKey;\nexport const getDatadogClientToken = (): Config[\"datadogClientToken\"] | null =>\n getConfig()?.datadogClientToken;\nexport const getDatadogApplicationId = ():\n | Config[\"datadogApplicationId\"]\n | null => getConfig()?.datadogApplicationId;\n\nconst UserAttributes = getUser();\n\nexport default UserAttributes;\n"],"names":["localFetch","async","input","method","body","contentType","accept","errorOnFailure","arguments","length","undefined","val","constructRequest","path","csrfToken","document","querySelector","contentTypeHeader","acceptHeaders","Accept","init","headers","content","credentials","response","fetch","ok","Error","statusText","json","err","post","postJson","putJson","patchJson","get","deleteReq","_ref","className","React","width","height","viewBox","fill","xmlns","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","sizeClasses","xs","sm","base","lg","xl","HeroIcons","AdjustmentsVerticalIcon","ArrowLeftIcon","ArrowRightOnRectangleIcon","ArrowTopRightOnSquareIcon","ArrowUpRightIcon","ArrowUpTrayIcon","ArrowPathIcon","BellAlertIcon","BoltIcon","BuildingLibraryIcon","CalendarDaysIcon","ChartPieIcon","ChatBubbleLeftRightIcon","CheckCircleIcon","CheckIcon","ChevronDownIcon","ChevronLeftIcon","ChevronRightIcon","CircleStackIcon","ClipboardDocumentIcon","ClipboardDocumentListIcon","CreditCardIcon","CurrencyDollarIcon","CurrencyPoundIcon","DevicePhoneMobileIcon","DocumentArrowUpIcon","DocumentDuplicateIcon","DocumentTextIcon","DoubleEllipsisIcon","EllipsisHorizontalIcon","EllipsisVerticalIcon","EnvelopeIcon","ExclamationCircleIcon","ExclamationTriangleIcon","EyeIcon","EyeSlashIcon","FingerPrintIcon","ForwardIcon","HandThumbUpIcon","HomeIcon","InformationCircleIcon","InvoicingDollarIcon","InvoicingPoundIcon","LightBulbIcon","LockClosedIcon","MagnifyingGlassIcon","PaperClipIcon","PauseIcon","PDFIcon","PencilIcon","PencilSquareIcon","PlayIcon","PlusIcon","ReceiptPercentIcon","SmsMobileIcon","SnowFlakeIcon","Square2StackIcon","SunIcon","TrashIcon","UserCircleIcon","UserIcon","XCircleIcon","XMarkIcon","IconTypes","Object","keys","type","hoverOn","classes","size","classNames","SingleIcon","clipPath","id","fillRule","clipRule","handler","onClick","Icon","getIconName","errors","errorType","toggleToast","setToastWidth","toastRef","isExpanded","setExpanded","firstError","secondError","thirdError","otherErrors","useEffect","sanitizedData","data","__html","DOMPurify","sanitize","DOMParser","parseFromString","documentElement","textContent","USE_PROFILES","html","ToastIcon","dangerouslySetInnerHTML","AnimatePresence","initial","motion","ul","key","animate","exit","variants","open","opacity","collapsed","map","error","index","current","offsetWidth","CloseToast","message","isShowing","setShowing","useState","messageItems","setMessageItems","toastWidth","useRef","messages","Set","JSON","parse","timerID","setTimeout","clearTimeout","useLayoutEffect","timer","ReactDOM","dismiss","div","ref","style","y","hide","drag","dragConstraints","bottom","top","dragElastic","onDrag","event","info","dragDetails","dragDirection","delta","handleDrag","MultipleErrorsMessage","toggleSubmitOnFormValidity","form","formIsValid","checkValidity","querySelectorAll","forEach","submit","removeAttribute","setAttribute","toggleSubmitOnFormValidityListener","e","currentTarget","disableFormSubmitUntilValid","formObserver","MutationObserver","target","HTMLElement","observedForm","closest","observe","childList","subtree","addEventListener","disconnect","addMutationObserver","removeEventListener","addInputListener","AMPLITUDE_API_KEY","getAmplitudeAdminApiKey","acceptableEnvironments","window","analytics","includes","getEnvironment","amplitude","getAmplitudeInstance","options","minIdLength","userId","getAdminUserId","defaultTracking","cleanValueToJustNumbers","value","test","replace","convertStringToNumber","stringVal","parseFloat","specialCharRegexGlobal","numbersOnlyRegex","replaceAt","str","chr","substring","setCaretPosition","elemId","caretPos","elem","getElementById","selectionStart","focus","setSelectionRange","convertCamelToSnakeCase","reduce","acc","snakedKey","snakeCase","Array","isArray","decryptPKCS7CBC","initializationVector","encryptedBytes","decipher","forge","createDecipher","start","iv","update","finish","output","encryptPKCS7CBC","_ref2","encryptionText","cipher","createCipher","bytes","encodeUtf8","createBuffer","encryptRSAOAEP","publicKey","encrypted","encrypt","md","sha512","create","mgf1","encode64","decryptRSAOAEP","encryptedMessage","privateKey","decrypt","updateHiddenInput","amount","inputIdValue","dataset","inputId","hiddenInput","dispatchInputEvent","dispatchEvent","Event","bubbles","element","jurisdiction","hideSymbol","startingValue","startingSpecialCharacterCount","match","startingCaretPosition","cleanedVal","indexOf","lastIndexOf","numberFormat","Number","isNaN","formatToLocalCurrency","decimals","isDecimalPlace","formattedNumber","allFoundCharacters","allFoundNumber","initSpecialChars","caretPos2Add","localizedCurrencyToUse","jurisdictionValues","currencyValue","currency","localeToUse","locale","formatter","minimumFractionDigits","Intl","NumberFormat","format","currencyDisplay","fraction","maximumFractionDigits","au","nz","uk","func","timeout","_len","args","_key","apply","animationInitialState","animationAfterState","SVGElement","dismissTrigger","dismissable","classList","add","remove","Rollbar","warning","Routes","user_event_index_path","event_name","eventName","sendDismissEvent","getFeatureFlags","getUserFeatures","hasFeatureFlag","flag","getIncomeEstimate","selfEmployedInput","salaryInput","otherInput","selfEmployedIncome","cleanAndParseDollarAmount","salaryIncome","otherIncome","totalIncome","totalEstimatedIncomeElement","incomeEstimate","incomeEstimateLocale","jsUserLocale","innerText","updateTotalEstimatedIncome","updateStartingTaxRate","startingIncomeTaxRateField","status","percentage","get_starting_effective_tax_rate_starting_rates_calculator_index_path","self_employed_income","salary_income","other_income","getStartingEffectiveTaxRate","toastr","updateStartingStudentLoanRate","startingStudentLoanRateField","get_starting_student_loan_rate_starting_rates_calculator_index_path","total_income","getStartingStudentLoanRate","updateIncomeForecastRates","totalEstimatedIncome","formattedIncome","getUserJurisdictionCode","inputValue","EMAIL_REGEX","split","email","trim","every","location","url","getUser","Hnry","User","getUserId","code","getUserJurisdictionCurrencyCode","currencyCode","getUserJurisdictionLocale","getUserJurisdictionIconUrl","iconUrl","getUserJurisdictionSupportEmail","supportEmail","getUserFirstName","name","first","getUserLastName","last","getUserInitials","initials","getUserPreferredName","preferred","getUserFullName","full","getUserStatusColour","colour","getUserStatusName","getUserEmail","getUserTin","tin","features","getAdminUser","AdminUser","getConfig","Config","environment","getVersion","version","getAmplitudeApiKey","amplitudeApiKey","amplitudeAdminApiKey","getDatadogClientToken","datadogClientToken","getDatadogApplicationId","datadogApplicationId","UserAttributes"],"sourceRoot":""}