{"version":3,"file":"js/chunks/2.bundle.js","mappings":"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","sources":["webpack://pcloud-site/./src/lib/utils.js","webpack://pcloud-site/./node_modules/clsx/dist/clsx.m.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/define-properties.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/define-property.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-descriptor.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-descriptors.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/parse-float.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/parse-int.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/symbol.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/symbol/iterator.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/symbol/to-primitive.js"],"sourcesContent":["//@flow\n\nimport {\n DiscountType,\n Userinfo,\n PlanIDType,\n Subscription\n} from \"../lib/types/dataTypes.components\";\n\n// import {\n// ADD_STORAGE_1COUNT_PLAN_ID, \n// ADD_STORAGE_4COUNT_PLAN_ID,\n// MB_PER_STORAGE_COUNT\n// } from \"./plansInfo\";\n\nimport {\n rcookie,\n setcookie,\n hrefSearch\n} from \"@pcloud/web-utilities/dist/lib/utils\";\nimport { __ } from \"@pcloud/web-utilities/dist/lib/langManager\";\nimport { renderQuota } from \"@pcloud/web-utilities/dist/plans/utils.plans\";\n\nimport {\n PREMIUM_PLAN_ID,\n PREMIUM_PLUS_PLAN_ID,\n CUSTOM4TB_PLAN_ID,\n FAMILY2TB_PLAN_ID,\n FAMILY_CUSTOM_PLAN_ID,\n FAMILY_CUSTOM_2COUNT_PLAN_ID,\n FAMILY_CUSTOM_5COUNT_PLAN_ID,\n FAMILY_ADD_1COUNT_PLAN_ID,\n FAMILY_ADD_2COUNT_PLAN_ID,\n FAMILY_ADD_5COUNT_PLAN_ID,\n CUSTOM_PLAN_ID,\n ADD_STORAGE_1COUNT_PLAN_ID,\n ADD_STORAGE_4COUNT_PLAN_ID,\n ADD_STORAGE_8COUNT_PLAN_ID,\n ADD_STORAGE_12COUNT_PLAN_ID,\n ADD_STORAGE_20COUNT_PLAN_ID,\n CUSTOM_20COUNT_PLAN_ID,\n CRYPTO_PLAN_ID,\n EFH_PLAN_ID,\n ADDITIONAL_TRAFFIC_ID,\n MAX_CUSTOM_STORAGE_COUNT,\n MAX_FAMILY_STORAGE_COUNT,\n PASS_PREMIUM_PLAN_ID,\n PASS_FAMILY_PLAN_ID,\n} from \"@pcloud/web-utilities/dist/plans/constants.plans\";\n\nexport {\n rcookie,\n setcookie,\n hrefSearch,\n __,\n renderQuota\n};\n\nexport const removeHrefSearch = (params: Array, forceRefresh?: boolean) => {\n if (params && typeof params == 'string') {\n params = [params];\n }\n\n if (params && params.length && location.search.length) {\n var currentQueriesArr = location.search.substring(1).split('&');\n var currentQueriesMap = {};\n var finalQueriesArr = [];\n var finalURL;\n\n // Create object map with all current search queries\n for (var i in currentQueriesArr) {\n currentQueriesMap[currentQueriesArr[i].split('=').shift()] = currentQueriesArr[i].split('=').pop();\n }\n\n // Delete requested queries\n for (var i in params) {\n if (params[i].split('=').shift() in currentQueriesMap) {\n delete currentQueriesMap[params[i].split('=').shift()];\n }\n }\n\n if (Object.keys(currentQueriesMap).length) {\n for (var i in currentQueriesMap) {\n finalQueriesArr.push(i + '=' + currentQueriesMap[i]);\n }\n\n finalURL = location.origin + location.pathname + '?' + finalQueriesArr.join('&');\n } else {\n finalURL = location.origin + location.pathname;\n }\n\n if (forceRefresh) {\n location = finalURL;\n } else {\n window.history.pushState({}, null, finalURL);\n }\n }\n};\n\nexport const addHrefSearch = (params: Array | string, forceRefresh: boolean, newLocationUrl?: string) => {\n if (!params) {\n return;\n }\n\n let finalURL;\n\n if (typeof params == 'string') {\n params = [params];\n }\n\n if (location.search.length) {\n let oldQueriesArr = location.search.substring(1).split('&');\n let oldQueriesMap = {};\n let givenQueriesMap = {};\n let finalQueriesMap = {};\n let finalQueriesArr = [];\n\n // Create object map with all current search queries\n for (let i in oldQueriesArr) {\n oldQueriesMap[oldQueriesArr[i].split('=').shift()] = oldQueriesArr[i].split('=').pop();\n }\n\n for (let i in params) {\n givenQueriesMap[params[i].split('=').shift()] = params[i].split('=').pop();\n\n // Delete queries which will be duplicated in the end and remove them\n if (params[i].split('=').shift() in oldQueriesMap) {\n delete oldQueriesMap[params[i].split('=').shift()];\n }\n }\n\n finalQueriesMap = Object.assign(oldQueriesMap, givenQueriesMap);\n\n for (let i in finalQueriesMap) {\n finalQueriesArr.push(i + '=' + finalQueriesMap[i]);\n }\n\n finalURL = (newLocationUrl ? newLocationUrl : (location.origin + location.pathname)) + '?' + finalQueriesArr.join('&');\n\n } else {\n // Directly append newly provided params\n finalURL = (newLocationUrl ? newLocationUrl : location.href) + '?' + params.join('&');\n }\n\n if (forceRefresh) {\n location = finalURL;\n } else {\n if (!window.history.state || window.history.state.page != finalURL) {\n window.history.pushState({ \"page\": finalURL }, null, finalURL);\n }\n }\n};\n\nexport const saveToSessionstorage = (label: string, value: any) => {\n if (\n typeof Storage === \"undefined\" ||\n typeof sessionStorage === \"undefined\" ||\n sessionStorage === null\n ) {\n setcookie(label, value, 0);\n } else {\n sessionStorage.setItem(label, value);\n }\n};\n\nexport const signToCurrency = {\n \"$\": \"USD\",\n \"€\": \"EUR\",\n \"₤\": \"GBP\",\n \"BGN\": \"BGN\"\n};\n\nexport const currencyMap = {\n 'USD': '$',\n 'EUR': '€',\n 'GBP': '₤',\n // Used for Vivacom plans only\n 'BGN': 'BGN'\n};\n\nconst _repl = (str: string, repl: {} = {}) => {\n str = _properSpaces(str);\n\n if (!obLength(repl)) {\n return str;\n }\n\n for (var n in repl) {\n str = str.replace(new RegExp(\"%\" + n + \"%\", \"g\"), repl[n]);\n }\n\n return str;\n};\n\nconst _properSpaces = str => {\n return str.split(String.fromCharCode(160)).join(\" \");\n};\n\nexport const obLength = (obj: {}) => {\n var size = 0,\n key;\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n size++;\n }\n }\n return size;\n};\n\ntype getDisabledPlanReasonParams = {\n user: Userinfo,\n forPlan: PlanIDType,\n forPeriod: \"trial\" | \"month\" | \"year\" | \"lifetime\",\n downgradeAllowed?: boolean,\n add500GBAllowed?: boolean,\n trafficCount?: number,\n maxCustomStorageCount?: number\n};\n\nexport const getDisabledPlanReason = ({\n user = {},\n forPlan,\n forPeriod,\n downgradeAllowed,\n add500GBAllowed,\n trafficCount,\n canAddStorage,\n maxCustomStorageCount = MAX_CUSTOM_STORAGE_COUNT,\n maxFamilyStorageCount = MAX_FAMILY_STORAGE_COUNT\n}: getDisabledPlanReasonParams) => {\n if (!user || !forPlan || !forPeriod) {\n return \"\";\n }\n\n const {\n business,\n lastsubscription,\n cryptolifetime,\n plan,\n premium,\n premiumlifetime,\n premiumexpires,\n cryptosubscription,\n efh,\n planparams,\n additionaltraffic,\n additionaltrafficlifetime,\n family,\n passmanagerdata,\n usepassmanagertrial: isfreetrialused\n } = user;\n\n const hasUserInfo = Object.keys(user).length > 0\n let islifetime;\n let isfreetrialactive;\n let passplan;\n let passpremiumexpire;\n let passFamily;\n\n if (passmanagerdata) {\n islifetime = passmanagerdata.islifetime\n isfreetrialactive = passmanagerdata.isfreetrialactive;\n passplan = passmanagerdata.plan;\n passpremiumexpire = passmanagerdata.premiumexpires;\n passFamily = passmanagerdata.family;\n }\n\n if (hasUserInfo) {\n // const {\n // islifetime,\n // istrial: isfreetrialactive,\n // plan: passplan,\n // planexpires: passpremiumexpire\n // } = passmanagerdata\n\n if (business) {\n return (\"business\");\n } else {\n let hasStorageSubscription = premium && !premiumlifetime;\n let hasCryptoSubscription = cryptosubscription;\n let hasSubscriptionPeriod = false;\n let isCanceled = lastsubscription && lastsubscription.status === \"canceled\";\n let incStorage = 0;\n if (!isCanceled && lastsubscription) {\n hasSubscriptionPeriod = lastsubscription.period;\n }\n\n const isCustomPlanId = forPlan === ADD_STORAGE_1COUNT_PLAN_ID || forPlan === ADD_STORAGE_4COUNT_PLAN_ID || forPlan === ADD_STORAGE_8COUNT_PLAN_ID || forPlan === ADD_STORAGE_12COUNT_PLAN_ID || forPlan === ADD_STORAGE_20COUNT_PLAN_ID || forPlan === CUSTOM_20COUNT_PLAN_ID;\n const isFamilyPlanId = forPlan === FAMILY_ADD_1COUNT_PLAN_ID || forPlan === FAMILY_ADD_2COUNT_PLAN_ID || forPlan === FAMILY_ADD_5COUNT_PLAN_ID || forPlan === FAMILY_CUSTOM_2COUNT_PLAN_ID || forPlan === FAMILY_CUSTOM_5COUNT_PLAN_ID;\n\n if (isCustomPlanId || isFamilyPlanId) {\n const parts = forPlan.split(\"_\");\n incStorage = Number(parts[1]);\n forPlan = Number(parts[0]);\n }\n\n if ((!lastsubscription || (hasSubscriptionPeriod && lastsubscription.products.indexOf(forPlan) === -1) && !downgradeAllowed) && forPeriod != \"lifetime\") {\n if (hasStorageSubscription && plan) {\n if (plan == forPlan && hasStorageSubscription == forPeriod) {\n return (\"current_plan\");\n } else if (plan > forPlan) {\n return (\"lower_plan\");\n }\n } else if (efh && forPlan === EFH_PLAN_ID) {\n return (\"current_plan\");\n } else if (additionaltraffic && forPlan == ADDITIONAL_TRAFFIC_ID) {\n if (!additionaltrafficlifetime && planparams.additionaltraffic == trafficCount) {\n return (\"current_plan\");\n } else if (planparams.additionaltraffic > trafficCount) {\n return (\"traffic_downgrade_restriction\");\n }\n }\n } else if (!lastsubscription && forPeriod === \"lifetime\" && hasStorageSubscription && plan && plan > forPlan) {\n return (\"lower_plan\");\n } else if (plan && hasStorageSubscription && hasSubscriptionPeriod && lastsubscription.products.indexOf(plan) === -1 && forPeriod != \"lifetime\" && !downgradeAllowed) {\n if (forPlan == plan) {\n return (\"current_plan\");\n } else if (plan > forPlan) {\n return (\"lower_plan\");\n }\n }\n\n // Buying Crypto\n if (forPlan == CRYPTO_PLAN_ID) {\n if (cryptolifetime) {\n return (\"crypto_lifetime\");\n } else if (hasSubscriptionPeriod && !hasCryptoSubscription) {\n if (hasCryptoSubscription == \"month\" && forPeriod == \"month\") {\n return (\"current_plan\");\n } else if (hasSubscriptionPeriod == \"year\" && forPeriod == \"month\") {\n return (\"lower_period\");\n }\n } else if (\n hasCryptoSubscription &&\n hasSubscriptionPeriod &&\n isCanceled == false\n ) {\n if (hasSubscriptionPeriod == \"month\" && forPeriod == \"month\") {\n return (\"current_plan\");\n } else if (hasSubscriptionPeriod == \"year\") {\n if (forPeriod == \"month\") {\n return (\"lower_period\");\n } else if (forPeriod == \"year\") {\n return (\"current_plan\");\n }\n }\n }\n } else if (forPlan == EFH_PLAN_ID) {\n if (efh) {\n if (hasSubscriptionPeriod == forPeriod) {\n return (\"current_plan\");\n } else if (hasSubscriptionPeriod == \"year\") {\n if (forPeriod == \"month\") {\n return (\"lower_period\");\n }\n }\n }\n // Buying Traffic\n } else if (forPlan == ADDITIONAL_TRAFFIC_ID) {\n if (plan === CUSTOM4TB_PLAN_ID) {\n return (\"custom_subscription\");\n } else if (forPeriod === \"lifetime\" && !premiumlifetime) {\n return \"traffic_lifetime_restriction\";\n } else if (plan == FAMILY2TB_PLAN_ID || plan == FAMILY_CUSTOM_PLAN_ID) {\n return \"custom_subscription\";\n } else if (forPeriod !== \"lifetime\" && additionaltrafficlifetime) {\n return \"traffic_lifetime_restriction_subs\";\n } else if (forPeriod === \"month\" && hasSubscriptionPeriod == \"year\" && (!downgradeAllowed || lastsubscription.billingprovider === 11)) {\n return (\"traffic_downgrade_restriction\");\n } else if (additionaltraffic && !additionaltrafficlifetime && (forPeriod === \"month\" || forPeriod === \"year\") && planparams.additionaltraffic == trafficCount && forPeriod === hasSubscriptionPeriod) {\n return (\"current_plan\");\n } else if (additionaltrafficlifetime && forPeriod === \"lifetime\" && planparams.additionaltraffic == trafficCount) {\n return (\"current_plan\");\n } else if (additionaltraffic && planparams.additionaltraffic > trafficCount && ((forPeriod === hasSubscriptionPeriod && !downgradeAllowed) || (forPeriod === \"lifetime\" && additionaltrafficlifetime))) {\n return (\"traffic_lifetime_restriction_subs\");\n }\n // Buying Pass\n } else if (forPlan == PASS_PREMIUM_PLAN_ID) {\n if ((isfreetrialactive && forPeriod === \"trial\") || (islifetime && forPeriod === \"lifetime\" && passplan === 1)) {\n return (\"current_plan\");\n } else if (passmanagerdata && forPeriod === \"free\") {\n return (\"current_active_plan\");\n } else if (isfreetrialused && forPeriod === 'trial') {\n return \"plan_upgrade_restrictions\";\n } else if ((islifetime && forPeriod != \"lifetime\") || passplan === 2) {\n return (\"custom_subscription\");\n // } else if (!emailverified) {\n // return (\"verify_email\")\n } else if (lastsubscription && !isCanceled) {\n if (lastsubscription.planid) {\n let activePlanId = lastsubscription.planid;\n let activePlanPeriod = lastsubscription.period;\n if (activePlanId === forPlan) {\n if (activePlanPeriod === forPeriod) {\n return \"current_plan\";\n } else if (activePlanPeriod === 'month' && (forPeriod === 'trial' || forPeriod === 'free')) {\n return \"plan_upgrade_restrictions\";\n } else if (activePlanPeriod === 'year' && (forPeriod === 'trial' || forPeriod === 'free' || forPeriod === 'month')) {\n return \"plan_upgrade_restrictions\";\n }\n }\n\n } else if (lastsubscription.products) {\n let products = lastsubscription.products;\n let activePlanPeriod = lastsubscription.period;\n if (products.indexOf(PASS_PREMIUM_PLAN_ID) !== -1) {\n if (activePlanPeriod === forPeriod) {\n return \"current_plan\";\n } else if (activePlanPeriod === 'month' && (forPeriod === 'trial' || forPeriod === 'free')) {\n return \"plan_upgrade_restrictions\";\n } else if (activePlanPeriod === 'year' && (forPeriod === 'trial' || forPeriod === 'free' || forPeriod === 'month')) {\n return \"plan_upgrade_restrictions\";\n }\n }\n }\n } else if ((!lastsubscription || (lastsubscription && isCanceled)) && passplan == 1 && !isfreetrialactive) {\n if (islifetime || (!islifetime && forPeriod != \"lifetime\")) {\n return \"plan_upgrade_restrictions\";\n }\n }\n\n // Active Pass Lifetime plan = disable any other Pass Plans.\n if (!isfreetrialactive && (passplan === 1 || passplan === 2) && islifetime) {\n return \"plan_upgrade_restrictions\";\n }\n } else if (forPlan == PASS_FAMILY_PLAN_ID) {\n if (passplan === 2 && passFamily && !passFamily.owner) {\n return \"custom_subscription\";\n };\n\n if ((isfreetrialactive && forPeriod === \"trial\") || (islifetime && forPeriod === \"lifetime\" && passplan === 2)) {\n return \"current_plan\";\n }\n\n if (lastsubscription && !isCanceled) {\n let activePlanPeriod = lastsubscription.period;\n\n if (activePlanPeriod === 'year' && forPeriod === 'month') {\n return \"plan_upgrade_restrictions\";\n }\n\n if (lastsubscription.planid) {\n let activePlanId = lastsubscription.planid;\n\n if (activePlanId === forPlan && activePlanPeriod === forPeriod) {\n return \"current_plan\";\n }\n } else if (lastsubscription.products) {\n let products = lastsubscription.products;\n\n if (products.indexOf(forPlan) !== -1 && activePlanPeriod === forPeriod) {\n return \"current_plan\";\n }\n }\n }\n\n // Active Pass Lifetime plan = disable any other Pass Plans.\n if (!isfreetrialactive && (passplan === 1 || passplan === 2) && islifetime) {\n return \"plan_upgrade_restrictions\";\n }\n\n // Buying Storage\n } else {\n if (plan == PREMIUM_PLAN_ID || plan == PREMIUM_PLUS_PLAN_ID || plan == CUSTOM4TB_PLAN_ID) {\n if (premiumlifetime) {\n if (plan == CUSTOM4TB_PLAN_ID && typeof planparams != 'undefined' && planparams.storage > 1 && canAddStorage) {\n return (\"custom_plan_upgrade_exceeded\");\n } else if (forPlan == CUSTOM_PLAN_ID && canAddStorage) {\n if ((incStorage == maxCustomStorageCount && (plan == PREMIUM_PLAN_ID || plan == CUSTOM4TB_PLAN_ID)) || (incStorage > maxCustomStorageCount && plan == PREMIUM_PLAN_ID)) {\n return (\"plan_upgrade_restrictions\");\n } else if (incStorage == 1 && !add500GBAllowed) {\n return ((plan == PREMIUM_PLUS_PLAN_ID || plan == CUSTOM4TB_PLAN_ID) ? \"plan_upgrade_restrictions\" : \"custom_plan_upgrade_restrictions\");\n }\n } else if (forPlan <= plan || forPlan == FAMILY2TB_PLAN_ID || forPlan == FAMILY_CUSTOM_PLAN_ID || (forPlan == CUSTOM_PLAN_ID && !canAddStorage)) {\n return (\"storage_lifetime\");\n }\n } else if (hasSubscriptionPeriod && isCanceled == false) {\n if (forPeriod == \"lifetime\") {\n if (forPlan < plan) {\n return (\"lower_plan\");\n }\n } else if (hasSubscriptionPeriod == \"month\") {\n if (forPeriod == \"month\") {\n if (forPlan < plan && !downgradeAllowed) {\n return (\"lower_plan\");\n } else if (forPlan == plan) {\n return (\"current_plan\");\n }\n } else if (\n (forPeriod == \"year\" && forPlan < plan) ||\n (forPlan < plan && premiumexpires)\n ) {\n return (\"lower_plan\");\n }\n } else if (hasSubscriptionPeriod == \"year\") {\n if (forPeriod == \"month\" && !downgradeAllowed) {\n return (\"lower_period\");\n } else {\n if (forPlan < plan && !downgradeAllowed) {\n return (\"lower_plan\");\n } else if (forPlan == plan) {\n if (!downgradeAllowed || hasSubscriptionPeriod == forPeriod) {\n return (\"current_plan\");\n }\n }\n }\n }\n } else if (isCanceled == false) {\n if (forPlan < plan) {\n return (\"lower_plan\");\n } else if (forPlan <= plan && premiumexpires) {\n let now = new Date();\n let expires = new Date(premiumexpires);\n //Get 1 day in milliseconds\n let oneDay = 1000 * 60 * 60 * 24;\n let daysLeft = Number(expires) - Number(now) / oneDay;\n\n let monthlyTabisActive = forPeriod === \"month\";\n let annualTabisActive = forPeriod === \"year\";\n\n if (daysLeft > 10 && (annualTabisActive || monthlyTabisActive)) {\n return (\"lower_period\");\n }\n }\n }\n } else if (plan == CUSTOM_PLAN_ID) {\n if (typeof planparams != 'undefined' && planparams.storage >= maxCustomStorageCount && forPlan == CUSTOM_PLAN_ID && canAddStorage) {\n return (\"custom_plan_upgrade_exceeded\");\n } else if (typeof planparams != 'undefined' && ((planparams.storage + incStorage) > maxCustomStorageCount) && forPlan == CUSTOM_PLAN_ID && canAddStorage) {\n return (\"plan_upgrade_restrictions\");\n } else if (forPlan == CUSTOM_PLAN_ID && incStorage == 1 && !add500GBAllowed) {\n if (typeof planparams != 'undefined' && planparams.storage <= 3) {\n return (\"custom_plan_upgrade_restrictions\");\n } else {\n return (\"plan_upgrade_restrictions\");\n }\n } else if (forPlan < plan || (!canAddStorage && forPlan == CUSTOM_PLAN_ID)) {\n return (\"storage_lifetime\");\n } else if (forPeriod === \"year\" || forPeriod === \"month\") {\n return (\"storage_lifetime\");\n }\n } else if ((plan == FAMILY2TB_PLAN_ID || plan == FAMILY_CUSTOM_PLAN_ID) && forPlan !== FAMILY_CUSTOM_PLAN_ID) {\n return (\"family\");\n } else if (forPlan == FAMILY_CUSTOM_PLAN_ID || forPlan == FAMILY2TB_PLAN_ID) {\n if ((plan == FAMILY_CUSTOM_PLAN_ID || plan == FAMILY2TB_PLAN_ID) && family && !family.owner) {\n return \"family\";\n } else if (plan == FAMILY_CUSTOM_PLAN_ID && typeof planparams != 'undefined') {\n if (planparams.storage >= maxFamilyStorageCount && canAddStorage) {\n return (\"custom_plan_upgrade_exceeded\");\n } else if (((planparams.storage + incStorage) > maxFamilyStorageCount) && canAddStorage) {\n return (\"plan_upgrade_restrictions\");\n }\n }\n } else {\n if (forPlan == CUSTOM_PLAN_ID && incStorage > maxCustomStorageCount) {\n return (\"plan_upgrade_restrictions\");\n }\n }\n }\n }\n }\n};\n\nexport const preventEnteringNumbers = (event) => {\n const key = event.which || event.keyCode || event.charCode;\n const pressedCharacter = String.fromCharCode(key);\n\n if (!(/[a-zA-Z '-]/).test(pressedCharacter)) {\n event.preventDefault();\n }\n}\n\ntype creditCardValidation = {\n name: string,\n range: string,\n valid_length: Array\n}\n\nexport const findCardType = (cardNumber: string): creditCardValidation => {\n const creditCardValidations = [\n {\n name: \"amex\",\n range: \"34, 37\",\n valid_length: [\"15\"]\n },\n {\n name: \"diners\",\n range: \"301, 302, 303, 304, 305, 36\",\n valid_length: [\"16\"]\n },\n {\n name: \"jcb\",\n range: \"352, 353, 354, 355, 356, 357, 358\",\n valid_length: [\"16\"]\n },\n {\n name: \"visa\",\n range: \"4\",\n valid_length: [\"19\", \"18\", \"17\", \"16\", \"15\", \"14\", \"13\"]\n },\n {\n name: \"mastercard\",\n range: \"50, 51, 52, 53, 54, 55, 222\",\n valid_length: [\"16\"]\n },\n {\n name: \"discover\",\n range: \"6011, 622, 644, 645, 646, 647, 648, 649\",\n valid_length: [\"16\"]\n }\n ];\n\n return creditCardValidations.find((cardTemplate: creditCardValidation): (creditCardValidation | false) => {\n let isThereAMatch = cardTemplate.range.split(\", \").some((range: string) => {\n const rangeLength = range.length;\n return range === cardNumber.slice(0, rangeLength);\n });\n return isThereAMatch;\n });\n}\n\nexport const getExpiryDatePeriod = (expiryDate: string, period: string): string => {\n const periods = {\n month: Number(expiryDate.split(\"/\")[0]),\n year: Number(expiryDate.split(\"/\")[1])\n }\n\n if (periods.year > 2000 && periods.year < 2100) {\n periods.year -= 2000;\n }\n\n return periods[period];\n}\n\nexport const validateExpiryDate = (expiryDate: string): boolean => {\n const month = getExpiryDatePeriod(expiryDate, \"month\");\n const year = getExpiryDatePeriod(expiryDate, \"year\");\n const currentYear = new Date().getFullYear() - 2000;\n const currentMonth = new Date().getMonth() + 1;\n\n const validateExpression =\n month <= 12 &&\n ((month > 0 && year > currentYear) || (month >= currentMonth && year == currentYear)) &&\n year <= 40;\n\n return validateExpression;\n};\n\n\nexport const getDeviceID = () => {\n if (!window.localStorage.getItem(\"deviceid\") && !rcookie(\"deviceid\")) {\n return rcookie(\"deviceid\");\n } else if (rcookie(\"deviceid\")) {\n if (window.localStorage.getItem(\"deviceid\")) {\n window.localStorage.removeItem(\"deviceid\");\n }\n return rcookie(\"deviceid\");\n } else if (window.localStorage.getItem(\"deviceid\")) {\n setcookie(\"deviceid\", window.localStorage.getItem(\"deviceid\"), 365);\n window.localStorage.removeItem(\"deviceid\");\n return rcookie(\"deviceid\");\n }\n};\n\nexport const getCurrency = ({ auth, callback = () => { } }: { auth: string, callback: () => void }) => {\n const params = {};\n let getCurrencyTries = 0;\n\n if (getCurrencyTries >= 5) {\n onSuccess(\"$\");\n return;\n }\n\n if (auth) {\n params[\"auth\"] = $.cookie(\"pcauth\");\n }\n\n if (rcookie(\"forcecurrency\")) {\n params[\"currency\"] = $.cookie(\"forcecurrency\");\n }\n\n if (rcookie(\"forcecountry\")) {\n params[\"country\"] = $.cookie(\"forcecountry\");\n }\n\n const onSuccess = (currency) => {\n if (typeof Storage !== \"undefined\" && currencyMap[currency]) {\n sessionStorage.setItem(\"pclCurrency\", currencyMap[currency]);\n }\n\n callback(currency);\n };\n\n const getCurrencyApiCall = () => {\n getCurrencyTries++;\n const onError = () => {\n setTimeout(() => {\n getCurrencyApiCall();\n }, 300);\n };\n\n pCloudGlobals.apiMethod && pCloudGlobals.apiMethod(\n \"getcurrency\",\n params,\n (data) => {\n if (data.currency) {\n onSuccess(data.currency);\n } else {\n onError();\n }\n },\n {\n errorCallback: onError\n }\n );\n };\n\n getCurrencyApiCall();\n};\n\nexport const areArraysEqual = (array1: Array, array2: Array): boolean => {\n if (!array1 || !array2) {\n return false;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let index1 = 0; index1 < array1.length; index1++) {\n const e1 = array1[index1];\n const e2 = array2[index1];\n\n if (Array.isArray(e1) && Array.isArray(e2)) {\n compareArrays(e1, e2);\n } else if (e1 !== e2) {\n return false;\n }\n }\n\n return true;\n}\n\nexport const formatMS = (milliseconds: number, type: \"day\" | \"hour\" | \"minute\" | \"second\"): number => {\n const typeMap = {\n \"day\": { \"divider\": 86400000, \"modulo\": milliseconds + 1 },\n \"hour\": { \"divider\": 3600000, \"modulo\": 24 },\n \"minute\": { \"divider\": 60000, \"modulo\": 60 },\n \"second\": { \"divider\": 1000, \"modulo\": 60 }\n };\n\n if (!(type in typeMap)) {\n console.error(\"Invalid duration type: \" + type);\n\n return 0;\n }\n\n return parseInt((milliseconds / typeMap[type].divider) % typeMap[type].modulo);\n};\n\nexport const msToTime = (duration: number, showHours = true): string => {\n let seconds = parseInt((duration / 1000) % 60);\n let minutes = parseInt((duration / 60000) % 60);\n let hours = parseInt((duration / 3600000) % 24);\n\n hours = hours < 10 ? '0' + hours : hours;\n minutes = minutes < 10 ? '0' + minutes : minutes;\n seconds = seconds < 10 ? '0' + seconds : seconds;\n\n return (showHours ? hours + ':' : '') + minutes + ':' + seconds;\n};\n\nexport const cleanFloat = (number: number): number => {\n let value = Number(number);\n let decimal = value % 1 == 0 ? 0 : 2;\n let result = Number(value.toFixed(decimal));\n\n if (result % 1 == 0) {\n decimal = 0;\n }\n\n return Number(value.toFixed(decimal));\n};\n\nexport const browserVersion = (userAgent, regex) => {\n return userAgent.match(regex) ? userAgent.match(regex)[2] : null;\n}\n\nexport const detectBrowser = (version) => {\n const userAgent = navigator.userAgent;\n let browser = \"unkown\";\n // Detect browser name\n browser = (/ucbrowser/i).test(userAgent) ? 'UCBrowser' : browser;\n browser = (/edg/i).test(userAgent) ? 'Edge' : browser;\n browser = (/googlebot/i).test(userAgent) ? 'GoogleBot' : browser;\n browser = (/chromium/i).test(userAgent) ? 'Chromium' : browser;\n browser = (/firefox|fxios/i).test(userAgent) && !(/seamonkey/i).test(userAgent) ? 'Firefox' : browser;\n browser = (/; msie|trident/i).test(userAgent) && !(/ucbrowser/i).test(userAgent) ? 'IE' : browser;\n browser = (/chrome|crios/i).test(userAgent) && !(/opr|opera|chromium|edg|ucbrowser|googlebot/i).test(userAgent) ? 'Chrome' : browser;;\n browser = (/safari/i).test(userAgent) && !(/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i).test(userAgent) ? 'Safari' : browser;\n browser = (/opr|opera/i).test(userAgent) ? 'Opera' : browser;\n browser = navigator.brave ? \"Brave\" : browser;\n\n if (version) {\n switch (browser) {\n case 'UCBrowser': return `${browser}/${browserVersion(userAgent, /(ucbrowser)\\/([\\d\\.]+)/i)}`;\n case 'Edge': return `${browser}/${browserVersion(userAgent, /(edge|edga|edgios|edg)\\/([\\d\\.]+)/i)}`;\n case 'GoogleBot': return `${browser}/${browserVersion(userAgent, /(googlebot)\\/([\\d\\.]+)/i)}`;\n case 'Chromium': return `${browser}/${browserVersion(userAgent, /(chromium)\\/([\\d\\.]+)/i)}`;\n case 'Firefox': return `${browser}/${browserVersion(userAgent, /(firefox|fxios)\\/([\\d\\.]+)/i)}`;\n case 'Chrome': return `${browser}/${browserVersion(userAgent, /(chrome|crios)\\/([\\d\\.]+)/i)}`;\n case 'Safari': return `${browser}/${browserVersion(userAgent, /(safari)\\/([\\d\\.]+)/i)}`;\n case 'Opera': return `${browser}/${browserVersion(userAgent, /(opera|opr)\\/([\\d\\.]+)/i)}`;\n case 'IE': const version = browserVersion(userAgent, /(trident)\\/([\\d\\.]+)/i);\n // IE version is mapped using trident version \n // IE/8.0 = Trident/4.0, IE/9.0 = Trident/5.0\n return version ? `${browser}/${parseFloat(version) + 4.0}` : `${browser}/7.0`;\n default: return `unknown/0.0.0.0`;\n }\n }\n\n return browser;\n}\n\nexport const isValidEmailAddress = (email: string): boolean => {\n const pattern = new RegExp(/^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\t\".+\\\"))@((\\[[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 return pattern.test(email);\n};\n\nexport const apiCall = (method, params, onSuccess, onError, opts) => {\n const dfd = jQuery.Deferred();\n opts = {\n errorCallback: (data) => {\n dfd.reject(data);\n if (typeof onError === 'function') {\n onError(data);\n }\n },\n ...opts\n }\n\n pCloudGlobals.apiMethod(\n method,\n params,\n (data) => {\n if (typeof onSuccess === 'function') {\n onSuccess(data);\n }\n dfd.resolve(data);\n },\n opts\n );\n\n return dfd.promise();\n};\n\nexport const apiCallPost = (method, params, onSuccess, onError, opts) => {\n const dfd = jQuery.Deferred();\n opts = {\n type: \"POST\",\n errorCallback: (data) => {\n dfd.reject(data);\n if (typeof onError === 'function') {\n onError(data);\n }\n },\n ...opts\n }\n\n pCloudGlobals.apiMethod(\n method,\n params,\n (data) => {\n dfd.resolve(data);\n if (typeof onSuccess === 'function') {\n onSuccess(data);\n }\n },\n opts\n );\n\n return dfd.promise();\n};\n\nexport const detectIsMobile = () => {\n return /Mobile|mini|Fennec|Android|iP(od|hone)/.test(navigator.appVersion);\n};\n\nexport const onMouseOut = (event, callback) => {\n const e = event ? event : window.event;\n // If this is an autocomplete element.\n if (e.target && e.target.tagName && e.target.tagName.toLowerCase() == \"input\") {\n return;\n }\n\n // Get the current viewport width.\n const vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n\n // If the current mouse X position is within 50px of the right edge of the viewport, return.\n if (e.clientX >= (vpWidth - 50)) {\n return;\n }\n\n // If the current mouse Y position is not within 50px of the top edge of the viewport, return.\n if (e.clientY >= 50) {\n return;\n }\n\n // Fixes mozila problem where event is getting triggered on rigth click. -83 seems to be a constant value for clientY in that case.\n if (e.clientY === -83) {\n return;\n }\n\n // Reliable, works on mouse exiting window and user switching active program\n const from = e.relatedTarget || e.toElement;\n\n // User is exiting window\n if (!from && callback) {\n callback();\n }\n}\n\nexport const isInternetExplorer = () => {\n return !!document.documentMode;\n}\n\nexport const scrollToTop = () => {\n window.scrollTo(0);\n};\n\nexport const bytesToSize = (bytes) => {\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n if (bytes == 0) return null;\n const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));\n if (i == 0) return bytes + ' ' + sizes[i];\n return (bytes / Math.pow(1024, i)).toFixed(0) + ' ' + sizes[i];\n};\n\nexport const setTitleByCodeUrl = (codeUrl, setTitle, setRegisterTitle, setLoginTitle) => {\n if (codeUrl) {\n if (codeUrl == 'DROPBOX2PCLOUD') {\n setTitle('Special for Dropbox users - press submit and enjoy 3 months of Premium 500 GB for Free');\n } else if (codeUrl == 'HUBIC2PCLOUD') {\n setTitle('Special for hubiC users - press submit and enjoy 3 months of Premium 500 GB for Free');\n } else if (codeUrl == 'APPO') {\n setTitle('Special for\"APPO\" members - register now and enjoy 3 months of Premium 500 GB for Free');\n } else if (codeUrl == 'BIRTHDAY4U') {\n setTitle(__(\"PromoPage_birthday_text\"));\n } else if (codeUrl == 'PCLOUDMUSIC') {\n setTitle(__(\"pCloud_Music_coupon_submit\").replace(\"%url_promo%\", codeUrl));\n setRegisterTitle(__(\"pCloud_Music_coupon_register\").replace(\"%url_promo%\", codeUrl));\n setLoginTitle(__(\"pCloud_Music_coupon_login\").replace(\"%url_promo%\", codeUrl));\n } else if (codeUrl == 'BDAY3MONTHS') {\n setTitle(__(\"pm_coupon_submit\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 3));\n setRegisterTitle(__(\"pm_coupon_register\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 3));\n setLoginTitle(__(\"pm_coupon_login\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 3));\n } else if (codeUrl == 'PM6MONTHS' || codeUrl == \"INT6MONTHS\"|| codeUrl == \"LFS6MONTHS\") {\n setTitle(__(\"pm_coupon_submit\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 6));\n setRegisterTitle(__(\"pm_coupon_register\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 6));\n setLoginTitle(__(\"pm_coupon_login\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 6));\n } else {\n setTitle(__(\"promo_submit_with_url\").replace(\"%url_promo%\", codeUrl));\n setRegisterTitle(__(\"Register for Free and enter your promo code. It will become effective immediately!\"));\n setLoginTitle(__(\"Enter your promo code upon Login and it will become effective immediately.\"));\n }\n }\n else {\n setTitle(__('Have a promo code? Enter it below.'));\n setRegisterTitle(__(\"Register for Free and enter your promo code. It will become effective immediately!\"));\n setLoginTitle(__(\"Enter your promo code upon Login and it will become effective immediately.\"));\n }\n};\n\nexport const getMonthsFromCode = (code) => {\n if (!code) {\n return \"\"\n };\n\n const indexPosition = code.indexOf(\"MONTHS\");\n let monthsCountIndex;\n\n if (indexPosition === -1) {\n return \"\";\n }\n\n if (indexPosition > 0) {\n monthsCountIndex = indexPosition - 1;\n } else {\n monthsCountIndex = indexPosition + 7;\n }\n\n if (!isNaN(code[monthsCountIndex])) {\n return code[monthsCountIndex]\n }\n\n return \"\";\n};\n\nexport const getLanguage = () => {\n return currentLang || $.cookie('set_lang') || $.cookie('lang') || 'en'\n}\n\nexport const countriesInEuropeList = {\n \"AT\": \"Austria\",\n \"BE\": \"Belgium\",\n \"BG\": \"Bulgaria\",\n \"HR\": \"Croatia\",\n \"CY\": \"Cyprus\",\n \"CZ\": \"Czech Republic\",\n \"DK\": \"Denmark\",\n \"EE\": \"Estonia\",\n \"FI\": \"Finland\",\n \"FR\": \"France\",\n \"DE\": \"Germany\",\n \"GR\": \"Greece\",\n \"HU\": \"Hungary\",\n \"IE\": \"Ireland\",\n \"IT\": \"Italy\",\n \"LV\": \"Latvia\",\n \"LT\": \"Lithuania\",\n \"LU\": \"Luxembourg\",\n \"MT\": \"Malta\",\n \"NL\": \"Netherlands\",\n \"PL\": \"Poland\",\n \"PT\": \"Portugal\",\n \"RO\": \"Romania\",\n \"SK\": \"Slovakia\",\n \"SI\": \"Slovenia\",\n \"ES\": \"Spain\",\n \"SE\": \"Sweden\",\n \"CH\": \"Switzerland\",\n \"GB\": \"United Kingdom\",\n \"AL\": \"Albania\",\n \"AD\": \"Andorra\",\n \"AM\": \"Armenia\",\n \"BY\": \"Belarus\",\n \"BA\": \"Bosnia and Herzegovina\",\n \"FO\": \"Faroe Islands\",\n \"GE\": \"Georgia\",\n \"GI\": \"Gibraltar\",\n \"IS\": \"Iceland\",\n \"IM\": \"Isle of Man\",\n \"XK\": \"Kosovo\",\n \"LI\": \"Liechtenstein\",\n \"MK\": \"Macedonia\",\n \"MD\": \"Moldova\",\n \"MC\": \"Monaco\",\n \"ME\": \"Montenegro\",\n \"NO\": \"Norway\",\n \"RU\": \"Russian Federation\",\n \"SM\": \"San Marino\",\n \"RS\": \"Serbia\",\n \"CH\": \"Switzerland\",\n \"TR\": \"Turkey\",\n \"UA\": \"Ukraine\",\n \"GB\": \"United Kingdom\",\n \"VA\": \"Vatican City State\"\n};\n\nexport const isCountryInEurope = (countryCodeToNameMap, country) => {\n return countryCodeToNameMap[country];\n};\n\nexport const encodeQueryData = (data) => {\n const ret = [];\n\n for (let d in data) {\n ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));\n }\n\n return ret.join('&');\n};\n\nexport const calculateDiscountPercent = (price, oldPrice) => Math.floor((1 - (price/oldPrice)) * 100);\n\nexport const convertDateToDDMMMYY = (date: string, shortMonthName = true, dayMonthSeparator = \" \", monthYearSeparator = \" \") => {\n const monthNames = [\n \"jan\",\n \"feb\",\n \"mar\",\n \"apr\",\n \"may\",\n \"jun\",\n \"jul\",\n \"aug\",\n \"sep\",\n \"oct\",\n \"nov\",\n \"dec\"\n ];\n const dateObj = new Date(date);\n const day = dateObj.getDate();\n const month = monthNames[dateObj.getMonth()];\n const monthKey = \"month_\" + (!shortMonthName ? \"full_\" : \"\") + month;\n const year = dateObj.getFullYear();\n\n return day + dayMonthSeparator + __(monthKey) + monthYearSeparator + year;\n};\n\nexport const daysDiff = (dateTo: string, dateFrom: string = null) => {\n const dateFromObj = dateFrom !== null && dateFrom !== \"\" ? new Date(dateFrom) : new Date();\n const dateToObj = new Date(dateTo);\n\n // Change hours and minutes to be from the start of the day.\n dateFromObj.setHours(0,0,0,0);\n dateToObj.setHours(0,0,0,0);\n return (dateToObj.getTime() - dateFromObj.getTime() + ((dateFromObj.getTimezoneOffset() - dateToObj.getTimezoneOffset()) * 60 * 1000)) / (1000 * 3600 * 24);\n};","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t