{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/utils/amelia/utility.js","webpack:///./src/store/store.js","webpack:///./src/components/CookieNotification.vue?f3c3","webpack:///./src/components/ResendMessage.vue?72b7","webpack:///./src/components/Message.vue?f43c","webpack:///src/components/Message.vue","webpack:///./src/components/Message.vue?93ea","webpack:///./src/components/Message.vue","webpack:///./src/components/CookieNotification.vue?e974","webpack:///./src/components/TgamLink.vue?dacf","webpack:///src/components/TgamLink.vue","webpack:///./src/components/TgamLink.vue?1d51","webpack:///./src/components/TgamLink.vue","webpack:///src/components/CookieNotification.vue","webpack:///./src/components/CookieNotification.vue?7d04","webpack:///./src/components/CookieNotification.vue","webpack:///./src/components/FlashMessage.vue?8179","webpack:///src/components/FlashMessage.vue","webpack:///./src/components/FlashMessage.vue?51d3","webpack:///./src/components/FlashMessage.vue","webpack:///./src/components/LoginCognito.vue?c0ca","webpack:///./src/components/FlashMessage.vue?5340","webpack:///./src/utils/session.js","webpack:///./src/App.vue?4d00","webpack:///./src/components/GlobalHeader.vue?507e","webpack:///src/components/GlobalHeader.vue","webpack:///./src/components/GlobalHeader.vue?9709","webpack:///./src/components/GlobalHeader.vue","webpack:///./src/components/GlobalFooter.vue?2c4e","webpack:///./src/components/RecaptchaText.vue?575b","webpack:///src/components/RecaptchaText.vue","webpack:///./src/components/RecaptchaText.vue?02b8","webpack:///./src/components/RecaptchaText.vue","webpack:///src/components/GlobalFooter.vue","webpack:///./src/components/GlobalFooter.vue?e744","webpack:///./src/components/GlobalFooter.vue","webpack:///src/App.vue","webpack:///./src/App.vue?1160","webpack:///./src/App.vue","webpack:///./src/components/LoginCognito.vue?e5a5","webpack:///./src/components/SocialLogInSwg.vue?6f69","webpack:///src/components/SocialLogInSwg.vue","webpack:///./src/components/SocialLogInSwg.vue?61c8","webpack:///./src/components/SocialLogInSwg.vue","webpack:///./src/components/ConfirmMessage.vue?0679","webpack:///src/components/ConfirmMessage.vue","webpack:///./src/components/ConfirmMessage.vue?eedf","webpack:///./src/components/ConfirmMessage.vue","webpack:///./src/components/ResendMessage.vue?879d","webpack:///src/components/ResendMessage.vue","webpack:///./src/components/ResendMessage.vue?c8d0","webpack:///./src/components/ResendMessage.vue","webpack:///./src/components/LoadingSpinner.vue?89b8","webpack:///src/components/LoadingSpinner.vue","webpack:///./src/components/LoadingSpinner.vue?4010","webpack:///./src/components/LoadingSpinner.vue","webpack:///./src/utils/afterLoginGoToCookie.js","webpack:///src/components/LoginCognito.vue","webpack:///./src/components/LoginCognito.vue?239d","webpack:///./src/components/LoginCognito.vue","webpack:///./src/components/Callback.vue?38d4","webpack:///./src/mixins/components/socialSignInHelper.js","webpack:///src/components/Callback.vue","webpack:///./src/components/Callback.vue?726b","webpack:///./src/components/Callback.vue","webpack:///./src/components/SubscribeWithGoogle.vue?f856","webpack:///src/components/SubscribeWithGoogle.vue","webpack:///./src/components/SubscribeWithGoogle.vue?7c0f","webpack:///./src/components/SubscribeWithGoogle.vue","webpack:///./src/routes.js","webpack:///./src/utils/validations.js","webpack:///./src/utils/importRecaptcha.js","webpack:///./src/main.js","webpack:///./src/assets/images/close-x.png","webpack:///./src/App.vue?165b","webpack:///./src/assets/images/google-logo.svg","webpack:///./src/components/TgamLink.vue?d74d","webpack:///./src/utils/amelia/index.js","webpack:///./src/assets/images/apple-logo.svg","webpack:///./src/plugins/analytics.js","webpack:///./src/utils/api.js","webpack:///./src/components/RecaptchaText.vue?435a","webpack:///./src/components/ConfirmMessage.vue?05b4","webpack:///./src/mixins/components/limioMixin.js","webpack:///./src/components/base/BaseCheckbox.vue?2e85","webpack:///./src/components/base/BaseCheckbox.vue?85e8","webpack:///src/components/base/BaseCheckbox.vue","webpack:///./src/components/base/BaseCheckbox.vue?458a","webpack:///./src/components/base/BaseCheckbox.vue","webpack:///./src/utils/storeHelpers.js","webpack:///./src/utils/messages.js","webpack:///./src/components/SocialLogInSwg.vue?e04b","webpack:///./src/utils/constants.js","webpack:///./src/vendor/amplitude/index.js","webpack:///./src/components/LoadingSpinner.vue?31c8","webpack:///./src/utils/cookie.js","webpack:///./src/components/Message.vue?2f53","webpack:///./src/utils/cognito.js","webpack:///./src/utils/is.js","webpack:///./src/vendor/amplitude/amplitudeUtils.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","clearTimeout","chunk","errorType","realSrc","error","undefined","setTimeout","all","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","evaluateCondition","experiment","exec","eval","runConditionsCode","formatExperimentName","replace","toLowerCase","removeUnallocatedExperiments","experiments","filter","allocation","id","formatForDatalayer","ameliaAllocation","map","salt","percentage","segment","newName","join","formatForSophi3","testId","engine","variantName","segmentName","store","getAmeliaExperiments","abTestCookie","tests","Cookie","split","item","formatForAmplitude","getLimioOfferObj","limioOfferCookie","JSON","parse","getLimioCampaignCode","limioOfferObj","scc","getLimioSubscriptionType","st","orderInfo","orderInfoCookie","cem3190Variant","limioTests","cem3190Test","find","test","includes","Vue","use","Vuex","Analytics","options","state","isRegistered","requireEmailConfirmation","confirmationEmail","resendValidateEmail","isAuthenticated","session","apiError","flashMessage","loginMethod","isModal","currentMember","ameliaState","personalInfo","signupNewsletter","sendResetPasswordEmail","logInQueryParams","getters","isIframe","location","parent","getAmeliaState","experimentName","urlParams","URLSearchParams","paramValue","getAmeliaAllocation","mutations","unauthorize","nextTick","analytics","logout","authorize","authenticate","createUser","response","body","email","registerComplete","chartbeat","accountRegistration","signUpNewsletter","clearEmailConfirmation","setCurrentMember","member","clearCurrentMember","errorCode","RegisterMessages","PASSWORD_ERROR","INTERNAL_SERVER_ERROR","GENERIC_ERROR","clearApiError","clearflashMessage","method","params","resendEmail","setModal","setAmeliaState","payload","setAmeliaAllocation","debug","updatePersonalInfo","updateLogInQueryParams","actions","register","context","getGrecaptchaToken","grecaptchaToken","apiConfig","credentials","headers","token","api","postWithConfig","commit","catch","socialLogin","provider","rememberMe","post","socialRegister","socialRegisterComplete","addSocialAccount","platform","socialSignup","validateChangedEmail","put","resendActivationEmail","saveNewPassword","ENV_NAME","cpcConfig","sessionEnv","envMatch","destroy","singupNewsletter","recover","sendEmail","message","setAmeliaDatalayer","tgam","datalayer","ameliaDatalayer","trackedExperiments","ameliaTests","sendAmeliaEvent","updateAmeliaState","experimentsArray","dispatch","Store","render","_vm","this","_h","$createElement","_c","_self","staticClass","_t","_v","_s","confirmEmail","staticRenderFns","props","String","required","default","component","attrs","imageUrl","domProps","text","components","TgamLink","IMAGES_URL","directives","rawName","expression","FlashMessage","on","$event","preventDefault","clearFlashMessage","computed","$store","methods","delete","removeCookie","remove","domain","COOKIE_DOMAIN","_e","class","header","headerHiding","headerHidden","headerRevealing","headerRevealed","previousScrollPos","tgamHostUrl","mounted","init","addEventListener","onHeaderAnimationEnd","attachScrollHandler","onPageScroll","scrollPos","hideHeader","revealHeader","classList","add","contains","_m","RecaptchaText","GlobalHeader","GlobalFooter","isSocialPopup","$route","path","showHeader","isValidateEmailToken","isActivationSourceIos","isActivationSourceAndroid","isCookieEnabled","displayHomeDeliveryMessaging","cem3190IsExp","findMyPrintUrl","subscriptionUrl","ref","limioSubscriptionType","isLimioClient","logInHeading","pathToRegisterPage","$refs","loginValidator","reset","apiErrorMessage","isSendConfirmationEmail","isLimio","scopedSlots","_u","fn","errors","invalid","touched","updateEmail","composing","modifiers","indexOf","_k","keyCode","login","focusInputPasswordContainer","focusOutInputPasswordContainer","password","trim","$forceUpdate","togglePasswordVisibility","showPassword","nativeOn","goToRecover","isLoading","_l","updateRememberMeValue","cookieNotificationText","labels","socialProvider","Boolean","google","signInWithApple","isFBTesting","fbTest","errorMessage","proxy","clearErrors","Function","sentConfirmationEmail","swg","isLogInTypeSiwg","query","loginType","redirectToAfterLoginGoTo","afterRegOrSubGoTo","afterLoginGoTo","set","expires","TGAM_LINKS_HOST","part1","part2","SocialLogInSwg","ConfirmMessage","ResendMessage","ValidationObserver","ValidationProvider","CookieNotification","LoadingSpinner","BaseCheckbox","mixins","limioMixin","socialProviders","callbackUrl","csrPhoneNumber","limioCampaignCode","validateEmailToken","source","isMobileAppUniversalLogin","inputPasswordContainer","querySelector","extClientId","watch","client_id","redirectTo","redirectToOauth2UrlWithLimioParams","handleAuthentication","created","getLimioLogInParams","setLimioFlag","localStorage","setItem","handleValidateEmail","processQueryEhash","userEmail","emailRef","focus","callbackError","resetPassword","scrollTo","$analytics","pageview","pageLoaded","beforeDestroy","beforeRouteLeave","from","to","next","limioFlag","removeItem","$evt","$router","resentValidateEmail","confirmChangedEmail","setAfterLoginGoToCookie","afterLoginGoToValue","url","socialSignInHelper","socialAction","sendAnalytics","action","accountLogin","cpcenv","getItem","startsWith","callback","getSocialStatus","toUpperCase","subscribeWithGoogle","hash","sendAccessTokenToApi","VueRouter","isAuthorized","settingsUrl","MY_ACCOUNT_URL","cardUpdateEmail","putWithConfig","registerConfirmed","isAuthorizedForLogIn","meta","keys","verifyNewsletterToken","Accept","verificationToken","postWithConfigV4","finally","hashUrlPatternCheck","fullPathPattern","hashPattern","isOldUrlPattern","fullPath","newFullPath","substring","routes","beforeEnter","regwallType","Callback","SubscribeWithGoogle","LoginCognito","hasCookie","isOntraportRedirect","getAnalyticsApiData","analyticsApiData","ssvcs","access","getEntitlements","ADVISOR","log","ONTRAPORT_LOGOUT","stringify","accountLogout","ampli","client","flush","logInQuery","logInWithSalesforce","LIMIO_CLIENT_ID","COGNITO_USER_POOL_WEB_CLIENT_ID","COGNITO_AUTHORIZE_BASE_URL_LOGOUT","AUTHENTICATION_CALLBACK","LIMIO_LAUNCH_FLAG","LIMIO_DOMAIN","LoginMessages","EMAIL_UPDATE_VERIFIED","UPDATE_EMAIL_VERIFICATION_ERROR","router","base","beforeEach","extendValidationRules","extend","validate","min","field","max","regex","values","displayName","valid","errorKey","ALREADY_TAKEN","RECAPTCHA_SITE_KEY","TIMEOUT","handleCancel","handleLoad","timer","grecaptcha","ready","removeEventListener","importRecaptcha","onCancel","onLoad","envName","environment","load","configuration","defaultTracking","setTransport","library","faGoogle","faFacebookF","FontAwesomeIcon","setInteractionMode","VueResource","el","App","h","ameliaInit","sophiId","userId","http","AMELIA_COLLECTION_API","amelia","datafile","user","processedExperiments","AnalyticsPlugin","analyticsLayer","abTests","pageName","page","accountEvent","loginprovider","registerInitiated","socialRegisterInitiated","recoverPassword","clickEvent","feature","label","defineProperties","USERMANAGEMENTAPI","getV2","ok","postPublicV3","config","postToCheckEntitlements","ext_client_id","ext_response_type","ext_redirect_uri","ext_scope","ext_state","logInWithLimio","oauth2Url","OAUTH2_URL","inputValue","isCheckedValue","Array","isArray","_i","$$a","$$el","$$c","checked","$$v","$$i","concat","$emit","style","checkmarkStyle","isChecked","actionLabel","execute","BAD_CREDENTIALS","ACCOUNT_NOT_ACTIVE","REGISTER_EMAIL_VERIFIED","REGISTER_EMAIL_VERIFICATION_ERROR","LOGIN_REGISTER_URL","FACEBOOK_EMAIL_MISSING","ALREADY_EXISTS","BAD_CREDENTIALS_STRICT","ResetPasswordMessages","RESET_PASSWORD_SAVED","RESET_PASSWORD_ERROR","RESET_PASSWORD_TOKEN_INVALID","SOCIAL_ONLY_ACCOUNT","RecoverMessages","NOTHING_FOUND_RECOVER","loginLink","limioParams","queryParams","PASSWORD_RESET_URL","NO_ACCOUNT_FOUND","ALREADY_TAKEN_UNVERIFIED_EMAIL","ALREADY_TAKEN_EMAIL_UNDER30D","NEWSLETTER_VERIFIED","newsletterName","NEWSLETTER_ERROR","ApiKey","dev","prod","DefaultConfiguration","plan","version","branch","versionId","ingestionMetadata","sourceName","sourceVersion","AccountInteraction","properties","event_type","event_properties","AccountLogin","AccountLogout","AccountRegistration","AccountSubscription","ArticleView","AudioComplete","AudioPause","AudioPlay","ButtonClick","CommentPost","CommentReply","CommentRespect","ContentImpressions","HomepageView","LinkClick","NewsletterSignup","NewsletterUnsubscribe","PaywallHit","RegwallHit","SectionView","SiteSearch","VideoComplete","VideoPause","VideoPlay","getVoidPromiseResult","Ampli","amplitude","disabled","isLoaded","apiKey","warn","instance","isInitializedAndEnabled","user_id","ampIdentify","eventProperties","entries","identify","track","cookie","val","getConfig","clientId","responseType","COGNITO_RESPONSE_TYPE","scope","COGNITO_SCOPE","redirect_uri","isObjectEmpty","constructor","isNil","sortEventPayload","obj","sort","reduce","sortedObj","getAccountLogInProvider","logInProvider","sophi","visitor","loginProvider","getLimioIntCmp","limioConversionCookie","sessionId","getSessionId","sid","ic","getLimioOfferCookieData","getEventPayload","search","intcmp","utmCampaign","utmContent","utmMedium","utmSource","utmTerm","limioPageName","pathname","breadcrumb","section","subsection1","subsection2","subsection3","subsection4","limioOfferCookieData","innerHeight","innerWidth","origin","hostname","referrer","URL","navigator","userAgent","sf","mapKeys","keyMapping","newObj","getFirstConversionsPayload","eventPayload","firstConversionsPayload","firstConversionCookie","keyMappingFirstConversions","mcam","mcon","mmed","ms","mt","rhost","getLastConversionsPayload","lastConversionsPayload","lastConversionCookie","keyMappingLastConversions","ah","aid","sub1","sub2","sub3","wn","wt","accountLoginProvider","accountRegistrationData","accountLoginData","accountLogoutData","accountInteraction","accountAction","accountInteractionData","sectionView","sectionViewData","getSophiSdkData","sdk","paywall","parseDeviceInformation","deviceInfo","getVisitInformation","visitInfo","PRODUCTS","groupCode","DIGITAL","NONE","NYT_PRINT","ONDEMAND_DIGITAL","PRINT","FIN_TOOLS_TRIAL","defaultProducts","services","entitlements","forEach","service","product","accountTypes","anonymous","registered","subscribed","sophiSdkData","accountType","trackedRegwallAndFusionExperiments","identifyData","postal","zipcode","viewer","os","count","timeZone","daysSinceLastVisit","guid"],"mappings":"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","file":"js/app.dbbeb5fa.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({\"loginAs\":\"loginAs\",\"recover\":\"recover\",\"register\":\"register\",\"resetPassword\":\"resetPassword\",\"social\":\"social\"}[chunkId]||chunkId) + \".\" + {\"loginAs\":\"35373f92\",\"recover\":\"cf206973\",\"register\":\"22a4c715\",\"resetPassword\":\"bb46ffcf\",\"social\":\"5d62c61b\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"loginAs\":1,\"recover\":1,\"register\":1,\"resetPassword\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({\"loginAs\":\"loginAs\",\"recover\":\"recover\",\"register\":\"register\",\"resetPassword\":\"resetPassword\",\"social\":\"social\"}[chunkId]||chunkId) + \".\" + {\"loginAs\":\"1edc4244\",\"recover\":\"96f216d1\",\"register\":\"3af8abcd\",\"resetPassword\":\"e35a3b86\",\"social\":\"31d6cfe0\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\tvar error = new Error('Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')');\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/user/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import Cookie from 'js-cookie'\n\n// extract JavaScript code by using eval\nconst evaluateCondition = function(experiment) {\n  const exec = eval('(function() {' + experiment.runConditionsCode + '}())')\n  return exec\n}\n\n// format experiment name\nconst formatExperimentName = function(name = '') {\n  return name.replace(/[-\\s]+/g, '_').toLowerCase()\n}\n\n// filter out unallocated experiments\nconst removeUnallocatedExperiments = function(experiments = []) {\n  return experiments.filter(\n    experiment => experiment.allocation.id && experiment.allocation.id.length\n  )\n}\n\n// return experiments in a format required for `window.tgam.datalayer.ameliaTests` (Sophi 2)\nconst formatForDatalayer = function(ameliaAllocation = {}) {\n  const { experiments = [] } = ameliaAllocation\n  return removeUnallocatedExperiments(experiments)\n    .map(experiment => {\n      const {\n        name,\n        salt,\n        percentage,\n        allocation,\n        segment = 'default'\n      } = experiment\n      const newName = formatExperimentName(name)\n      return `${newName}_${salt}_${percentage}:${allocation.id.toLowerCase()}:${segment}`\n    })\n    .join(',')\n}\n\n// return all active experiments formatted for Sophi 3 analytics reporting.\nconst formatForSophi3 = function(ameliaAllocation = {}) {\n  const { experiments = [] } = ameliaAllocation\n  return removeUnallocatedExperiments(experiments).map(experiment => {\n    const {\n      name,\n      salt,\n      percentage,\n      allocation,\n      segment = 'default'\n    } = experiment\n    const newName = formatExperimentName(name)\n    return {\n      testId: `${newName}_${salt}_${percentage}`,\n      engine: 'custom-murmurhash',\n      variantName: allocation.id.toLowerCase(),\n      segmentName: segment,\n      store: 'visitor'\n    }\n  })\n}\n\n// Get the amelia experiments data from various cookies.\nconst getAmeliaExperiments = function(abTestCookie) {\n  try {\n    const tests = Cookie.get(abTestCookie)\n\n    if (!tests) {\n      return ''\n    }\n\n    return tests.length\n      ? tests.split(',').map(item => {\n          // testId = `${newName}_${salt}_${percentage}`\n          const [testId, variantName, segmentName] = item.split(':')\n          return { testId, variantName, segmentName, store: 'visitor' }\n        })\n      : []\n  } catch (e) {\n    console.error(e)\n    return []\n  }\n}\n\n// Return all active experiments formatted for Amplitude analytics reporting.\nconst formatForAmplitude = function(experiments = []) {\n  // Format: ['test_id::test_variant::test_segment::test_attribution']\n  return experiments.map(\n    e => `${e.testId}::${e.variantName}::${e.segmentName}::${e.store}`\n  )\n}\n\nconst getLimioOfferObj = () => {\n  const limioOfferCookie = Cookie.get('tgam.amplitude.limioOffer')\n  return limioOfferCookie ? JSON.parse(limioOfferCookie) : null\n}\n\nconst getLimioCampaignCode = () => {\n  const limioOfferObj = getLimioOfferObj()\n  return limioOfferObj?.scc || ''\n}\n\nconst getLimioSubscriptionType = () => {\n  const limioOfferObj = getLimioOfferObj()\n  return limioOfferObj?.st || ''\n}\n\nconst orderInfo = () => {\n  const orderInfoCookie = Cookie.get('tgam.orderInfo')\n  return orderInfoCookie ? JSON.parse(orderInfoCookie) : null\n}\n\n// cem3190 begins\nconst cem3190Variant = () => {\n  const limioTests = getAmeliaExperiments('tgam.limio.tests')\n  const cem3190Test = limioTests\n    ? limioTests.find(test => test.testId.includes('cem3190'))\n    : null\n  return cem3190Test?.variantName || ''\n}\n// cem3190 ends\n\nexport {\n  evaluateCondition,\n  formatForDatalayer,\n  formatForSophi3,\n  getAmeliaExperiments,\n  formatForAmplitude,\n  getLimioCampaignCode,\n  getLimioSubscriptionType,\n  orderInfo,\n  cem3190Variant\n}\n","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport api from '../utils/api'\nimport session from '../utils/session'\nimport Analytics from '../plugins/analytics'\nimport Cookie from 'js-cookie'\nimport { getGrecaptchaToken } from '@/utils/storeHelpers'\nimport { RegisterMessages } from '@/utils/messages'\nimport { formatForDatalayer, formatForSophi3 } from '@/utils/amelia/utility'\nimport { accountRegistration } from '@/vendor/amplitude/amplitudeUtils.js'\n\nVue.use(Vuex)\nVue.use(Analytics)\n\nconst options = {\n  state: {\n    isRegistered: false,\n    requireEmailConfirmation: false,\n    confirmationEmail: '',\n    resendValidateEmail: false,\n    isAuthenticated: session.isAuthenticated(),\n    apiError: '',\n    flashMessage: '',\n    loginMethod: '',\n    isModal: false,\n    currentMember: {},\n    ameliaState: {},\n    ameliaAllocation: {},\n    personalInfo: {},\n    signupNewsletter: false,\n    sendResetPasswordEmail: false,\n    logInQueryParams: {}\n  },\n  getters: {\n    apiError: state => {\n      return state.apiError\n    },\n    isRegistered: state => {\n      return state.isRegistered\n    },\n    requireEmailConfirmation: state => {\n      return state.requireEmailConfirmation\n    },\n    confirmationEmail: state => {\n      return state.confirmationEmail\n    },\n    personalInfo: state => {\n      return state.personalInfo\n    },\n    isIframe: () => {\n      return window.location !== window.parent.location\n    },\n    getAmeliaState: state => (experimentName = '') => {\n      if (!experimentName) {\n        return\n      }\n\n      const { experiments = [] } = state.ameliaState\n\n      // find out the experiment whose name is passed to the function\n      const experiment = experiments.find(\n        experiment => experiment.name === experimentName\n      )\n\n      // get the query string for the url\n      const urlParams = new URLSearchParams(window.location.href.split('?')[1])\n      // is there a query string parameter that matches our test name? if so, get the value of that parameter\n      const paramValue = urlParams && urlParams.get(experimentName)\n      if (paramValue) {\n        experiment.allocation.id = paramValue\n      }\n      return experiment\n    },\n    getAmeliaAllocation: state => (experimentName = '') => {\n      if (!experimentName) {\n        return\n      }\n\n      const { experiments = [] } = state.ameliaAllocation\n\n      // find out the experiment whose name is passed to the function\n      const experiment = experiments.find(\n        experiment => experiment.name === experimentName\n      )\n      return experiment\n    }\n  },\n  mutations: {\n    unauthorize: state => {\n      state.isAuthenticated = false\n      Vue.nextTick(() => {\n        Vue.analytics.logout()\n      })\n    },\n    authorize: state => {\n      state.isAuthenticated = true\n    },\n    authenticate: state => {\n      state.isAuthenticated = true\n    },\n    createUser: (state, response) => {\n      state.isAuthenticated = false\n      state.isRegistered = true\n      state.requireEmailConfirmation = true\n      state.confirmationEmail = response.body.email\n      Vue.analytics.registerComplete()\n      window.chartbeat && window.chartbeat('trackRegistrationComplete')\n      // Trigger accountRegistration once registration is completed\n      accountRegistration()\n    },\n    signupNewsletter: state => {\n      state.signUpNewsletter = true\n    },\n    clearEmailConfirmation: state => {\n      state.requireEmailConfirmation = false\n      state.confirmationEmail = ''\n    },\n    setCurrentMember: (state, member) => {\n      state.currentMember = member\n    },\n    clearCurrentMember: state => {\n      state.currentMember = {}\n    },\n    apiError: (state, error) => {\n      if (error) {\n        if (error.body && window.location.href.includes('/register')) {\n          const errorCode = error.body.error\n          errorCode === 'VALIDATION'\n            ? (state.apiError = RegisterMessages.PASSWORD_ERROR)\n            : errorCode === 'INTERNAL_SERVER_ERROR'\n            ? (state.apiError = RegisterMessages.INTERNAL_SERVER_ERROR)\n            : (state.apiError = RegisterMessages.GENERIC_ERROR)\n        } else {\n          state.apiError = error\n        }\n      } else {\n        state.apiError = 'The server is not responding'\n      }\n    },\n    clearApiError: state => {\n      state.apiError = ''\n    },\n    flashMessage: (state, error) => {\n      state.flashMessage = error\n    },\n    clearflashMessage: state => {\n      state.flashMessage = ''\n    },\n    loginMethod: (state, method) => {\n      state.loginMethod = method\n    },\n    resendValidateEmail: (state, params) => {\n      state.confirmationEmail = params.email\n      state.resendValidateEmail = params.resendEmail\n    },\n    setModal: (state, value) => {\n      state.isModal = value\n    },\n    // create a mutation to populate ameliaState with data\n    setAmeliaState: (state, payload) => {\n      state.ameliaState = payload\n    },\n    // create a mutation to populate ameliaAllocation with data\n    setAmeliaAllocation: (state, payload) => {\n      state.ameliaAllocation = payload\n      const { experiments = [] } = state.ameliaAllocation\n      for (const experiment of experiments) {\n        console.debug(\n          `forcing allocation \"${experiment.allocation.id}\" for experiment \"${\n            experiment.name\n          }\"`\n        )\n      }\n    },\n    updatePersonalInfo: (state, value) => {\n      state.personalInfo = value\n    },\n    updateLogInQueryParams: (state, payload) => {\n      state.logInQueryParams = payload\n    }\n  },\n  actions: {\n    register: async function(context, params) {\n      const grecaptchaToken = await getGrecaptchaToken('accountregister')\n      const apiConfig = grecaptchaToken\n        ? { credentials: false, headers: { token: grecaptchaToken } }\n        : { credentials: false }\n      return api\n        .postWithConfig('user', params, apiConfig)\n        .then(response => context.commit('createUser', response))\n        .catch(error => context.commit('apiError', error))\n    },\n    socialLogin(context, payload) {\n      const { provider, rememberMe } = payload\n      context.commit('loginMethod', provider)\n      return api\n        .post(`sessions/social/${provider}`, true, { rememberMe })\n        .then(response => {\n          context.commit('authorize', response)\n          Vue.analytics.socialLogin(provider)\n        })\n        .catch(error => context.commit('apiError', error))\n    },\n    socialRegister(context, payload) {\n      const { provider, rememberMe } = payload\n      context.commit('loginMethod', provider)\n      return api\n        .post(`sessions/social/${provider}`, true, { rememberMe })\n        .then(response => {\n          context.commit('authorize', response)\n          Vue.analytics.socialRegisterComplete(provider)\n        })\n        .catch(error => context.commit('apiError', error))\n    },\n    addSocialAccount(context, payload) {\n      context.commit('loginMethod', payload.platform)\n      return api\n        .post('user/social-connections', true, payload)\n        .then(response => {\n          context.commit('authorize', response)\n          Vue.analytics.socialRegisterComplete(payload.platform)\n        })\n        .catch(error => context.commit('apiError', error))\n    },\n    socialSignup(context, payload) {\n      context.commit('loginMethod', payload)\n      return api\n        .post(`user/social/${payload}`, true)\n        .then(response => {\n          context.commit('authorize', response)\n          Vue.analytics.socialRegisterComplete(payload)\n        })\n        .catch(error => context.commit('apiError', error))\n    },\n    signupNewsletter: async function(context, params) {\n      return api\n        .post(`user/newsletters/${params[1]}?email=${params[0]}`)\n        .then(response => context.commit('signupNewsletter', response))\n        .catch(error => context.commit('apiError', error))\n    },\n    validateChangedEmail: (context, params) => {\n      return api.put('user/email', false, params)\n    },\n    resendActivationEmail: async function(context, params) {\n      const grecaptchaToken = await getGrecaptchaToken('resendemail')\n      const apiConfig = grecaptchaToken\n        ? { credentials: false, headers: { token: grecaptchaToken } }\n        : { credentials: false }\n      return api.postWithConfig('user/activation', params, apiConfig)\n    },\n    saveNewPassword: (context, params) => {\n      return api.put('user/password/reset', false, params)\n    },\n    unauthorize({ commit }) {\n      // In-house users switch between environments.\n      // Allow them to remain logged in on other environments.\n      const { ENV_NAME } = window.cpcConfig\n      const sessionEnv = Cookie.get('SESSION_ENV')\n      const envMatch = ENV_NAME === 'PROD' ? true : sessionEnv === ENV_NAME\n      if (envMatch) {\n        commit('loginMethod', '')\n        commit('unauthorize')\n        return session.destroy()\n      }\n    },\n    authorize({ commit }) {\n      commit('authorize')\n    },\n    authenticate({ commit }) {\n      commit('authenticate')\n    },\n    createUser({ commit }) {\n      commit('createUser')\n    },\n    singupNewsletter({ commit }) {\n      commit('singupNewsletter')\n    },\n    setCurrentMember: ({ commit }) => {\n      commit('setCurrentMember')\n    },\n    clearCurrentMember: ({ commit }) => {\n      commit('clearCurrentMember')\n    },\n    recover: async function(context, params) {\n      context.state.sendResetPasswordEmail = params.sendEmail\n\n      if (!params.email) {\n        return\n      }\n      const grecaptchaToken = await getGrecaptchaToken('recoverpassword')\n      const apiConfig = grecaptchaToken\n        ? { credentials: false, headers: { token: grecaptchaToken } }\n        : { credentials: false }\n      return api.postWithConfig('user/password/forgot', params.email, apiConfig)\n    },\n    apiError: (context, error) => {\n      context.commit('clearflashMessage')\n      context.commit('apiError', error)\n    },\n    clearApiError: ({ commit }) => {\n      commit('clearApiError')\n    },\n    flashMessage: (context, message) => {\n      context.commit('clearApiError')\n      context.commit('flashMessage', message)\n    },\n    clearflashMessage: ({ commit }) => {\n      commit('clearflashMessage')\n    },\n    // action which provides allocated experiments to datalayer\n    setAmeliaDatalayer({ state }) {\n      window.tgam = window.tgam || {}\n      window.tgam.datalayer = window.tgam.datalayer || {}\n      const ameliaDatalayer = formatForDatalayer(state.ameliaAllocation)\n      const trackedExperiments = formatForSophi3(state.ameliaAllocation)\n\n      window.tgam.datalayer.ameliaTests = ameliaDatalayer\n      if (!trackedExperiments.length) {\n        console.debug('no sophi \"ab_tests\" event will be dispatched')\n        return\n      }\n\n      Vue.analytics.sendAmeliaEvent(trackedExperiments)\n    },\n    updateAmeliaState(context) {\n      const { experiments = [] } = context.state.ameliaState\n      const experimentsArray = experiments.map(experiment =>\n        context.getters.getAmeliaState(experiment.name)\n      )\n      context.commit('setAmeliaState', { experiments: experimentsArray })\n      context.commit('setAmeliaAllocation', { experiments: experimentsArray })\n      context.dispatch('setAmeliaDatalayer')\n    }\n  }\n}\n\nlet store = new Vuex.Store(options)\nexport { store, options }\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CookieNotification.vue?vue&type=style&index=0&id=7613902a&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CookieNotification.vue?vue&type=style&index=0&id=7613902a&lang=scss&scoped=true&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResendMessage.vue?vue&type=style&index=0&id=4a1f8256&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResendMessage.vue?vue&type=style&index=0&id=4a1f8256&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h5',{staticClass:\"message-heading\"},[_vm._t(\"heading\")],2),_c('div',{staticClass:\"message-div\"},[_c('p',[_vm._t(\"first-para\",[_vm._v(\"\\n        We've sent an email to\\n        \"),_c('span',{staticClass:\"bold-email\"},[_vm._v(_vm._s(_vm.confirmEmail))]),_vm._v(\"\\n        containing instructions to confirm your account.\\n      \")])],2),_c('p',[_vm._t(\"second-para\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <h5 class=\"message-heading\">\n      <slot name=\"heading\"></slot>\n    </h5>\n    <div class=\"message-div\">\n      <p>\n        <slot name=\"first-para\">\n          We've sent an email to\n          <span class=\"bold-email\">{{ confirmEmail }}</span>\n          containing instructions to confirm your account.\n        </slot>\n      </p>\n\n      <p><slot name=\"second-para\"></slot></p>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    confirmEmail: {\n      type: String,\n      required: true,\n      default: ''\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.message-heading {\n  @include text-gmb-3;\n  font-style: normal;\n  color: $color-grey-800;\n  text-align: center;\n  margin-bottom: 16px;\n}\n\n.message-div {\n  @include text-gmr-4;\n  font-style: normal;\n  color: $color-grey-800;\n  text-align: left;\n}\n\n.bold-email {\n  font-weight: bold;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Message.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Message.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Message.vue?vue&type=template&id=501fa4da&scoped=true&\"\nimport script from \"./Message.vue?vue&type=script&lang=js&\"\nexport * from \"./Message.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Message.vue?vue&type=style&index=0&id=501fa4da&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"501fa4da\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"notification\"},[_c('svg',{staticClass:\"notification__icon\",attrs:{\"pointer-events\":\"none\",\"focusable\":\"false\",\"aria-hidden\":\"true\"}},[_c('use',{attrs:{\"xlink:href\":(_vm.imageUrl + \"sprite.svg#icon-report-error\")}})]),_c('div',[_c('p',{staticClass:\"notification__text\",domProps:{\"innerHTML\":_vm._s(_vm.text)}}),_c('tgam-link',{staticClass:\"c-button--grey-secondary c-button--no-border c-button--small\",attrs:{\"href\":\"https://www.theglobeandmail.com/about/help/enable-cookies/\",\"text\":\"How to enable cookies\",\"target\":\"_blank\"}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('a',{staticClass:\"c-button\",attrs:{\"target\":_vm.target,\"href\":_vm.href}},[_c('span',{staticClass:\"c-button__text\"},[_vm._v(_vm._s(_vm.text))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!-- \nThis component is a vue version of the tgam-patterns link \"button\". The styles are meant \nto be overridden by passing  in classes specified in the tgam-patterns library.\nDocumentation: https://ux.theglobeandmail.com/pattern-library/components/buttons/\n-->\n<template>\n  <a :target=\"target\" :href=\"href\" class=\"c-button\">\n    <span class=\"c-button__text\">{{ text }}</span>\n  </a>\n</template>\n\n<script>\nexport default {\n  props: {\n    text: {\n      type: String,\n      default: ''\n    },\n    target: {\n      type: String,\n      required: false,\n      default: ''\n    },\n    href: {\n      type: String,\n      required: false,\n      default: ''\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@/assets/scss/buttons.scss';\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TgamLink.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TgamLink.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TgamLink.vue?vue&type=template&id=1da55747&scoped=true&\"\nimport script from \"./TgamLink.vue?vue&type=script&lang=js&\"\nexport * from \"./TgamLink.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TgamLink.vue?vue&type=style&index=0&id=1da55747&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1da55747\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"notification\">\n    <svg\n      class=\"notification__icon\"\n      pointer-events=\"none\"\n      focusable=\"false\"\n      aria-hidden=\"true\"\n    >\n      <use :xlink:href=\"`${imageUrl}sprite.svg#icon-report-error`\"></use>\n    </svg>\n    <div>\n      <p class=\"notification__text\" v-html=\"text\"></p>\n      <tgam-link\n        href=\"https://www.theglobeandmail.com/about/help/enable-cookies/\"\n        class=\"c-button--grey-secondary c-button--no-border c-button--small\"\n        text=\"How to enable cookies\"\n        target=\"_blank\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\nimport TgamLink from './TgamLink'\n\nexport default {\n  components: {\n    TgamLink\n  },\n  props: {\n    text: {\n      type: String,\n      default: ''\n    }\n  },\n  data() {\n    return {\n      imageUrl: window.cpcConfig.IMAGES_URL\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.notification {\n  display: flex;\n  flex-direction: row;\n  background-color: $color-yellow-300;\n  padding: 1.25rem;\n}\n\n.notification__icon {\n  width: 1.125rem;\n  height: 1.125rem;\n  margin-top: 0.625rem;\n  margin-right: 0.3125rem;\n  color: $color-grey-800;\n}\n.notification__text {\n  padding-top: 0.625rem;\n  @include text-gmr-4;\n  font-style: normal;\n  letter-spacing: 0;\n  color: $color-grey-800;\n\n  ::v-deep a {\n    cursor: pointer;\n    text-decoration: underline;\n    color: $color-grey-800;\n  }\n}\n.c-button--grey-secondary {\n  background-color: $color-grey-700;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CookieNotification.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CookieNotification.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CookieNotification.vue?vue&type=template&id=7613902a&scoped=true&\"\nimport script from \"./CookieNotification.vue?vue&type=script&lang=js&\"\nexport * from \"./CookieNotification.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CookieNotification.vue?vue&type=style&index=0&id=7613902a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7613902a\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.FlashMessage),expression:\"FlashMessage\"}],staticClass:\"container\",attrs:{\"role\":\"alert\"}},[_c('div',{domProps:{\"innerHTML\":_vm._s(_vm.FlashMessage)}}),_c('button',{staticClass:\"btn btn-primary btn-block close_button\",on:{\"click\":function($event){$event.preventDefault();return _vm.clearFlashMessage($event)}}},[_vm._v(\"\\n    OK\\n  \")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <section v-show=\"FlashMessage\" class=\"container\" role=\"alert\">\n    <div v-html=\"FlashMessage\"></div>\n    <button\n      class=\"btn btn-primary btn-block close_button\"\n      @click.prevent=\"clearFlashMessage\"\n    >\n      OK\n    </button>\n  </section>\n</template>\n<script>\nexport default {\n  name: 'FlashMessage',\n  computed: {\n    FlashMessage() {\n      return this.$store.state.flashMessage\n    }\n  },\n  methods: {\n    clearFlashMessage: function() {\n      this.$store.dispatch('clearflashMessage')\n    }\n  }\n}\n</script>\n<style lang=\"scss\" scoped>\nsection {\n  background-color: $color-grey-100;\n  border: 1px solid $color-grey-300;\n  padding: 10px;\n  margin-top: 20px;\n}\n.close_button {\n  width: 100%;\n  margin: 10px auto 10px auto;\n  display: block;\n  background-color: $color-green-800;\n  color: $color-white;\n  border: 0;\n  padding: 13px 20px 12px;\n  @include text-helr-3;\n  cursor: pointer;\n  text-align: center;\n  text-decoration: none;\n}\n.close_button:focus {\n  box-shadow: none;\n  outline-color: $color-focus;\n  outline-style: solid;\n  outline-width: 2px;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FlashMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FlashMessage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FlashMessage.vue?vue&type=template&id=707888e8&scoped=true&\"\nimport script from \"./FlashMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./FlashMessage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FlashMessage.vue?vue&type=style&index=0&id=707888e8&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"707888e8\",\n  null\n  \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoginCognito.vue?vue&type=style&index=0&id=2e11b1d8&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoginCognito.vue?vue&type=style&index=0&id=2e11b1d8&lang=scss&scoped=true&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FlashMessage.vue?vue&type=style&index=0&id=707888e8&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FlashMessage.vue?vue&type=style&index=0&id=707888e8&lang=scss&scoped=true&\"","import Cookie from 'js-cookie'\nimport api from './api'\n\nconst session = {\n  destroy: () => {\n    return api\n      .delete(`sessions/tgam`, true)\n      .then(() => {\n        session.removeCookie()\n      })\n      .catch(() => {\n        session.removeCookie()\n      })\n  },\n  isAuthenticated: () => {\n    // In-house users switch between environments.\n    // Return authentication status for current environment only.\n    const { ENV_NAME } = window.cpcConfig\n    const sessionEnv = Cookie.get('SESSION_ENV')\n    const envMatch = sessionEnv === ENV_NAME\n    return Cookie.get('SESSION') !== undefined && envMatch\n  },\n  removeCookie: () => {\n    Cookie.remove('SESSION', { domain: window.cpcConfig.COOKIE_DOMAIN })\n  }\n}\n\nexport default session\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[(_vm.showHeader)?_c('global-header'):_vm._e(),_c('router-view',{class:[_vm.isModal ? 'modalView' : 'defaultView']}),(_vm.showHeader)?_c('global-footer'):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"header\"}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div id=\"header\"></div>\n</template>\n\n<script>\nimport throttle from 'lodash/throttle'\nimport Cookie from 'js-cookie'\n\nexport default {\n  name: 'GlobalHeader',\n  data() {\n    return {\n      header: null,\n      headerHiding: 'c-site-header--section--hiding',\n      headerHidden: 'c-site-header--section--hidden',\n      headerRevealing: 'c-site-header--section--revealing',\n      headerRevealed: 'c-site-header--section--revealed',\n      previousScrollPos: 0,\n      tgamHostUrl: `${window.cpcConfig.TGAM_LINKS_HOST}?login=true`\n    }\n  },\n  mounted() {\n    window\n      .fetch(\n        `${\n          window.cpcConfig.TGAM_LINKS_HOST\n        }files/dev/www/cache-long/arc-subs-team/static/account-header.html`\n      )\n      .then(response => {\n        return response.text()\n      })\n      .then(html => {\n        const header = document.getElementById('header')\n        const headerHtml = html.replace('<!DOCTYPE html>', '') // Remove an unneeded doctype tag\n        header.innerHTML = headerHtml\n        this.header = document.querySelector('.c-site-header')\n        const logoLink = document.querySelector('.c-site-header__logo-link')\n        logoLink.setAttribute('href', this.tgamHostUrl)\n        logoLink.setAttribute(\n          'data-analyticsclick',\n          '{\"type\":\"link\",\"feature\":\"header\",\"label\":\"the globe and mail logo\",\"position\":1,\"hierarchy\":1}'\n        )\n\n        const ketchEnabled = window.cpcConfig.KETCH_ENABLED\n        const ketchAllowedRegions = window.cpcConfig.KETCH_ALLOWED_REGIONS\n        // Akamai country-region, e.g. `CA-ON`\n        const ak_user = Cookie.get('ak_user')\n          ? JSON.parse(Cookie.get('ak_user'))\n          : ''\n        const akamaiRegion = `${ak_user.country_code}-${ak_user.region_code}`\n        // Ketch country-region, e.g. `CA-QC`\n        const urlParams = new URLSearchParams(\n          window.location.href.split('?')[1]\n        )\n        const ketchRegion = urlParams.get('ketch_region')\n        // Use region override param set if set, otherwise determine regions using Akamai cookie.\n        const userRegion = ketchRegion || akamaiRegion || ''\n\n        const noAdChoicesDisplay =\n          ketchEnabled && ketchAllowedRegions.includes(userRegion)\n\n        if (noAdChoicesDisplay) {\n          document.querySelector('.c-site-header__adchoices').remove()\n        }\n\n        this.init()\n      })\n      .catch(err => {\n        console.log('Header error: ', err)\n      })\n  },\n  methods: {\n    init() {\n      this.header.addEventListener('animationend', this.onHeaderAnimationEnd)\n      this.attachScrollHandler()\n    },\n    attachScrollHandler() {\n      window.addEventListener('scroll', throttle(this.onPageScroll, 200))\n    },\n    onPageScroll() {\n      const scrollPos = window.scrollY || window.pageYOffset\n      if (scrollPos > 100) {\n        // Arbitrarily-chosen number\n        if (scrollPos >= this.previousScrollPos) {\n          // Scrolling down\n          this.hideHeader()\n        } else {\n          // Scrolling up\n          this.revealHeader()\n        }\n      } else {\n        this.revealHeader()\n      }\n      this.previousScrollPos = scrollPos\n    },\n    hideHeader() {\n      if (\n        !this.header.classList.contains(this.headerHiding) &&\n        !this.header.classList.contains(this.headerHidden)\n      ) {\n        // IE11 doesn't support supplying multiple arguments\n        // to remove(), so we have to list them out individually\n        this.header.classList.remove(this.headerRevealed)\n        this.header.classList.remove(this.headerRevealing)\n        this.header.classList.add(this.headerHiding)\n      }\n    },\n    revealHeader() {\n      if (\n        !this.header.classList.contains(this.headerRevealing) &&\n        !this.header.classList.contains(this.headerRevealed)\n      ) {\n        this.header.classList.remove(this.headerHidden)\n        this.header.classList.remove(this.headerHiding)\n        this.header.classList.add(this.headerRevealing)\n      }\n    },\n    onHeaderAnimationEnd() {\n      if (this.header.classList.contains(this.headerHiding)) {\n        this.header.classList.remove(this.headerHiding)\n        this.header.classList.add(this.headerHidden)\n      } else if (this.header.classList.contains(this.headerRevealing)) {\n        this.header.classList.remove(this.headerRevealing)\n        this.header.classList.add(this.headerRevealed)\n      }\n    }\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalHeader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalHeader.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GlobalHeader.vue?vue&type=template&id=b325c862&\"\nimport script from \"./GlobalHeader.vue?vue&type=script&lang=js&\"\nexport * from \"./GlobalHeader.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mt-auto\"},[_c('recaptcha-text'),_vm._m(0)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"u-wrapper\",attrs:{\"data-fn\":\"global-footer\"}},[_c('div',{attrs:{\"id\":\"footer\"}})])}]\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{staticClass:\"recaptcha-text d-flex justify-content-center px-3 text-center\"},[_c('div',[_vm._v(\"\\n    This site is protected by reCAPTCHA and the\\n    \"),_c('a',{attrs:{\"href\":\"https://policies.google.com/privacy\"}},[_vm._v(\"Google Privacy Policy\")]),_vm._v(\"\\n    and\\n    \"),_c('a',{attrs:{\"href\":\"https://policies.google.com/terms\"}},[_vm._v(\"Terms of Service\")]),_vm._v(\"\\n    apply.\\n  \")])])}]\n\nexport { render, staticRenderFns }","<template>\n  <aside class=\"recaptcha-text d-flex justify-content-center px-3 text-center\">\n    <div>\n      This site is protected by reCAPTCHA and the\n      <a href=\"https://policies.google.com/privacy\">Google Privacy Policy</a>\n      and\n      <a href=\"https://policies.google.com/terms\">Terms of Service</a>\n      apply.\n    </div>\n  </aside>\n</template>\n\n<script>\nexport default {\n  name: 'RecaptchaText'\n}\n</script>\n<style lang=\"scss\" scoped>\n.recaptcha-text {\n  color: $color-grey-600;\n  margin-bottom: 1.5rem;\n  @include text-gmr-5;\n  text-transform: none;\n  letter-spacing: 0;\n\n  a {\n    color: $color-grey-600;\n    text-decoration: underline;\n  }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecaptchaText.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecaptchaText.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RecaptchaText.vue?vue&type=template&id=5a948e63&scoped=true&\"\nimport script from \"./RecaptchaText.vue?vue&type=script&lang=js&\"\nexport * from \"./RecaptchaText.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RecaptchaText.vue?vue&type=style&index=0&id=5a948e63&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5a948e63\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"mt-auto\">\n    <recaptcha-text />\n    <div class=\"u-wrapper\" data-fn=\"global-footer\">\n      <div id=\"footer\"></div>\n    </div>\n  </div>\n</template>\n<script>\nimport RecaptchaText from '@/components/RecaptchaText'\n\nexport default {\n  name: 'GlobalFooter',\n  components: {\n    RecaptchaText\n  },\n  mounted() {\n    window\n      .fetch(`${window.cpcConfig.TGAM_LINKS_HOST}static/short-footer/`)\n      .then(response => {\n        return response.text()\n      })\n      .then(html => {\n        const footer = document.getElementById('footer')\n        const footerHtml = html.replace('<!DOCTYPE html>', '') // Remove an unneeded doctype tag\n        footer.innerHTML = footerHtml\n        footer.querySelector('svg').remove()\n      })\n      .catch(err => {\n        console.log('Footer error: ', err)\n      })\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalFooter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalFooter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GlobalFooter.vue?vue&type=template&id=3fef992b&\"\nimport script from \"./GlobalFooter.vue?vue&type=script&lang=js&\"\nexport * from \"./GlobalFooter.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div id=\"app\">\n    <global-header v-if=\"showHeader\"></global-header>\n    <router-view :class=\"[isModal ? 'modalView' : 'defaultView']\"></router-view>\n    <global-footer v-if=\"showHeader\"></global-footer>\n  </div>\n</template>\n\n<script>\nimport 'svgxuse'\nimport 'bootstrap/dist/css/bootstrap.min.css'\nimport GlobalHeader from './components/GlobalHeader'\nimport GlobalFooter from './components/GlobalFooter'\n\nexport default {\n  name: 'App',\n  components: {\n    GlobalHeader,\n    GlobalFooter\n  },\n  computed: {\n    isModal() {\n      return this.$store.state.isModal\n    },\n    isSocialPopup() {\n      return this.$route.path === '/social-success'\n    },\n    showHeader() {\n      return !this.isModal && !this.isSocialPopup\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\">\n@charset \"UTF-8\";\n\n@import '~tgam-patterns/patterns/stylesheets/mixins/bundle';\n\n@import '~tgam-patterns/patterns/stylesheets/generic.vendor.normalize';\n@import '~tgam-patterns/patterns/stylesheets/generic.box-sizing';\n@import '~tgam-patterns/patterns/stylesheets/generic.font-names';\n\n@import '~tgam-patterns/patterns/stylesheets/base.page';\n@import '~tgam-patterns/patterns/stylesheets/base.focus';\n\n@import '~tgam-patterns/patterns/stylesheets/objects.footer-tiers';\n\n@import '~tgam-patterns/patterns/stylesheets/components.accordion';\n@import '~tgam-patterns/patterns/stylesheets/components.scroll-menu';\n@import '~tgam-patterns/patterns/stylesheets/components.menu-panel';\n@import '~tgam-patterns/patterns/stylesheets/components.site-header';\n@import '~tgam-patterns/patterns/stylesheets/components.site-header--section';\n@import '~tgam-patterns/patterns/stylesheets/components.skip-link';\n@import '~tgam-patterns/patterns/stylesheets/components.app-downloads';\n@import '~tgam-patterns/patterns/stylesheets/components.social-sharetool';\n@import '~tgam-patterns/patterns/stylesheets/components.column-lists';\n@import '~tgam-patterns/patterns/stylesheets/components.footer';\n@import '~tgam-patterns/patterns/stylesheets/components.spinner';\n@import '~tgam-patterns/patterns/stylesheets/components.text-resizer';\n\n@import '~tgam-patterns/patterns/stylesheets/trumps.bleed';\n@import '~tgam-patterns/patterns/stylesheets/trumps.clearfix';\n@import '~tgam-patterns/patterns/stylesheets/trumps.hidden';\n@import '~tgam-patterns/patterns/stylesheets/trumps.no-scroll';\n@import '~tgam-patterns/patterns/stylesheets/trumps.no-wrap';\n@import '~tgam-patterns/patterns/stylesheets/trumps.roofless';\n@import '~tgam-patterns/patterns/stylesheets/trumps.spaces';\n@import '~tgam-patterns/patterns/stylesheets/trumps.truncated';\n@import '~tgam-patterns/patterns/stylesheets/trumps.visually-hidden';\n\n@import '~@tgam/design-tokens/output/styles/colors.scss';\n\n@font-face {\n  font-family: Pratt-Bold;\n  src: url(./assets/fonts/Pratt-Bold.woff2) format('woff2');\n}\n@font-face {\n  font-family: Pratt;\n  src: url(./assets/fonts/Pratt.woff2) format('woff2');\n}\n@font-face {\n  font-family: Pratt-Italic;\n  src: url(./assets/fonts/Pratt-Italic.woff2) format('woff2');\n}\n@font-face {\n  font-family: GMsans-Web-Regular;\n  src: url(./assets/fonts/GMsans-Web-Regular.woff2) format('woff2');\n}\n@font-face {\n  font-family: GMsans-Web-Bold;\n  src: url(./assets/fonts/GMsans-Web-Bold.woff2) format('woff2');\n}\n@font-face {\n  font-family: GMsans-Web-Label;\n  src: url(./assets/fonts/GMsans-Web-Label.woff2) format('woff2');\n}\n\n/* Ketch styles */\n#lanyard_root {\n  * {\n    font-family: GMsans-Web-Regular, Helvetica, Arial, Verdana, sans-serif;\n  }\n\n  h2,\n  h3,\n  #banner-title {\n    font-family: GMsans-Web-Bold, Helvetica, Arial, Verdana, sans-serif;\n  }\n}\n\nhtml,\nbody {\n  height: 100%;\n}\n\n#app {\n  display: flex;\n  flex-direction: column;\n  min-height: 100%;\n}\n\nbody {\n  @include text-gmr-4;\n  color: $color-grey-800;\n  a:hover {\n    color: inherit;\n  }\n  .global-footer a:hover {\n    color: $color-white;\n  }\n  background-color: $color-white;\n}\n\ninput::-webkit-input-placeholder {\n  @include text-pr-8;\n  font-size: 14px;\n  color: $color-grey-800 !important;\n}\n\nselect::-webkit-input-placeholder {\n  @include text-pr-8;\n  font-size: 14px;\n  color: $color-grey-800 !important;\n}\n.modalView {\n  width: 100%;\n}\n.defaultView {\n  margin-top: 1.5rem;\n  margin-bottom: 0.5rem;\n}\n\n@include grid-breakpoint-down(xs) {\n  .defaultView {\n    margin-top: 0px;\n  }\n}\n\n/** This sets the template container to 75% width when screen(browser or devices) is from 450px to 576px **/\n@media only screen and (min-width: 450px) and (max-width: 576px) {\n  .col-tgam-mobile {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-tgam-mobile.tgam-modal {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n}\n\n.redLink {\n  color: $color-red-600;\n}\n.grecaptcha-badge {\n  visibility: hidden;\n}\n\nh1 {\n  @include text-pr-3;\n  text-align: center;\n  margin-top: 0.5rem;\n  margin-bottom: 1rem;\n}\n</style>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=7832e3d0&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (\n    _vm.isValidateEmailToken &&\n      (_vm.isActivationSourceIos || _vm.isActivationSourceAndroid)\n  )?_c('loading-spinner',[_vm._v(\"\\n  Confirming your email...\\n\")]):(_vm.isLogInTypeSiwg)?_c('loading-spinner',[_vm._v(\"\\n  Logging you in...\\n\")]):_c('div',{staticClass:\"login container mx-auto\",class:[\n    !_vm.isCookieEnabled ? 'login--cookie-disabled' : '',\n    _vm.isModal ? 'login--modal' : '',\n    _vm.displayHomeDeliveryMessaging ? 'home-delivery' : '',\n    _vm.cem3190IsExp ? (\"cem3190 \" + _vm.cem3190Variant) : ''\n  ],attrs:{\"role\":\"main\"}},[(_vm.displayHomeDeliveryMessaging)?_c('div',{staticClass:\"row home-delivery__header\"},[_c('div',{staticClass:\"col-12\"},[_c('h2',[_vm._v(\"Log in Options\")]),_c('p',[_vm._v(\"\\n        You need to be a subscriber and have an online account to manage your\\n        subscription.\\n      \")]),_c('p',[_vm._v(\"\\n        Have a corporate subscription? Contact your account administrator.\\n      \")])])]):_vm._e(),_c('div',{staticClass:\"row d-flex home-delivery__container\"},[(_vm.displayHomeDeliveryMessaging)?_c('div',{staticClass:\"col-12 col-md-6 order-sm-2 home-delivery__options\"},[_c('div',{staticClass:\"home-delivery__item\"},[_c('h2',[_vm._v(\"I’m a print subscriber\")]),_c('p',[_vm._v(\"Link my online account to manage my subscription.\")]),_c('a',{attrs:{\"href\":_vm.findMyPrintUrl}},[_vm._v(\"Get Started\")])]),_c('div',{staticClass:\"home-delivery__item home-delivery__item--header-only\"},[_c('h2',[_vm._v(\"\\n          Explore my subscription options.\\n        \")]),_c('a',{attrs:{\"href\":_vm.subscriptionUrl}},[_vm._v(\"Explore\")])])]):_vm._e(),_c('div',{staticClass:\"col-12 mx-auto login__form-container\",class:{ 'col-md-6': _vm.displayHomeDeliveryMessaging }},[_c('validation-observer',{ref:\"loginValidator\"},[_c('form',{staticClass:\"login__form\"},[_c('confirm-message',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.requireEmailConfirmation),expression:\"requireEmailConfirmation\"}],attrs:{\"isModal\":_vm.isModal}}),_c('flash-message'),_c('div',{staticClass:\"text-center\"},[(_vm.isLimio)?_c('div',{staticClass:\"d-block m-auto\",class:[\n                _vm.limioSubscriptionType === 'digital' || _vm.isLimioClient\n                  ? 'limio-heading'\n                  : ''\n              ]},[_c('h1',{staticClass:\"h1_login\",class:[\n                  _vm.limioSubscriptionType === 'digital'\n                    ? 'text-left'\n                    : 'd-md-block'\n                ]},[_vm._v(\"\\n                \"+_vm._s(_vm.logInHeading)+\"\\n              \")]),(_vm.limioSubscriptionType === 'digital' || _vm.isLimioClient)?_c('h5',{staticClass:\"text-left\"},[_vm._v(\"\\n                Step 1 of 2\\n              \")]):_vm._e()]):_c('h1',{staticClass:\"h1_login\"},[_vm._v(\"\\n              \"+_vm._s(_vm.logInHeading)+\"\\n            \")]),_c('div',{staticClass:\"login_account\",class:[\n                _vm.limioSubscriptionType === 'digital'\n                  ? 'limio text-left m-auto'\n                  : ''\n              ]},[_c('label',[_vm._v(\"Don't have an account?\")]),_c('router-link',{staticClass:\"register\",attrs:{\"to\":_vm.pathToRegisterPage}},[_c('span',[_vm._v(\"Create one\")])])],1),(_vm.resendValidateEmail)?_c('resend-message',{attrs:{\"clearErrors\":_vm.$refs.loginValidator.reset,\"isModal\":_vm.isModal,\"errorMessage\":_vm.apiErrorMessage,\"isSendConfirmationEmail\":_vm.isSendConfirmationEmail}}):_vm._e()],1),_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.apiErrorMessage),expression:\"apiErrorMessage\"}],staticClass:\"background-danger text-center\",attrs:{\"role\":\"alert\"},domProps:{\"innerHTML\":_vm._s(_vm.apiErrorMessage)}},[_vm._v(\"\\n            \"+_vm._s(_vm.apiErrorMessage)+\"\\n          \")]),_c('validation-provider',{staticClass:\"email-address\",class:{ 'mt-0': _vm.isLimio },attrs:{\"rules\":\"required|email\",\"name\":\"email\",\"tag\":\"div\"},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\n              var errors = ref.errors;\n              var invalid = ref.invalid;\n              var touched = ref.touched;\nreturn [_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"input-label\"},[_vm._v(\"Email address\")]),_c('div',{staticClass:\"input-group input-rowcol\",class:{ 'has-danger': invalid && touched }},[(_vm.cem3190IsExp)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.email),expression:\"email\"}],ref:\"emailRef\",staticClass:\"form-control\",attrs:{\"id\":\"inputEmail\",\"type\":\"email\",\"aria-label\":\"email\",\"placeholder\":\"Email\"},domProps:{\"value\":(_vm.email)},on:{\"keyup\":_vm.updateEmail,\"input\":function($event){if($event.target.composing){ return; }_vm.email=$event.target.value}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.email),expression:\"email\"}],staticClass:\"form-control\",attrs:{\"id\":\"inputEmail\",\"type\":\"email\",\"aria-label\":\"email\"},domProps:{\"value\":(_vm.email)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.email=$event.target.value}}})]),_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(invalid && touched),expression:\"invalid && touched\"}],staticClass:\"input-error-text flex-nowrap\",attrs:{\"role\":\"alert\"}},[_vm._v(\"\\n                \"+_vm._s(errors[0])+\"\\n              \")])])]}}])}),_c('validation-provider',{attrs:{\"rules\":\"required\",\"name\":\"password\"},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\n              var errors = ref.errors;\n              var invalid = ref.invalid;\n              var touched = ref.touched;\nreturn [_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"input-label\"},[_vm._v(\"Password\")]),_c('div',{staticClass:\"input-group input-rowcol\",class:{ 'has-danger': invalid && touched }},[_c('div',{staticClass:\"form-control input-password-container\"},[(_vm.showPassword)?_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.password),expression:\"password\",modifiers:{\"trim\":true}}],attrs:{\"id\":\"inputPassword\",\"type\":\"text\",\"name\":\"password\",\"aria-label\":\"password\",\"required\":\"\"},domProps:{\"value\":(_vm.password)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.login($event)},\"focus\":_vm.focusInputPasswordContainer,\"focusout\":_vm.focusOutInputPasswordContainer,\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value.trim()},\"blur\":function($event){return _vm.$forceUpdate()}}}):(_vm.cem3190IsExp)?_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.password),expression:\"password\",modifiers:{\"trim\":true}}],attrs:{\"id\":\"inputPassword\",\"type\":\"password\",\"name\":\"password\",\"aria-label\":\"password\",\"placeholder\":\"Password\",\"required\":\"\"},domProps:{\"value\":(_vm.password)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.login($event)},\"focus\":_vm.focusInputPasswordContainer,\"focusout\":_vm.focusOutInputPasswordContainer,\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value.trim()},\"blur\":function($event){return _vm.$forceUpdate()}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.password),expression:\"password\",modifiers:{\"trim\":true}}],attrs:{\"id\":\"inputPassword\",\"type\":\"password\",\"name\":\"password\",\"aria-label\":\"password\",\"required\":\"\"},domProps:{\"value\":(_vm.password)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.login($event)},\"focus\":_vm.focusInputPasswordContainer,\"focusout\":_vm.focusOutInputPasswordContainer,\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value.trim()},\"blur\":function($event){return _vm.$forceUpdate()}}}),_c('div',{staticClass:\"inputRow_icon input-group-addon show-password__container\"},[_c('button',{staticClass:\"show-password__button\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.togglePasswordVisibility($event)}}},[(!_vm.showPassword)?_c('img',{attrs:{\"src\":require(\"@tgam/design-tokens/output/vectors/show.svg\"),\"alt\":\"show password\"}}):_c('img',{attrs:{\"src\":require(\"@tgam/design-tokens/output/vectors/hide.svg\"),\"alt\":\"hide password\"}})])])])]),_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(invalid && touched),expression:\"invalid && touched\"}],staticClass:\"input-error-text flex-nowrap\",attrs:{\"role\":\"alert\"}},[_vm._v(\"\\n                \"+_vm._s(errors[0])+\"\\n              \")]),_c('div',{staticClass:\"forgot-pwd__container\"},[_c('router-link',{staticClass:\"forgot-pwd__link\",attrs:{\"to\":\"\",\"role\":\"link\"},nativeOn:{\"click\":function($event){return _vm.goToRecover($event)}}},[_vm._v(\"\\n                  Forgot password?\\n                \")])],1)])]}}])}),(_vm.cem3190IsExp)?_c('button',{staticClass:\"submit_button\",attrs:{\"aria-label\":\"Log in\",\"disabled\":_vm.isLoading},on:{\"click\":function($event){$event.preventDefault();return _vm.login($event)}}},[_vm._v(\"\\n            Continue\\n            \"),_c('span',{class:[{ 'button-spinner': _vm.isLoading }]})]):_c('button',{staticClass:\"submit_button\",attrs:{\"aria-label\":\"Log in\",\"disabled\":_vm.isLoading},on:{\"click\":function($event){$event.preventDefault();return _vm.login($event)}}},[_vm._v(\"\\n            Log in\\n            \"),_c('span',{class:[{ 'button-spinner': _vm.isLoading }]})]),_c('div',{staticClass:\"text-center bottom-margin\",attrs:{\"id\":\"socialContainer\"}},[_c('div',{staticClass:\"or\"},[_vm._v(\"Or\")]),_c('div',_vm._l((_vm.socialProviders),function(provider){return _c('social-log-in-swg',{key:provider,attrs:{\"socialProvider\":provider,\"rememberMe\":_vm.rememberMe}})}),1)]),_c('base-checkbox',{class:{ 'mt-3': _vm.cem3190IsExp },attrs:{\"isChecked\":_vm.rememberMe,\"inputValue\":\"remember-me\"},on:{\"checkboxChanged\":_vm.updateRememberMeValue}},[_vm._v(\"\\n            Keep me logged in\\n          \")]),_c('a',{staticClass:\"trouble-link\",attrs:{\"href\":\"https://globeandmail.my.site.com/helpcentre/s/contactsupport\",\"target\":\"_blank\"}},[_vm._v(\"\\n            Trouble logging in?\\n          \")])],1)]),(_vm.cem3190IsExp)?_c('div',{staticClass:\"limio-heading d-block mr-auto ml-auto mt-5\"},[_c('h1',{staticClass:\"h1-billing text-left pt-2 mb-4\"},[_vm._v(\"\\n          2. Billing\\n        \")])]):_vm._e()],1)]),(!_vm.isCookieEnabled)?_c('cookie-notification',{staticClass:\"cookie-notification\",attrs:{\"text\":_vm.cookieNotificationText}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"social-btn\",attrs:{\"id\":'Login_' + _vm.provider,\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.login(_vm.provider)}}},[(_vm.provider === 'google')?_c('img',{staticClass:\"logo\",attrs:{\"src\":require(\"@/assets/images/google-logo.svg\"),\"alt\":\"Google logo\",\"aria-hidden\":\"true\"}}):_c('img',{staticClass:\"logo\",attrs:{\"src\":require(\"@/assets/images/apple-logo.svg\"),\"alt\":\"Apple logo\",\"aria-hidden\":\"true\"}}),_c('span',[_vm._v(_vm._s(_vm.labels[_vm.provider]))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <button\n    :id=\"'Login_' + provider\"\n    type=\"button\"\n    class=\"social-btn\"\n    @click.prevent=\"login(provider)\"\n  >\n    <img\n      v-if=\"provider === 'google'\"\n      src=\"@/assets/images/google-logo.svg\"\n      alt=\"Google logo\"\n      aria-hidden=\"true\"\n      class=\"logo\"\n    />\n    <img\n      v-else\n      src=\"@/assets/images/apple-logo.svg\"\n      alt=\"Apple logo\"\n      aria-hidden=\"true\"\n      class=\"logo\"\n    />\n    <span>{{ labels[provider] }}</span>\n  </button>\n</template>\n\n<script>\nimport { getConfig } from '@/utils/cognito'\nimport { serializeUrl } from '@tgam/tgam-cognito'\n\nexport default {\n  name: 'SocialLogInSwg',\n  props: {\n    socialProvider: {\n      type: String,\n      default: ''\n    },\n    rememberMe: {\n      type: Boolean,\n      default: true\n    }\n  },\n  data() {\n    return {\n      labels: {\n        google: 'continue with google',\n        signInWithApple: 'continue with apple'\n      },\n      provider: this.socialProvider\n    }\n  },\n  computed: {\n    // TODO: Remove after FB testing completes\n    isFBTesting() {\n      const fbTest = this.$route.query.fbtest === 'true'\n      return fbTest\n    }\n  },\n  methods: {\n    login: function() {\n      const identityProvider =\n        this.provider[0].toUpperCase() + this.provider.substring(1)\n      const generatedUrl = serializeUrl(\n        getConfig(),\n        this.$route.query,\n        identityProvider,\n        this.rememberMe,\n        `login_${this.provider}`\n      )\n      window.parent.location = `${\n        window.cpcConfig.COGNITO_AUTHORIZE_BASE_URL\n      }?${generatedUrl}`\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.social-btn {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  height: 44px;\n  border: 0.063rem solid $color-grey-700;\n  border-radius: 2px;\n  background: $color-white;\n  @include text-gml-2;\n  color: $color-grey-700;\n  text-align: center;\n  margin: 8px auto 16px;\n  cursor: pointer;\n}\n.social-btn:focus {\n  outline-color: $color-focus;\n  outline-style: solid;\n  outline-width: 2px;\n}\n.logo {\n  margin-right: 14px;\n  width: 19.5px;\n  height: 19.5px;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SocialLogInSwg.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SocialLogInSwg.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SocialLogInSwg.vue?vue&type=template&id=5c865bc6&scoped=true&\"\nimport script from \"./SocialLogInSwg.vue?vue&type=script&lang=js&\"\nexport * from \"./SocialLogInSwg.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SocialLogInSwg.vue?vue&type=style&index=0&id=5c865bc6&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5c865bc6\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"sectionarea\",attrs:{\"role\":\"alert\"}},[_c('div',[_vm._m(0),_c('div',{staticClass:\"check-your-email\"},[_vm._v(\"\\n      Please check your email\\n    \")]),_c('div',{staticClass:\"social-text\"},[_vm._v(\"\\n      We've sent an email to\\n      \"),_c('span',{staticClass:\"user-email\"},[_vm._v(_vm._s(_vm.confirmEmail))]),_vm._v(\"\\n      containing a URL you'll need to follow to verify your account. You\\n      should receive the email within the next few minutes.\\n      \"),_c('br'),_c('br'),_vm._v(\"\\n      Please note Your Globe and Mail account will expire after 30 days if not\\n      validated as described in the email.\\n    \")])]),(_vm.confirmEmail && !_vm.isModal)?_c('button',{staticClass:\"close_button\",on:{\"click\":function($event){$event.preventDefault();return _vm.clearEmailConfirmation($event)}}},[_vm._v(\"\\n    Close\\n  \")]):_vm._e()])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"text-center\"},[_c('h2',{staticClass:\"confirm-email-title\"},[_vm._v(\"Thank You!\")])])}]\n\nexport { render, staticRenderFns }","<template>\n  <section class=\"sectionarea\" role=\"alert\">\n    <div>\n      <div class=\"text-center\">\n        <h2 class=\"confirm-email-title\">Thank You!</h2>\n      </div>\n      <div class=\"check-your-email\">\n        Please check your email\n      </div>\n      <div class=\"social-text\">\n        We've sent an email to\n        <span class=\"user-email\">{{ confirmEmail }}</span>\n        containing a URL you'll need to follow to verify your account. You\n        should receive the email within the next few minutes.\n        <br />\n        <br />\n        Please note Your Globe and Mail account will expire after 30 days if not\n        validated as described in the email.\n      </div>\n    </div>\n    <button\n      v-if=\"confirmEmail && !isModal\"\n      class=\"close_button\"\n      @click.prevent=\"clearEmailConfirmation\"\n    >\n      Close\n    </button>\n  </section>\n</template>\n<script>\nexport default {\n  name: 'ConfirmMessage',\n  props: {\n    isModal: {\n      type: Boolean,\n      default: false\n    }\n  },\n  computed: {\n    confirmEmail() {\n      return this.$store.state.confirmationEmail\n    }\n  },\n  methods: {\n    clearEmailConfirmation: function() {\n      this.$store.commit('clearEmailConfirmation')\n    }\n  }\n}\n</script>\n<style lang=\"scss\" scoped>\n.sectionarea {\n  background-color: $color-grey-100;\n  padding: 10px;\n  margin-top: 20px;\n}\n.confirm-email-title {\n  margin-top: 10px;\n  color: $color-green-800;\n  @include text-gmb-1;\n  text-align: center;\n  border-bottom: 1px solid $color-grey-100;\n  padding-bottom: 5px;\n  display: block;\n}\n.user-email {\n  font-style: italic;\n  font-weight: bold;\n}\n.close_button {\n  width: 100%;\n  margin: 10px auto 10px auto;\n  display: block;\n  background-color: $color-green-800;\n  color: $color-white;\n  border: 0;\n  padding: 13px 20px 12px;\n  @include text-helr-3;\n  cursor: pointer;\n  text-align: center;\n  text-decoration: none;\n}\n.close_button:focus {\n  outline-color: $color-focus;\n  outline-style: solid;\n  outline-width: 2px;\n}\n.check-your-email {\n  text-align: center;\n  @include text-gmb-5;\n  margin-bottom: 0.5rem;\n}\n.social-text {\n  @include text-gmr-5;\n  text-transform: none;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmMessage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConfirmMessage.vue?vue&type=template&id=1b7adc24&scoped=true&\"\nimport script from \"./ConfirmMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfirmMessage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfirmMessage.vue?vue&type=style&index=0&id=1b7adc24&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1b7adc24\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"sectionarea\",attrs:{\"role\":\"alert\"}},[(!_vm.isModal || _vm.errorMessage)?_c('span',{on:{\"click\":_vm.clearEmailConfirmation}},[_c('img',{staticClass:\"close-button\",attrs:{\"src\":require(\"@/assets/images/close-x.png\"),\"alt\":\"close button\"}})]):_vm._e(),(_vm.resendEmail)?_c('div',{staticClass:\"resend-email-div\"},[_c('message',{attrs:{\"confirmEmail\":_vm.confirmEmail},scopedSlots:_vm._u([{key:\"heading\",fn:function(){return [_vm._v(\"\\n        Check your inbox\\n      \")]},proxy:true},(!_vm.errorMessage)?{key:\"first-para\",fn:function(){return [_vm._v(\"\\n        To finish logging in, use the link sent to\\n        \"),_c('span',[_c('strong',[_vm._v(_vm._s(_vm.confirmEmail))])]),_vm._v(\"\\n        containing instructions to confirm your account.\\n      \")]},proxy:true}:null,(!_vm.errorMessage)?{key:\"second-para\",fn:function(){return [_vm._v(\"\\n        Can’t find it? Check your junk folder or click below to resend it.\\n      \")]},proxy:true}:null],null,true)}),(!_vm.errorMessage)?_c('button',{staticClass:\"resend_button\",on:{\"click\":function($event){$event.preventDefault();return _vm.resendActivationEmail($event)}}},[_vm._v(\"\\n      Resend email confirmation\\n    \")]):_vm._e(),(_vm.errorMessage)?_c('div',{staticClass:\"social-text\"},[_vm._v(\"\\n      \"+_vm._s(_vm.errorMessage)+\"\\n    \")]):_vm._e()],1):_vm._e(),(!_vm.resendEmail)?_c('div',{staticClass:\"resend-email-div\"},[_c('message',{attrs:{\"confirmEmail\":_vm.confirmEmail},scopedSlots:_vm._u([{key:\"heading\",fn:function(){return [_vm._v(\"\\n        Check your email\\n      \")]},proxy:true},{key:\"first-para\",fn:function(){return undefined},proxy:true}],null,false,319299163)})],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <section class=\"sectionarea\" role=\"alert\">\n    <span v-if=\"!isModal || errorMessage\" @click=\"clearEmailConfirmation\">\n      <img\n        src=\"@/assets/images/close-x.png\"\n        alt=\"close button\"\n        class=\"close-button\"\n      />\n    </span>\n    <div v-if=\"resendEmail\" class=\"resend-email-div\">\n      <message :confirmEmail=\"confirmEmail\">\n        <template #heading>\n          Check your inbox\n        </template>\n        <template v-if=\"!errorMessage\" #first-para>\n          To finish logging in, use the link sent to\n          <span>\n            <strong>{{ confirmEmail }}</strong>\n          </span>\n          containing instructions to confirm your account.\n        </template>\n        <template v-if=\"!errorMessage\" #second-para>\n          Can’t find it? Check your junk folder or click below to resend it.\n        </template>\n      </message>\n\n      <button\n        v-if=\"!errorMessage\"\n        class=\"resend_button\"\n        @click.prevent=\"resendActivationEmail\"\n      >\n        Resend email confirmation\n      </button>\n      <div v-if=\"errorMessage\" class=\"social-text\">\n        {{ errorMessage }}\n      </div>\n    </div>\n    <div v-if=\"!resendEmail\" class=\"resend-email-div\">\n      <message :confirmEmail=\"confirmEmail\">\n        <template #heading>\n          Check your email\n        </template>\n        <template #first-para></template>\n      </message>\n    </div>\n  </section>\n</template>\n<script>\nimport { LoginMessages } from '../utils/messages'\nimport Message from './Message'\n\nexport default {\n  name: 'ResendEmailMessage',\n  components: { Message },\n  props: {\n    isModal: {\n      type: Boolean,\n      default: false\n    },\n    clearErrors: {\n      type: Function,\n      default: () => {}\n    },\n    errorMessage: {\n      type: String,\n      required: true\n    },\n    isSendConfirmationEmail: {\n      type: Boolean,\n      required: false\n    }\n  },\n  data() {\n    return {\n      resendEmail: true,\n      confirmEmail: this.$store.state.confirmationEmail\n    }\n  },\n  mounted() {\n    this.sentConfirmationEmail()\n  },\n  methods: {\n    sentConfirmationEmail() {\n      if (!this.isSendConfirmationEmail) {\n        this.resendEmail = false\n      }\n    },\n    resendActivationEmail: function() {\n      this.clearErrors()\n      this.$store\n        .dispatch('resendActivationEmail', this.confirmEmail)\n        .then(() => {\n          this.resendEmail = false\n        })\n        .catch(e => {\n          if (e.body.error === 'ALREADY_EXISTS') {\n            this.$store.dispatch('apiError', LoginMessages.ALREADY_EXISTS)\n            return\n          }\n          this.$store.dispatch('apiError', LoginMessages.GENERIC_ERROR)\n        })\n    },\n    clearEmailConfirmation: function() {\n      this.$store.commit('resendValidateEmail', {\n        email: '',\n        resendEmail: false\n      })\n    }\n  }\n}\n</script>\n<style lang=\"scss\" scoped>\n.sectionarea {\n  background-color: $color-grey-100;\n  padding: 12px;\n  margin-bottom: 40px;\n\n  .resend-email-div {\n    padding: 12px;\n    margin-right: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .sectionarea {\n    margin-top: 20px;\n  }\n}\n\n.resend_button {\n  width: 70%;\n  @include text-gml-3;\n  font-style: normal;\n  color: $color-white;\n  background-color: $color-grey-700;\n  letter-spacing: 0;\n  text-align: center;\n  margin: 20px auto 8px auto;\n  padding: 13px 20px 12px;\n  display: block;\n  border: 0;\n  cursor: pointer;\n}\n.resend_button:focus {\n  outline-color: $color-focus;\n  outline-style: solid;\n  outline-width: 2px;\n}\n\n.close-button {\n  width: 16px;\n  height: 16px;\n  float: right;\n  cursor: pointer;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResendMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResendMessage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ResendMessage.vue?vue&type=template&id=4a1f8256&scoped=true&\"\nimport script from \"./ResendMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./ResendMessage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ResendMessage.vue?vue&type=style&index=0&id=4a1f8256&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"4a1f8256\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"loading-possition\",class:{ swg: _vm.isLogInTypeSiwg }},[_c('div',{staticClass:\"c-spinner c-spinner-color c-spinner-size\"}),_c('p',{staticClass:\"loading-message\"},[_vm._t(\"default\")],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"loading-possition\" :class=\"{ swg: isLogInTypeSiwg }\">\n    <div class=\"c-spinner c-spinner-color c-spinner-size\"></div>\n    <p class=\"loading-message\"><slot></slot></p>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'LoadingSpinner',\n  data() {\n    return {\n      isLogInTypeSiwg: this.$route.query.loginType\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.loading-message {\n  @include text-gmr-1;\n  font-style: normal;\n  text-align: center;\n  margin-top: 16px;\n}\n.loading-possition {\n  margin-top: 252px;\n  @media (min-width: 320px) and (max-width: 902px) {\n    margin-top: 176px;\n  }\n}\n.swg {\n  margin-top: 150px;\n}\n.c-spinner {\n  margin: 0 auto;\n  font-size: 10px;\n  position: relative;\n  border: 1rem solid transparent;\n  transform: translateZ(0);\n  animation: c-spinner-animate-rotate 1.1s infinite linear;\n}\n.c-spinner-color {\n  border-top-color: $color-grey-200;\n  border-right-color: $color-grey-200;\n  border-bottom-color: $color-grey-200;\n  border-left-color: $color-red-500;\n}\n.c-spinner-size,\n.c-spinner-lg::after {\n  border-radius: 50%;\n  border-width: 0.8125rem;\n  width: 8rem;\n  height: 8rem;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingSpinner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingSpinner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LoadingSpinner.vue?vue&type=template&id=538d3849&scoped=true&\"\nimport script from \"./LoadingSpinner.vue?vue&type=script&lang=js&\"\nexport * from \"./LoadingSpinner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LoadingSpinner.vue?vue&type=style&index=0&id=538d3849&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"538d3849\",\n  null\n  \n)\n\nexport default component.exports","import Cookie from 'js-cookie'\n\nexport default function redirectToAfterLoginGoTo() {\n  // get afterRegOrSubGoTo cookie value\n  const afterRegOrSubGoTo = Cookie.get('afterRegOrSubGoTo')\n  let afterLoginGoTo = Cookie.get('afterLoginGoTo')\n\n  if (afterRegOrSubGoTo) {\n    // delete afterRegOrSubGoTo cookie\n    Cookie.remove('afterRegOrSubGoTo', {\n      domain: window.cpcConfig.COOKIE_DOMAIN\n    })\n    Cookie.set('afterLoginGoTo', afterRegOrSubGoTo, {\n      expires: 7,\n      domain: '.theglobeandmail.com'\n    })\n  } else if (afterLoginGoTo.includes(window.cpcConfig.TGAM_LINKS_HOST)) {\n    if (!afterLoginGoTo.includes('#')) {\n      afterLoginGoTo += !afterLoginGoTo.includes('?')\n        ? '?login=true'\n        : !afterLoginGoTo.includes('login=true')\n        ? '&login=true'\n        : ''\n    } else {\n      const [part1, part2] = afterLoginGoTo.split('#')\n      afterLoginGoTo = !afterLoginGoTo.includes('?')\n        ? `${part1}?login=true#${part2}`\n        : !afterLoginGoTo.includes('login=true')\n        ? `${part1}&login=true#${part2}`\n        : afterLoginGoTo\n    }\n  }\n  window.location.replace(afterLoginGoTo)\n}\n","<template>\n  <loading-spinner\n    v-if=\"\n      isValidateEmailToken &&\n        (isActivationSourceIos || isActivationSourceAndroid)\n    \"\n  >\n    Confirming your email...\n  </loading-spinner>\n  <loading-spinner v-else-if=\"isLogInTypeSiwg\">\n    Logging you in...\n  </loading-spinner>\n  <div\n    v-else\n    class=\"login container mx-auto\"\n    :class=\"[\n      !isCookieEnabled ? 'login--cookie-disabled' : '',\n      isModal ? 'login--modal' : '',\n      displayHomeDeliveryMessaging ? 'home-delivery' : '',\n      cem3190IsExp ? `cem3190 ${cem3190Variant}` : ''\n    ]\"\n    role=\"main\"\n  >\n    <div v-if=\"displayHomeDeliveryMessaging\" class=\"row home-delivery__header\">\n      <div class=\"col-12\">\n        <h2>Log in Options</h2>\n        <p>\n          You need to be a subscriber and have an online account to manage your\n          subscription.\n        </p>\n        <p>\n          Have a corporate subscription? Contact your account administrator.\n        </p>\n      </div>\n    </div>\n\n    <div class=\"row d-flex home-delivery__container\">\n      <div\n        v-if=\"displayHomeDeliveryMessaging\"\n        class=\"col-12 col-md-6 order-sm-2 home-delivery__options\"\n      >\n        <div class=\"home-delivery__item\">\n          <h2>I’m a print subscriber</h2>\n          <p>Link my online account to manage my subscription.</p>\n          <a :href=\"findMyPrintUrl\">Get Started</a>\n        </div>\n        <div class=\"home-delivery__item home-delivery__item--header-only\">\n          <h2>\n            Explore my subscription options.\n          </h2>\n          <a :href=\"subscriptionUrl\">Explore</a>\n        </div>\n      </div>\n\n      <div\n        class=\"col-12 mx-auto login__form-container\"\n        :class=\"{ 'col-md-6': displayHomeDeliveryMessaging }\"\n      >\n        <validation-observer ref=\"loginValidator\">\n          <form class=\"login__form\">\n            <confirm-message\n              v-show=\"requireEmailConfirmation\"\n              :isModal=\"isModal\"\n            ></confirm-message>\n\n            <flash-message></flash-message>\n\n            <div class=\"text-center\">\n              <div\n                v-if=\"isLimio\"\n                class=\"d-block m-auto\"\n                :class=\"[\n                  limioSubscriptionType === 'digital' || isLimioClient\n                    ? 'limio-heading'\n                    : ''\n                ]\"\n              >\n                <h1\n                  class=\"h1_login\"\n                  :class=\"[\n                    limioSubscriptionType === 'digital'\n                      ? 'text-left'\n                      : 'd-md-block'\n                  ]\"\n                >\n                  {{ logInHeading }}\n                </h1>\n                <h5\n                  v-if=\"limioSubscriptionType === 'digital' || isLimioClient\"\n                  class=\"text-left\"\n                >\n                  Step 1 of 2\n                </h5>\n              </div>\n              <h1 v-else class=\"h1_login\">\n                {{ logInHeading }}\n              </h1>\n              <div\n                class=\"login_account\"\n                :class=\"[\n                  limioSubscriptionType === 'digital'\n                    ? 'limio text-left m-auto'\n                    : ''\n                ]\"\n              >\n                <label>Don't have an account?</label>\n                <router-link :to=\"pathToRegisterPage\" class=\"register\">\n                  <span>Create one</span>\n                </router-link>\n              </div>\n              <resend-message\n                v-if=\"resendValidateEmail\"\n                :clearErrors=\"$refs.loginValidator.reset\"\n                :isModal=\"isModal\"\n                :errorMessage=\"apiErrorMessage\"\n                :isSendConfirmationEmail=\"isSendConfirmationEmail\"\n              ></resend-message>\n            </div>\n\n            <p\n              v-show=\"apiErrorMessage\"\n              class=\"background-danger text-center\"\n              role=\"alert\"\n              v-html=\"apiErrorMessage\"\n            >\n              {{ apiErrorMessage }}\n            </p>\n            <validation-provider\n              v-slot=\"{ errors, invalid, touched }\"\n              rules=\"required|email\"\n              name=\"email\"\n              tag=\"div\"\n              class=\"email-address\"\n              :class=\"{ 'mt-0': isLimio }\"\n            >\n              <div class=\"form-group\">\n                <label class=\"input-label\">Email address</label>\n                <div\n                  class=\"input-group input-rowcol\"\n                  :class=\"{ 'has-danger': invalid && touched }\"\n                >\n                  <input\n                    v-if=\"cem3190IsExp\"\n                    id=\"inputEmail\"\n                    ref=\"emailRef\"\n                    v-model=\"email\"\n                    class=\"form-control\"\n                    type=\"email\"\n                    aria-label=\"email\"\n                    placeholder=\"Email\"\n                    @keyup=\"updateEmail\"\n                  />\n                  <input\n                    v-else\n                    id=\"inputEmail\"\n                    v-model=\"email\"\n                    class=\"form-control\"\n                    type=\"email\"\n                    aria-label=\"email\"\n                  />\n                </div>\n                <p\n                  v-show=\"invalid && touched\"\n                  class=\"input-error-text flex-nowrap\"\n                  role=\"alert\"\n                >\n                  {{ errors[0] }}\n                </p>\n              </div>\n            </validation-provider>\n\n            <validation-provider\n              v-slot=\"{ errors, invalid, touched }\"\n              rules=\"required\"\n              name=\"password\"\n            >\n              <div class=\"form-group\">\n                <label class=\"input-label\">Password</label>\n                <div\n                  class=\"input-group input-rowcol\"\n                  :class=\"{ 'has-danger': invalid && touched }\"\n                >\n                  <div class=\"form-control input-password-container\">\n                    <input\n                      v-if=\"showPassword\"\n                      id=\"inputPassword\"\n                      v-model.trim=\"password\"\n                      type=\"text\"\n                      name=\"password\"\n                      aria-label=\"password\"\n                      required\n                      @keyup.enter=\"login\"\n                      @focus=\"focusInputPasswordContainer\"\n                      @focusout=\"focusOutInputPasswordContainer\"\n                    />\n                    <input\n                      v-else-if=\"cem3190IsExp\"\n                      id=\"inputPassword\"\n                      v-model.trim=\"password\"\n                      type=\"password\"\n                      name=\"password\"\n                      aria-label=\"password\"\n                      placeholder=\"Password\"\n                      required\n                      @keyup.enter=\"login\"\n                      @focus=\"focusInputPasswordContainer\"\n                      @focusout=\"focusOutInputPasswordContainer\"\n                    />\n                    <input\n                      v-else\n                      id=\"inputPassword\"\n                      v-model.trim=\"password\"\n                      type=\"password\"\n                      name=\"password\"\n                      aria-label=\"password\"\n                      required\n                      @keyup.enter=\"login\"\n                      @focus=\"focusInputPasswordContainer\"\n                      @focusout=\"focusOutInputPasswordContainer\"\n                    />\n                    <div\n                      class=\"inputRow_icon input-group-addon show-password__container\"\n                    >\n                      <button\n                        class=\"show-password__button\"\n                        type=\"button\"\n                        @click.prevent=\"togglePasswordVisibility\"\n                      >\n                        <img\n                          v-if=\"!showPassword\"\n                          src=\"~@tgam/design-tokens/output/vectors/show.svg\"\n                          alt=\"show password\"\n                        />\n                        <img\n                          v-else\n                          src=\"~@tgam/design-tokens/output/vectors/hide.svg\"\n                          alt=\"hide password\"\n                        />\n                      </button>\n                    </div>\n                  </div>\n                </div>\n                <p\n                  v-show=\"invalid && touched\"\n                  class=\"input-error-text flex-nowrap\"\n                  role=\"alert\"\n                >\n                  {{ errors[0] }}\n                </p>\n\n                <div class=\"forgot-pwd__container\">\n                  <router-link\n                    to=\"\"\n                    class=\"forgot-pwd__link\"\n                    role=\"link\"\n                    @click.native=\"goToRecover\"\n                  >\n                    Forgot password?\n                  </router-link>\n                </div>\n              </div>\n            </validation-provider>\n\n            <button\n              v-if=\"cem3190IsExp\"\n              class=\"submit_button\"\n              aria-label=\"Log in\"\n              :disabled=\"isLoading\"\n              @click.prevent=\"login\"\n            >\n              Continue\n              <span :class=\"[{ 'button-spinner': isLoading }]\"></span>\n            </button>\n            <button\n              v-else\n              class=\"submit_button\"\n              aria-label=\"Log in\"\n              :disabled=\"isLoading\"\n              @click.prevent=\"login\"\n            >\n              Log in\n              <span :class=\"[{ 'button-spinner': isLoading }]\"></span>\n            </button>\n\n            <div id=\"socialContainer\" class=\"text-center bottom-margin\">\n              <div class=\"or\">Or</div>\n              <div>\n                <social-log-in-swg\n                  v-for=\"provider in socialProviders\"\n                  :key=\"provider\"\n                  :socialProvider=\"provider\"\n                  :rememberMe=\"rememberMe\"\n                ></social-log-in-swg>\n              </div>\n            </div>\n            <base-checkbox\n              :class=\"{ 'mt-3': cem3190IsExp }\"\n              :isChecked=\"rememberMe\"\n              inputValue=\"remember-me\"\n              @checkboxChanged=\"updateRememberMeValue\"\n            >\n              Keep me logged in\n            </base-checkbox>\n            <a\n              class=\"trouble-link\"\n              href=\"https://globeandmail.my.site.com/helpcentre/s/contactsupport\"\n              target=\"_blank\"\n            >\n              Trouble logging in?\n            </a>\n          </form>\n        </validation-observer>\n        <div\n          v-if=\"cem3190IsExp\"\n          class=\"limio-heading d-block mr-auto ml-auto mt-5\"\n        >\n          <h1 class=\"h1-billing text-left pt-2 mb-4\">\n            2. Billing\n          </h1>\n        </div>\n      </div>\n    </div>\n\n    <cookie-notification\n      v-if=\"!isCookieEnabled\"\n      class=\"cookie-notification\"\n      :text=\"cookieNotificationText\"\n    />\n  </div>\n</template>\n\n<script>\nimport Cookie from 'js-cookie'\nimport SocialLogInSwg from '@/components/SocialLogInSwg'\nimport FlashMessage from './FlashMessage'\nimport ConfirmMessage from './ConfirmMessage'\nimport ResendMessage from './ResendMessage'\nimport { ValidationObserver, ValidationProvider } from 'vee-validate'\nimport CookieNotification from './CookieNotification'\nimport { LoginMessages, ResetPasswordMessages } from '../utils/messages'\nimport { isCookieEnabled } from '@/utils/cookie'\nimport api from '@/utils/api'\nimport { getGrecaptchaToken } from '@/utils/storeHelpers'\nimport { mapState, mapGetters } from 'vuex'\nimport { getConfig } from '@/utils/cognito'\nimport {\n  generateParams,\n  generateCallbackQuery,\n  serializeUrl\n} from '@tgam/tgam-cognito'\n// import ameliaInit to initialize Amelia\nimport { ameliaInit } from '@/utils/amelia/index'\nimport { csrPhoneNumber } from '@/utils/constants'\nimport LoadingSpinner from '@/components/LoadingSpinner'\nimport redirectToAfterLoginGoTo from '@/utils/afterLoginGoToCookie'\nimport BaseCheckbox from '@/components/base/BaseCheckbox'\nimport limioMixin from '@/mixins/components/limioMixin'\nimport {\n  getLimioSubscriptionType,\n  getLimioCampaignCode,\n  orderInfo,\n  cem3190Variant\n} from '../utils/amelia/utility'\nimport {\n  accountLogin,\n  accountInteraction,\n  identify,\n  sectionView\n} from '@/vendor/amplitude/amplitudeUtils.js'\n\nexport default {\n  name: 'LoginCognito',\n  components: {\n    SocialLogInSwg,\n    FlashMessage,\n    ConfirmMessage,\n    ResendMessage,\n    ValidationObserver,\n    ValidationProvider,\n    CookieNotification,\n    LoadingSpinner,\n    BaseCheckbox\n  },\n  mixins: [limioMixin],\n  props: { callbackError: { type: Object, default: () => ({}) } },\n  data() {\n    return {\n      isLoading: false,\n      email: '',\n      password: '',\n      rememberMe: true,\n      socialProviders: ['google', 'signInWithApple'],\n      isModal: false,\n      isCookieEnabled: true,\n      isSendConfirmationEmail: true,\n      callbackUrl: '',\n      showPassword: false,\n      csrPhoneNumber,\n      limioSubscriptionType: '',\n      limioCampaignCode: '',\n      orderInfo: null,\n      cem3190Variant: '',\n      cem3190IsExp: false\n    }\n  },\n  computed: {\n    ...mapState({\n      resendValidateEmail: state => state.resendValidateEmail,\n      apiErrorMessage: state => {\n        const isApiError = state.apiError && state.apiError.body\n        if (!isApiError) {\n          return ''\n        }\n        const errorCode = state.apiError.body.error\n\n        if (errorCode) {\n          return LoginMessages[errorCode] || LoginMessages.GENERIC_ERROR\n        }\n        return ''\n      }\n    }),\n    ...mapGetters(['requireEmailConfirmation', 'isIframe']),\n    cookieNotificationText() {\n      return `\n       To log in, enable cookies in your browser. Read our\n        <a\n          href=\"https://www.theglobeandmail.com/privacy-terms/privacy-policy/#tgamprivacy1\"\n          target=\"_blank\"\n          role=\"link\"\n        >\n          privacy policy\n        </a>\n        ${this.isModal ? '<br/>' : ''}\n        to learn more.\n      `\n    },\n    displayHomeDeliveryMessaging() {\n      return (\n        this.$route.query.product === 'home-delivery' && this.isModal === false\n      )\n    },\n    subscriptionUrl() {\n      return `${window.cpcConfig.LIMIO_DOMAIN}globe-products/`\n    },\n    findMyPrintUrl() {\n      return `${window.cpcConfig.MY_ACCOUNT_URL}find-my-print`\n    },\n    isValidateEmailToken() {\n      return this.$route.params.validateEmailToken\n    },\n    isActivationSourceIos() {\n      return this.$route.query.source && this.$route.query.source === 'ios'\n    },\n    isActivationSourceAndroid() {\n      return this.$route.query.source && this.$route.query.source === 'android'\n    },\n    isMobileAppUniversalLogin() {\n      return (\n        this.$route.path === '/modal/login/ios/universal' ||\n        this.$route.path === '/modal/login/android/universal'\n      )\n    },\n    isLogInTypeSiwg() {\n      return this.$route.query && this.$route.query.loginType === 'siwg'\n    },\n    inputPasswordContainer() {\n      return document.querySelector('.input-password-container')\n    },\n    pathToRegisterPage() {\n      const query = this.$route.query\n      const path = this.$route.query.ext_client_id\n        ? '/register/subscription'\n        : this.isModal\n        ? '/modal/register'\n        : '/register'\n\n      return { path, query }\n    },\n    isLimio() {\n      const extClientId = this.$route.query.ext_client_id\n      return typeof extClientId !== 'undefined' && extClientId.includes('limio')\n        ? true\n        : false\n    },\n    logInHeading() {\n      if (!this.isLimioClient) {\n        return 'Log in to your account'\n      } else if (this.cem3190IsExp) {\n        return '1. Account'\n      } else if (\n        this.limioSubscriptionType === 'digital' ||\n        this.isLimioClient\n      ) {\n        return 'Account'\n      } else {\n        return 'Log in to your account'\n      }\n    },\n    isLimioClient() {\n      return (\n        this.$route.query.ext_client_id === window.cpcConfig.LIMIO_CLIENT_ID\n      )\n    }\n  },\n  watch: {\n    '$store.state.isAuthenticated': function() {\n      if (this.$route.query.client_id) {\n        this.redirectTo(this.callbackUrl)\n      } else if (localStorage.getItem('logInWithLimio')) {\n        // Trigger accountLogin once log in is completed\n        accountLogin()\n        this.redirectToOauth2UrlWithLimioParams()\n      } else {\n        this.handleAuthentication()\n      }\n    }\n  },\n  created() {\n    if (this.isLimio) {\n      this.limioSubscriptionType = getLimioSubscriptionType()\n      this.limioCampaignCode = getLimioCampaignCode()\n    }\n    if (['EVERGREEN6', 'EVERGREEN7'].includes(this.limioCampaignCode)) {\n      this.orderInfo = orderInfo()\n      this.cem3190Variant = this.orderInfo ? cem3190Variant() : ''\n      this.cem3190IsExp = this.cem3190Variant.includes('exp')\n    }\n    this.getLimioLogInParams()\n\n    // TODO: to remove after SABRE project launch\n    this.setLimioFlag()\n\n    // If this.$route.query.loginType === 'siwg', trigger siwg flow\n    if (this.isLogInTypeSiwg) {\n      localStorage.setItem('loginType', this.$route.query.loginType)\n      const generatedUrl = serializeUrl(\n        getConfig(),\n        this.$route.query,\n        'Google',\n        this.rememberMe,\n        `login_google`\n      )\n      window.parent.location = `${\n        window.cpcConfig.COGNITO_AUTHORIZE_BASE_URL\n      }?${generatedUrl}`\n    }\n\n    if (this.isValidateEmailToken) {\n      this.handleValidateEmail()\n    }\n    this.processQueryEhash()\n    this.isCookieEnabled = isCookieEnabled()\n  },\n  mounted() {\n    if (this.orderInfo) {\n      this.email = this.orderInfo.userEmail\n      this.$refs.emailRef.focus()\n    }\n    if (this.callbackError.body) {\n      this.$store.commit('apiError', this.callbackError)\n    }\n\n    if (this.$route.query.resetPassword === 'true') {\n      this.$store.dispatch(\n        'flashMessage',\n        ResetPasswordMessages.RESET_PASSWORD_SAVED\n      )\n    }\n\n    if (!this.isMobileAppUniversalLogin) {\n      window.scrollTo(0, 0)\n    }\n\n    this.$analytics.pageview('login')\n    this.$analytics.pageLoaded()\n    // call ampli identify and sectionView\n    identify().then(() => sectionView())\n  },\n  beforeDestroy() {\n    this.$store.commit('clearflashMessage')\n  },\n  beforeRouteLeave(to, from, next) {\n    if (from.params.validateEmailToken && to.path === '/login') {\n      this.$store.commit('clearflashMessage')\n    }\n    next()\n  },\n  methods: {\n    updateRememberMeValue(value) {\n      this.rememberMe = value\n    },\n    setLimioFlag() {\n      if (!this.$route.query.limioFlag) {\n        return\n      }\n\n      if (this.$route.query.limioFlag === 'true') {\n        localStorage.setItem('limioFlag', true)\n      }\n\n      if (\n        this.$route.query.limioFlag === 'false' &&\n        localStorage.getItem('limioFlag')\n      ) {\n        localStorage.removeItem('limioFlag')\n      }\n    },\n    updateEmail($evt) {\n      if (this.cem3190IsExp && $evt.target.type === 'email') {\n        this.orderInfo.userEmail = $evt.target.value\n\n        //update tgam.orderInfo cookie\n        const cookieOptions = { domain: '.theglobeandmail.com' }\n        Cookie.set(\n          'tgam.orderInfo',\n          JSON.stringify(this.orderInfo),\n          cookieOptions\n        )\n      }\n    },\n    focusInputPasswordContainer() {\n      const inputPasswordContainer = this.inputPasswordContainer\n\n      inputPasswordContainer.classList.add('password-container-focus')\n    },\n    focusOutInputPasswordContainer() {\n      const inputPasswordContainer = this.inputPasswordContainer\n\n      inputPasswordContainer.classList.remove('password-container-focus')\n    },\n    togglePasswordVisibility() {\n      if (!this.password) {\n        return\n      }\n\n      this.showPassword = !this.showPassword\n    },\n    goToRecover() {\n      if (this.email) {\n        if (this.isModal) {\n          this.$router.replace({\n            name: 'RecoverModal',\n            params: { recoverEmail: this.email }\n          })\n          return\n        }\n        this.$router.replace({\n          name: 'Recover',\n          params: { recoverEmail: this.email }\n        })\n        return\n      } else if (this.isModal) {\n        this.$router.replace({\n          name: 'RecoverModal'\n        })\n        return\n      }\n      this.$router.replace({\n        name: 'Recover'\n      })\n    },\n    async processQueryEhash() {\n      if (!this.$route.query.ehash) {\n        return\n      }\n      try {\n        //decrypt url query data using api\n        const { ok, body } = await api.postPublicV3('decrypt', true, [\n          { dataEnc: this.$route.query.ehash }\n        ])\n        const data = JSON.parse(body[0].data)\n        if (ok && data) {\n          this.resentValidateEmail(data)\n          this.confirmChangedEmail(data)\n        }\n      } catch (error) {\n        this.$store.commit('apiError', error)\n      }\n    },\n    resentValidateEmail(data) {\n      if (!data.email) {\n        return\n      }\n      this.email = data.email\n      if (this.email && data.resendEmail === false) {\n        this.isSendConfirmationEmail = false\n        this.$store.commit('resendValidateEmail', {\n          email: this.email,\n          resendEmail: true\n        })\n      }\n    },\n    confirmChangedEmail(data) {\n      if (data.validateEmailToken) {\n        // Trigger accountInteraction when change email is confirmed\n        accountInteraction('change email success')\n\n        this.$store.dispatch(\n          'flashMessage',\n          LoginMessages.REGISTER_EMAIL_VERIFIED\n        )\n        Cookie.set('confirmedEmail', 'true', {\n          expires: 7,\n          domain: '.theglobeandmail.com'\n        })\n      } else if (data.validateEmailError) {\n        this.$store.dispatch(\n          'flashMessage',\n          LoginMessages.REGISTER_EMAIL_VERIFICATION_ERROR\n        )\n      }\n    },\n    async handleValidateEmail() {\n      try {\n        this.$store.dispatch('unauthorize')\n        const token = await getGrecaptchaToken('activateemail')\n        const apiConfig = {\n          credentials: false,\n          headers: token ? { token } : null\n        }\n\n        const response = await api.putWithConfig(\n          'user/activation',\n          this.$route.params.validateEmailToken,\n          apiConfig\n        )\n\n        if (response.status !== 200) {\n          throw Error(response)\n        }\n\n        this.setAfterLoginGoToCookie(response.body.isSubscriber)\n        this.$analytics.registerConfirmed()\n        if (this.isActivationSourceIos) {\n          this.$router.push({ path: '/modal/login/ios/universal' })\n        }\n        if (this.isActivationSourceAndroid) {\n          this.$router.push({ path: '/modal/login/android/universal' })\n        }\n        this.$store.dispatch(\n          'flashMessage',\n          LoginMessages.REGISTER_EMAIL_VERIFIED\n        )\n        // first login set the confirmed cookie for mobile intercept\n        if (Cookie.get('confirmedEmail') === undefined) {\n          Cookie.set('confirmedEmail', 'true', {\n            expires: 7,\n            domain: 'theglobeandmail.com'\n          })\n        }\n      } catch (error) {\n        if (this.isActivationSourceIos || this.isActivationSourceAndroid) {\n          this.$router.push({\n            path: `/login/${this.$route.params.validateEmailToken}`\n          })\n        }\n        // this needs to be removed. After seeing what error message comes back\n        this.$store.dispatch(\n          'flashMessage',\n          LoginMessages.REGISTER_EMAIL_VERIFICATION_ERROR\n        )\n      }\n    },\n    setAfterLoginGoToCookie(isSubscriber) {\n      // get afterRegOrSubGoTo cookie value\n      const afterRegOrSubGoTo = Cookie.get('afterRegOrSubGoTo')\n      const afterLoginGoToValue = Cookie.get('afterLoginGoTo')\n      const cpcenv =\n        window.cpcConfig.ENV_NAME === 'PROD'\n          ? 'www'\n          : window.cpcConfig.ENV_NAME === 'STG'\n          ? 'arc-staging'\n          : 'arc-dev'\n\n      if (afterRegOrSubGoTo) {\n        // delete afterRegOrSubGoTo cookie\n        Cookie.remove('afterRegOrSubGoTo', {\n          domain: window.cpcConfig.COOKIE_DOMAIN\n        })\n        Cookie.set('afterLoginGoTo', afterRegOrSubGoTo, {\n          expires: 7,\n          domain: '.theglobeandmail.com'\n        })\n      } else if (isSubscriber === true) {\n        if (afterLoginGoToValue) {\n          Cookie.set('subs_afterLoginGoTo', afterLoginGoToValue, {\n            expires: 7,\n            domain: '.theglobeandmail.com'\n          })\n        }\n        Cookie.set(\n          'afterLoginGoTo',\n          `https://${cpcenv}.theglobeandmail.com/welcome-subscriber`,\n          {\n            expires: 7,\n            domain: '.theglobeandmail.com'\n          }\n        )\n      } else {\n        if (afterLoginGoToValue) {\n          Cookie.set('reg_afterLoginGoTo', afterLoginGoToValue, {\n            expires: 7,\n            domain: '.theglobeandmail.com'\n          })\n        }\n        Cookie.set(\n          'afterLoginGoTo',\n          `https://${cpcenv}.theglobeandmail.com/welcome-register`,\n          {\n            expires: 7,\n            domain: '.theglobeandmail.com'\n          }\n        )\n      }\n    },\n    async login() {\n      this.$store.commit('clearEmailConfirmation')\n      this.$store.commit('clearApiError')\n      this.$store.commit('resendValidateEmail', {\n        confirmationEmail: '',\n        resendValidateEmail: false\n      })\n\n      const generatedPayload = generateParams(\n        getConfig(),\n        this.$route.query,\n        this.rememberMe\n      )\n\n      const isValid = await this.$refs.loginValidator.validate()\n      if (!isValid) {\n        return\n      }\n      this.isLoading = true\n\n      try {\n        const token = await getGrecaptchaToken('accountlogin')\n        const apiConfig = {\n          credentials: true,\n          headers: token ? { token } : null\n        }\n        const payload = {\n          email: this.email,\n          password: this.password,\n          ...generatedPayload\n        }\n\n        const response = await api.postWithConfigV4('login', payload, apiConfig)\n\n        if (response.ok) {\n          this.$store.commit('loginMethod', 'email')\n          if (this.$route.query.client_id) {\n            this.callbackUrl = response.body.callbackUrl\n            this.$store.commit('authorize')\n          } else {\n            const queryResult = generateCallbackQuery(response.body.callbackUrl)\n            await this.callback(queryResult)\n          }\n        }\n      } catch (error) {\n        this.isLoading = false\n\n        if (error.body && error.body.error === 'ACCOUNT_NOT_ACTIVE') {\n          this.$store.commit('resendValidateEmail', {\n            email: this.email,\n            resendEmail: true\n          })\n\n          this.password = ''\n          this.email = ''\n\n          this.$refs.loginValidator.reset()\n        } else {\n          this.$store.commit('apiError', error)\n        }\n      }\n    },\n    async callback(query) {\n      if (!query.code) {\n        return\n      }\n\n      try {\n        const token = await getGrecaptchaToken('callback')\n        const apiConfig = {\n          credentials: true,\n          headers: token ? { token } : null\n        }\n\n        await api.postWithConfigV4('login/callback', query, apiConfig)\n        this.$store.commit('authorize')\n      } catch (error) {\n        this.isLoading = false\n        this.$store.commit('apiError', error)\n      }\n    },\n    handleAuthentication() {\n      this.$analytics.login()\n\n      setTimeout(() => {\n        // Trigger accountLogin once log in is completed\n        accountLogin()\n          .promise.then(() => {\n            // get afterRegOrSubGoTo cookie value\n            const afterRegOrSubGoTo = Cookie.get('afterRegOrSubGoTo')\n            const afterLoginGoTo = Cookie.get('afterLoginGoTo')\n\n            if (this.isModal && this.isIframe) {\n              if (afterRegOrSubGoTo) {\n                // delete afterRegOrSubGoTo cookie\n                Cookie.remove('afterRegOrSubGoTo', {\n                  domain: window.cpcConfig.COOKIE_DOMAIN\n                })\n                window.parent.location = afterRegOrSubGoTo\n              } else if (\n                afterLoginGoTo &&\n                afterLoginGoTo.includes('watchlist')\n              ) {\n                window.parent.location = afterLoginGoTo\n              } else {\n                window.top.postMessage('reload', '*')\n              }\n            } else if (\n              // if afterLogin cookie exists, only use it if user is in production\n              // OR user is not in production and the cookie doesn't point to production\n              afterLoginGoTo &&\n              (window.cpcConfig.ENV_NAME === 'PROD' ||\n                (window.cpcConfig.ENV_NAME !== 'PROD' &&\n                  !afterLoginGoTo.startsWith(\n                    'https://www.theglobeandmail.com'\n                  )))\n            ) {\n              redirectToAfterLoginGoTo()\n            } else {\n              // this will redirect to Tgam homepage\n              this.redirectTo(`${window.cpcConfig.TGAM_LINKS_HOST}?login=true`)\n            }\n          })\n          .catch(error => {\n            console.log('account_login event error: ', error)\n          })\n      }, 50)\n    },\n    redirectTo(url) {\n      window.location = url\n    }\n  },\n  async beforeRouteEnter(to, from, next) {\n    /* initialize Amelia inside beforeRouteEnter hook of the component because ameliaInit is an async function call\n      which is required to be processed before the page is mounted and beforeRouteEnter does exactly that.*/\n    await ameliaInit()\n    if (to.meta.isModal) {\n      next(vm => {\n        vm.isModal = to.meta.isModal\n      })\n    } else {\n      next()\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.button-spinner {\n  border: 1rem solid transparent;\n  background: url(~@/assets/images/loading-spinner.svg);\n  background-position: calc(100% + 10px) center;\n  background-size: 20px;\n  background-repeat: no-repeat;\n}\n\n.login {\n  display: flex;\n  flex-direction: column;\n  max-width: 78.75rem;\n  width: 100%;\n}\n\n.login--cookie-disabled {\n  margin-bottom: 1rem;\n}\n\n.forgot-pwd {\n  &__container {\n    text-align: left;\n    margin-top: 0.75rem;\n    padding-right: 0.35rem;\n  }\n\n  &__link {\n    text-decoration: underline;\n    color: $color-grey-600;\n    cursor: pointer;\n  }\n\n  &__link:focus {\n    outline-color: $color-focus;\n    outline-style: solid;\n    outline-width: 0.125rem;\n  }\n}\n\n.input-error-text {\n  color: $color-red-500;\n}\n\n.login--modal {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n\n  .cookie-notification {\n    margin-top: auto;\n  }\n\n  .container {\n    width: 100%;\n  }\n}\n\n.login__form-container {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\n.login__form {\n  width: 100%;\n  max-width: 445px;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.cookie-notification {\n  margin-top: auto;\n}\n\n.register {\n  color: $color-grey-800;\n  text-decoration: underline;\n}\n\n.login_account {\n  @include text-pr-7;\n  padding-bottom: 0.25rem;\n  text-align: center;\n}\n\n.login_account label {\n  margin-right: 0.25rem;\n}\n\n.input-label {\n  @include text-gmb-5;\n  font-size: 1rem;\n  margin-bottom: 0.25rem;\n}\n\n.form-control {\n  border: 0.063rem solid $color-grey-400;\n  border-radius: 0.13rem !important;\n  height: 2.5rem;\n}\n\n.has-danger .form-control {\n  border-color: $color-red-400 !important;\n}\n\n.inputRow_icon {\n  background: $color-grey-400;\n  width: 50px;\n  height: 40px;\n  border-radius: 3px 0 0 3px;\n  -webkit-border-radius: 3px 0 0 3px;\n  -moz-border-radius: 3px 0 0 3px;\n  margin: 0px;\n  float: left;\n}\n\n.input-group .form-control:focus {\n  border-color: $color-grey-300;\n}\n\n.input-rowcol .form-control:focus {\n  border-color: $color-grey-400;\n  outline-color: $color-focus;\n  outline-style: solid;\n  outline-width: 2px;\n}\n\n.submit_button {\n  width: 100%;\n  margin: 10px auto 0;\n  display: block;\n  background-color: $color-red-500;\n  color: $color-white;\n  border: 0;\n  border-radius: 0.125rem;\n  padding: 13px 40px 12px;\n  cursor: pointer;\n  text-align: center;\n  text-decoration: none;\n  @include text-gml-2;\n}\n\n.submit_button:focus {\n  outline-color: $color-focus;\n  outline-style: solid;\n  outline-width: 2px;\n}\n\n.background-danger {\n  background-color: $color-red-500;\n  padding: 15px;\n  color: $color-white;\n}\n\n.home-delivery {\n  margin-top: 2rem;\n\n  &__header {\n    margin-bottom: 40px;\n\n    h2 {\n      @include text-gmb-3;\n      text-transform: uppercase;\n      margin-bottom: 0.5rem;\n    }\n\n    p {\n      @include text-gmr-4;\n      color: $color-grey-600;\n    }\n  }\n\n  &__options {\n    @media (max-width: 768px) {\n      order: 2;\n    }\n  }\n\n  &__item {\n    max-width: 600px;\n    background: $color-white;\n    border: 1px solid $color-grey-400;\n    text-align: center;\n    height: 260px;\n\n    &:nth-child(2) {\n      margin-top: 60px;\n    }\n\n    @media (max-width: 768px) {\n      max-width: none;\n      margin-bottom: 1rem;\n\n      &:nth-child(2) {\n        margin-top: 0;\n      }\n    }\n\n    h2 {\n      @include text-pr-4;\n      max-width: 75%;\n      margin: 60px auto 24px;\n\n      @media (min-width: 768px) and (max-width: 900px) {\n        max-width: 90%;\n      }\n    }\n\n    &--header-only {\n      h2 {\n        margin-top: 91px;\n        margin-bottom: 41px;\n\n        @media (max-width: 320px) {\n          margin-top: 75px;\n        }\n      }\n    }\n\n    p {\n      @include text-pr-8;\n      margin-bottom: 24px;\n    }\n\n    a {\n      display: block;\n      color: $color-white;\n      height: 44px;\n      background: $color-grey-700;\n      padding-top: 0.8rem;\n      @include text-gml-3;\n      margin: 0 auto;\n      max-width: 64%;\n    }\n  }\n\n  .login__form-container {\n    .login__form {\n      background: $color-white;\n      border: 1px solid $color-grey-400;\n      width: 100%;\n      padding-top: 28px;\n      padding-bottom: 30px;\n      padding-left: 1rem;\n      padding-right: 1rem;\n      max-width: 500px;\n\n      @media (max-width: 768px) {\n        max-height: none;\n        max-width: none;\n        padding: 30px 1rem;\n        margin-bottom: 1rem;\n      }\n    }\n  }\n}\n\n.email-address {\n  margin-top: 1rem;\n}\n\n.bottom-margin {\n  margin-bottom: 20px;\n}\n\n.input-password-container {\n  padding: 0;\n  display: flex;\n  flex-direction: row;\n  overflow: hidden;\n}\n\n#inputPassword {\n  border: none;\n  outline: none;\n  width: 90%;\n  padding: 0.5rem 0 0.5rem 0.75rem;\n}\n\n.show-password {\n  &__container {\n    margin: 0;\n    padding: 0;\n    height: 100%;\n    background-color: $color-white;\n    border: none;\n  }\n\n  &__button {\n    width: 100%;\n    height: 100%;\n    border: none;\n    background-color: $color-white;\n    cursor: pointer;\n\n    img {\n      width: 1.25rem;\n    }\n  }\n}\n\n.password-container-focus,\n.show-password__button:focus {\n  border: 1px solid $color-grey-400;\n  outline-color: $color-focus;\n  outline-style: solid;\n  outline-width: 2px;\n}\n.show-password__button:focus {\n  outline-style: auto;\n}\n\n.or {\n  width: 100%;\n  text-align: center;\n  margin: 0.5rem auto;\n}\n\n.limio.login_account,\n.limio-heading {\n  max-width: 445px;\n}\n.limio-heading {\n  h1 {\n    @include text-pb-4;\n    border-bottom: 1px solid $color-grey-500;\n    padding-bottom: 0.5rem;\n    margin-bottom: 1rem;\n  }\n  h5 {\n    @include text-gmb-4;\n    margin-bottom: 1rem;\n    color: $color-grey-500;\n  }\n}\n.cem3190 {\n  label.input-label,\n  h5 {\n    display: none;\n  }\n  h1 {\n    font-family: Pratt;\n    margin-bottom: 0;\n  }\n  .h1_login {\n    border-bottom: none;\n  }\n  .h1-billing {\n    color: $color-grey-400;\n    border-top: 1px solid $color-grey-400;\n    border-bottom: 1px solid $color-grey-400;\n  }\n}\n.trouble-link {\n  @include text-gmr-4;\n  color: $color-grey-500;\n  margin-top: 16px;\n  margin-bottom: 70px;\n  font-size: 14px;\n  line-height: 20px;\n  display: inline-block;\n  text-decoration: underline;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoginCognito.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoginCognito.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LoginCognito.vue?vue&type=template&id=2e11b1d8&scoped=true&\"\nimport script from \"./LoginCognito.vue?vue&type=script&lang=js&\"\nexport * from \"./LoginCognito.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LoginCognito.vue?vue&type=style&index=0&id=2e11b1d8&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"2e11b1d8\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('loading-spinner',[_vm._v(\"Logging you in...\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import Cookie from 'js-cookie'\nimport redirectToAfterLoginGoTo from '@/utils/afterLoginGoToCookie'\nimport {\n  accountRegistration,\n  accountLogin\n} from '@/vendor/amplitude/amplitudeUtils.js'\n\nlet socialSignInHelper = {\n  data() {\n    return {\n      socialAction: '',\n      socialProvider: ''\n    }\n  },\n  methods: {\n    sendAnalytics() {\n      const action = this.socialAction\n      const provider = this.socialProvider\n\n      if (action === 'login' && provider) {\n        this.$analytics.socialLogin(provider)\n\n        // Trigger accountLogin once social sign in from Log in page is completed\n        accountLogin()\n        return\n      }\n      if (action === 'register' && provider) {\n        // get afterRegOrSubGoTo cookie value\n        const afterRegOrSubGoTo = Cookie.get('afterRegOrSubGoTo')\n        const afterLoginGoTo = Cookie.get('afterLoginGoTo')\n        const cpcenv =\n          window.cpcConfig.ENV_NAME === 'PROD'\n            ? 'www'\n            : window.cpcConfig.ENV_NAME === 'STG'\n            ? 'arc-staging'\n            : 'arc-dev'\n\n        if (afterRegOrSubGoTo) {\n          // delete afterRegOrSubGoTo cookie\n          Cookie.remove('afterRegOrSubGoTo', {\n            domain: window.cpcConfig.COOKIE_DOMAIN\n          })\n          Cookie.set('afterLoginGoTo', afterRegOrSubGoTo, {\n            expires: 7,\n            domain: '.theglobeandmail.com'\n          })\n        } else if (!afterLoginGoTo) {\n          Cookie.set(\n            'afterLoginGoTo',\n            `https://${cpcenv}.theglobeandmail.com/welcome-register`,\n            {\n              expires: 7,\n              domain: '.theglobeandmail.com'\n            }\n          )\n        } else if (!afterLoginGoTo.includes('watchlist')) {\n          Cookie.set('reg_afterLoginGoTo', afterLoginGoTo, {\n            expires: 7,\n            domain: '.theglobeandmail.com'\n          })\n          Cookie.set(\n            'afterLoginGoTo',\n            `https://${cpcenv}.theglobeandmail.com/welcome-register`,\n            {\n              expires: 7,\n              domain: '.theglobeandmail.com'\n            }\n          )\n        }\n\n        this.$analytics.socialRegisterComplete(provider)\n        window.chartbeat && window.chartbeat('trackRegistrationComplete')\n        // Trigger accountRegistration once social sign in from Register page is completed\n        accountRegistration(provider)\n      }\n    },\n    handleAuthentication() {\n      if (localStorage.getItem('logInWithLimio')) {\n        this.redirectToOauth2UrlWithLimioParams()\n        return\n      }\n\n      if (this.$store.state.loginMethod === 'email') {\n        this.$analytics.login()\n      }\n\n      if (localStorage.getItem('loginType') === 'siwg') {\n        localStorage.removeItem('loginType')\n        Cookie.set('afterSignInWithGoogle', true, {\n          domain: '.theglobeandmail.com'\n        })\n      }\n\n      setTimeout(() => {\n        let afterLoginGoTo = Cookie.get('afterLoginGoTo')\n\n        if (\n          // if afterLogin cookie exists, only use it if user is in production\n          // OR user is not in production and the cookie doesn't point to production\n          afterLoginGoTo &&\n          (window.cpcConfig.ENV_NAME === 'PROD' ||\n            (window.cpcConfig.ENV_NAME !== 'PROD' &&\n              !afterLoginGoTo.startsWith('https://www.theglobeandmail.com')))\n        ) {\n          redirectToAfterLoginGoTo()\n        } else {\n          // this will redirect to Tgam homepage\n          this.redirectTo(`${window.cpcConfig.TGAM_LINKS_HOST}?login=true`)\n        }\n      }, 50)\n    },\n    redirectTo(url) {\n      window.location = url\n    }\n  }\n}\n\nexport default socialSignInHelper\n","<template>\n  <loading-spinner>Logging you in...</loading-spinner>\n</template>\n\n<script>\nimport api from '@/utils/api'\nimport { getGrecaptchaToken } from '@/utils/storeHelpers'\nimport socialSignInHelper from '@/mixins/components/socialSignInHelper'\nimport LoadingSpinner from '@/components/LoadingSpinner'\nimport limioMixin from '@/mixins/components/limioMixin'\nimport { sectionView } from '@/vendor/amplitude/amplitudeUtils.js'\n\nexport default {\n  name: 'Callback',\n  components: { LoadingSpinner },\n  mixins: [socialSignInHelper, limioMixin],\n  watch: {\n    '$store.state.isAuthenticated': function() {\n      this.handleAuthentication()\n    }\n  },\n  created() {\n    this.callback()\n  },\n  mounted() {\n    this.$analytics.pageview('callback')\n    this.$analytics.pageLoaded()\n    // Trigger ampli sectionView event\n    sectionView()\n  },\n  methods: {\n    getSocialStatus(source = '') {\n      const action = source.startsWith('login_')\n        ? 'login'\n        : source.startsWith('register_')\n        ? 'register'\n        : ''\n      const provider = source.includes('google')\n        ? 'google'\n        : source.includes('signInWithApple')\n        ? 'apple'\n        : ''\n      return {\n        action,\n        provider: provider.toUpperCase()\n      }\n    },\n    async callback() {\n      try {\n        if (this.$route.query && Object.keys(this.$route.query).length !== 0) {\n          const { code, state } = this.$route.query\n          let payload\n          if (!code) {\n            this.$router.replace({\n              name: 'Login'\n            })\n            return\n          }\n\n          if (!state) {\n            payload = { code }\n          } else {\n            const { source } = JSON.parse(atob(state))\n            const { action, provider } = this.getSocialStatus(source)\n            this.socialAction = action\n            this.socialProvider = provider\n            payload = { code, state }\n          }\n\n          const token = await getGrecaptchaToken('callback')\n          const apiConfig = {\n            credentials: true,\n            headers: token ? { token } : null\n          }\n          const loginType = localStorage.getItem('loginType')\n          // If localStorage contains loginType === 'siwg', trigger 'Sign in with Google' process.\n          if (\n            (loginType === 'siwg' || window.cpcConfig.SWG_LAUNCH_FLAG) &&\n            this.socialProvider === 'GOOGLE'\n          ) {\n            this.swgCallback({\n              apiConfig,\n              payload,\n              socialAction: this.socialAction\n            })\n          } else {\n            await api.postWithConfigV4('login/callback', payload, apiConfig)\n            this.sendAnalytics()\n            this.$store.commit('authorize')\n          }\n        }\n      } catch (error) {\n        this.$router.replace({\n          name: 'Login',\n          params: { callbackError: error }\n        })\n      }\n    },\n    async swgCallback(obj) {\n      const { apiConfig, payload, socialAction } = obj\n      const { body } = await api.postWithConfigV4(\n        'login/callback',\n        payload,\n        apiConfig\n      )\n\n      if (body.user.socialEmail) {\n        const clientID = window.cpcConfig.SWG_CLIENT_ID\n        const redirectUri = `${\n          window.cpcConfig.AUTHENTICATION_CALLBACK\n        }login/callback/swg`\n        const socialEmail = body.user.socialEmail\n\n        const encryptApiResponse = await api.postPublicV3('encrypt', true, [\n          { data: socialEmail + socialAction }\n        ])\n\n        if (encryptApiResponse.ok && encryptApiResponse.body[0].dataEnc) {\n          const urlState = encryptApiResponse.body[0].dataEnc\n          const swgUrl = `${\n            window.cpcConfig.SWG_URL\n          }?client_id=${clientID}&redirect_uri=${redirectUri}&response_type=token&scope=profile+email+openid&login_hint=${socialEmail}&state=${urlState}`\n\n          window.parent.location = swgUrl\n        }\n      }\n    }\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Callback.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Callback.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Callback.vue?vue&type=template&id=b5515e72&\"\nimport script from \"./Callback.vue?vue&type=script&lang=js&\"\nexport * from \"./Callback.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('loading-spinner',[_vm._v(\"Logging you in...\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <loading-spinner>Logging you in...</loading-spinner>\n</template>\n\n<script>\nimport api from '@/utils/api'\nimport socialSignInHelper from '@/mixins/components/socialSignInHelper'\nimport LoadingSpinner from '@/components/LoadingSpinner'\nimport { getGrecaptchaToken } from '@/utils/storeHelpers'\nimport limioMixin from '@/mixins/components/limioMixin'\nimport { sectionView } from '@/vendor/amplitude/amplitudeUtils.js'\n\nexport default {\n  name: 'SubscribeWithGoogle',\n  components: { LoadingSpinner },\n  mixins: [socialSignInHelper, limioMixin],\n  created() {\n    this.subscribeWithGoogle()\n  },\n  mounted() {\n    this.$analytics.pageview('swgcallback')\n    this.$analytics.pageLoaded()\n    // Trigger ampli sectionView event\n    sectionView()\n  },\n  methods: {\n    subscribeWithGoogle() {\n      try {\n        if (this.$route.hash) {\n          this.sendAccessTokenToApi()\n        }\n      } catch (error) {\n        this.$router.replace({\n          name: 'Login',\n          params: { callbackError: error }\n        })\n      }\n    },\n    async sendAccessTokenToApi() {\n      const urlParams = new URLSearchParams(window.location.hash.split('#')[1])\n      if (!urlParams) {\n        return\n      }\n\n      const accessToken = urlParams.get('access_token')\n      const { ok, body } = await api.postPublicV3('decrypt', true, [\n        { dataEnc: urlParams.get('state') }\n      ])\n      const urlState = ok && body[0].data ? body[0].data : ''\n\n      const isLogin = urlState.endsWith('login')\n      const action = isLogin ? 'login' : 'register'\n      const socialEmail = urlState.slice(0, isLogin ? -5 : -8)\n\n      this.socialAction = action\n      this.socialProvider = 'GOOGLE'\n\n      if (accessToken && socialEmail) {\n        const token = await getGrecaptchaToken('swgcallback')\n        const apiConfig = {\n          credentials: true,\n          headers: token ? { token } : null\n        }\n        await api.postToCheckEntitlements(\n          {\n            email: socialEmail,\n            gsiToken: accessToken\n          },\n          apiConfig\n        )\n        this.sendAnalytics()\n        this.$store.commit('authorize')\n\n        if (this.$store.state.isAuthenticated) {\n          this.handleAuthentication()\n        }\n      }\n    }\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SubscribeWithGoogle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SubscribeWithGoogle.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SubscribeWithGoogle.vue?vue&type=template&id=32fbc864&\"\nimport script from \"./SubscribeWithGoogle.vue?vue&type=script&lang=js&\"\nexport * from \"./SubscribeWithGoogle.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Analytics from '@/plugins/analytics'\n\nimport { store } from './store/store'\nimport session from './utils/session'\nimport { getGrecaptchaToken } from '@/utils/storeHelpers'\nimport api from '@/utils/api'\n\nimport { LoginMessages } from './utils/messages'\nimport Cookie from 'js-cookie'\nimport LoginCognito from '@/components/LoginCognito'\nimport Callback from '@/components/Callback'\nimport SubscribeWithGoogle from '@/components/SubscribeWithGoogle'\nimport {\n  accountLogout,\n  getEntitlements,\n  getAnalyticsApiData\n} from '@/vendor/amplitude/amplitudeUtils.js'\nimport { ampli } from '@/vendor/amplitude'\n\nVue.use(VueRouter)\nVue.use(Analytics)\n\nlet isAuthorized = async (to, from, next) => {\n  if (!store.state.isAuthenticated) {\n    next()\n    return\n  }\n\n  const settingsUrl = `${window.cpcConfig.MY_ACCOUNT_URL}profile-settings`\n\n  if (to.query.cardUpdateEmail) {\n    window.location = `${settingsUrl}?cardUpdateEmail=true`\n  } else if (to.params.validateEmailToken) {\n    try {\n      const token = await getGrecaptchaToken('activateemail')\n      const apiConfig = {\n        credentials: true,\n        headers: token ? { token } : null\n      }\n\n      /* When user arrives at log in page with validateEmailToken and is already logged in (happens for new Limio registration flow), \n      call \"user/activation\" endpoint to activate the email address of a new user before redirecting to settings page */\n      const { body } = await api.putWithConfig(\n        'user/activation',\n        to.params.validateEmailToken,\n        apiConfig\n      )\n\n      Cookie.set('activatedEmail', body.email, {\n        domain: '.theglobeandmail.com'\n      })\n      Vue.analytics.registerConfirmed()\n\n      /* Redirect user to settings page with the activated email address stored in activatedEmail cookie\n       to be used to display a confirmation message on the settings page */\n      window.location = settingsUrl\n    } catch (error) {\n      console.error(error)\n    }\n  } else {\n    window.location = settingsUrl\n  }\n}\n\nlet isAuthorizedForLogIn = (to, from, next) => {\n  to.meta && to.meta.isModal\n    ? localStorage.setItem('isModal', store.state.isModal)\n    : localStorage.removeItem('isModal')\n\n  if (to.query && Object.keys(to.query).length !== 0) {\n    store.commit('updateLogInQueryParams', { ...to.query })\n  }\n  if (store.state.isAuthenticated) {\n    next({\n      path: '/logout'\n    })\n  } else {\n    next()\n  }\n}\n\nlet verifyNewsletterToken = async (to, from, next) => {\n  const apiConfig = {\n    Accept: 'application/json'\n  }\n  const token = {\n    verificationToken: to.params.token\n  }\n\n  await api\n    .postWithConfigV4('user/newsletters/verify', token, apiConfig)\n    .then(response => {\n      Cookie.set('newsletterVerified', response.body.name, {\n        domain: '.theglobeandmail.com'\n      })\n    })\n    .finally(() => {\n      next()\n    })\n}\n\nfunction hashUrlPatternCheck(to, from, next) {\n  const fullPathPattern = /^\\/#\\//\n  const hashPattern = /^#\\//\n  const isOldUrlPattern =\n    fullPathPattern.test(to.fullPath) && hashPattern.test(to.hash)\n  if (isOldUrlPattern) {\n    const newFullPath = to.fullPath.substring(2)\n    next(newFullPath)\n  } else {\n    next({\n      path: '/login',\n      params: to.params,\n      query: to.query\n    })\n  }\n}\n\nconst routes = [\n  {\n    path: '',\n    beforeEnter: hashUrlPatternCheck\n  },\n  {\n    path: '/register',\n    beforeEnter: isAuthorized,\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register')\n  },\n  {\n    path: '/modal/register',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true }\n  },\n  {\n    path: '/modal/register/regwall',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true, regwallType: 'Default' }\n  },\n  {\n    path: '/modal/register/regwall/homeprice',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true, regwallType: 'HomePrice' }\n  },\n  {\n    path: '/modal/register/regwall/crosswords',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true, regwallType: 'Crosswords' }\n  },\n  {\n    path: '/modal/register/regwall/newsletter',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true, regwallType: 'Newsletter' }\n  },\n  {\n    path: '/modal/register/regwall/covid',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true, regwallType: 'COVID' }\n  },\n  {\n    path: '/modal/register/regwall/publicservice',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true, regwallType: 'PublicService' }\n  },\n  {\n    path: '/modal/register/regwall/photoarchive',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register'),\n    beforeEnter: isAuthorized,\n    meta: { isModal: true, regwallType: 'PhotoArchive' }\n  },\n  {\n    path: '/register/subscription',\n    beforeEnter: isAuthorized,\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register')\n  },\n  {\n    path: '/login/callback',\n    component: Callback,\n    meta: { isModal: true }\n  },\n  {\n    path: '/login/callback/swg',\n    component: SubscribeWithGoogle,\n    meta: { isModal: true }\n  },\n  {\n    path: '/login',\n    name: 'Login',\n    beforeEnter: isAuthorizedForLogIn,\n    component: LoginCognito,\n    props: true\n  },\n  {\n    path: '/login/:validateEmailToken',\n    beforeEnter: isAuthorized,\n    component: LoginCognito\n  },\n  {\n    path: '/modal/login',\n    component: LoginCognito,\n    beforeEnter: isAuthorizedForLogIn,\n    meta: { isModal: true }\n  },\n  {\n    path: '/modal/login/ios/universal',\n    component: LoginCognito,\n    meta: { isModal: true }\n  },\n  {\n    path: '/modal/login/android/universal',\n    component: LoginCognito,\n    meta: { isModal: true }\n  },\n  {\n    path: '/social-success',\n    component: () =>\n      import(/* webpackChunkName: \"social\" */ '@/components/SocialSuccess')\n  },\n  {\n    path: '/recover',\n    name: 'Recover',\n    props: true,\n    beforeEnter: isAuthorized,\n    component: () =>\n      import(/* webpackChunkName: \"recover\" */ '@/components/Recover')\n  },\n  {\n    path: '/modal/recover',\n    name: 'RecoverModal',\n    props: true,\n    beforeEnter: isAuthorized,\n    component: () =>\n      import(/* webpackChunkName: \"recover\" */ '@/components/Recover'),\n    meta: { isModal: true }\n  },\n  {\n    path: '/resetpassword/:token',\n    component: () =>\n      import(/* webpackChunkName: \"resetPassword\" */ '@/components/ResetPassword')\n  },\n  {\n    path: '/setpassword/:token',\n    beforeEnter: isAuthorized,\n    component: () =>\n      import(/* webpackChunkName: \"resetPassword\" */ '@/components/ResetPassword')\n  },\n  {\n    path: '/logout',\n    beforeEnter: async (to, from, next) => {\n      // Check if user has access to Globe Advisor\n      // If source is faa, then don't check for entitlements\n      // as user is coming from Globe Advisor\n      const hasCookie = Cookie.get('ontraportLogout') === 'true'\n      var isOntraportRedirect = false\n      if (\n        store.state.isAuthenticated &&\n        to.query.source !== 'faa' &&\n        !hasCookie\n      ) {\n        const analyticsApiData = await getAnalyticsApiData()\n        if (analyticsApiData && analyticsApiData.ssvcs) {\n          const access = getEntitlements(analyticsApiData.ssvcs)\n          if (access.ADVISOR) {\n            isOntraportRedirect = true\n            console.log(\n              'user has access to Globe Advisor - ontraport redirect to:',\n              window.cpcConfig.ONTRAPORT_LOGOUT\n            )\n            Cookie.set('ontraportLogout', true, {\n              domain: '.theglobeandmail.com'\n            })\n            window.location.href = window.cpcConfig.ONTRAPORT_LOGOUT\n          }\n        }\n      }\n      if (!isOntraportRedirect) {\n        let client_id\n        if (\n          store.state.logInQueryParams &&\n          Object.keys(store.state.logInQueryParams).length !== 0\n        ) {\n          localStorage.setItem(\n            'logInQueryParams',\n            JSON.stringify(store.state.logInQueryParams)\n          )\n        }\n\n        if (to.query.source == 'iam') {\n          await store.dispatch('unauthorize')\n\n          // Trigger accountLogout once user is logged out\n          await accountLogout()\n          ampli.client.flush()\n          ampli.client.reset() //invalidate & reset previous Amplitude session user_id when user logs out\n\n          const logInQuery = JSON.parse(\n            localStorage.getItem('logInQueryParams')\n          )\n          localStorage.removeItem('logInQueryParams')\n          const isModal = localStorage.getItem('isModal') === 'true'\n          localStorage.removeItem('isModal')\n          Cookie.remove('ontraportLogout', {\n            domain: '.theglobeandmail.com'\n          })\n\n          // Check if coming from Salesforce log in\n          if (Cookie.get('logInWithSalesforce')) {\n            try {\n              const logInWithSalesforce = JSON.parse(\n                Cookie.get('logInWithSalesforce')\n              )\n              Cookie.remove('logInWithSalesforce', {\n                domain: window.cpcConfig.COOKIE_DOMAIN\n              })\n              // Redirect back\n              next({ name: 'LoginAs', query: logInWithSalesforce })\n            } catch (e) {\n              console.log('logInWithSalesforce logout error: ', e)\n            }\n          } else if (logInQuery) {\n            isModal === 'true'\n              ? next({ path: '/modal/login', query: logInQuery })\n              : next({ path: '/login', query: logInQuery })\n          } else {\n            isModal === 'true'\n              ? next({ path: '/modal/login', query: to.query })\n              : next({ path: '/login', query: to.query })\n          }\n        } else {\n          if (to.query.client_id) {\n            if (to.query.client_id !== window.cpcConfig.LIMIO_CLIENT_ID) {\n              client_id = to.query.client_id\n            } else {\n              client_id = window.cpcConfig.COGNITO_USER_POOL_WEB_CLIENT_ID\n            }\n\n            window.location = `${\n              window.cpcConfig.COGNITO_AUTHORIZE_BASE_URL_LOGOUT\n            }/logout?client_id=${client_id}&logout_uri=${\n              window.cpcConfig.AUTHENTICATION_CALLBACK\n            }logout?source=iam`\n          } else if (\n            (window.cpcConfig.LIMIO_LAUNCH_FLAG === true &&\n              Cookie.get('lmo_session')) ||\n            localStorage.getItem('limioFlag')\n          ) {\n            // TODO: remove else if feature flag check and just keep it as else after SABRE project launch\n            window.location = `${window.cpcConfig.LIMIO_DOMAIN}api/sf/logout`\n          } else {\n            // TODO: else block to remove after project SABRE launch\n            client_id = window.cpcConfig.COGNITO_USER_POOL_WEB_CLIENT_ID\n\n            window.location = `${\n              window.cpcConfig.COGNITO_AUTHORIZE_BASE_URL_LOGOUT\n            }/logout?client_id=${client_id}&logout_uri=${\n              window.cpcConfig.AUTHENTICATION_CALLBACK\n            }logout?source=iam`\n          }\n        }\n      }\n    }\n  },\n  {\n    path: '/logout/:validateEmailToken',\n    beforeEnter: (to, from, next) => {\n      store\n        .dispatch('validateChangedEmail', to.params.validateEmailToken)\n        .then(() => {\n          return store.dispatch('unauthorize')\n        })\n        .then(() => {\n          Cookie.set(\n            'afterLoginGoTo',\n            `${window.cpcConfig.MY_ACCOUNT_URL}profile-settings`,\n            { domain: '.theglobeandmail.com' }\n          )\n          next('/login')\n          store.dispatch('flashMessage', LoginMessages.EMAIL_UPDATE_VERIFIED)\n        })\n        .catch(() => {\n          next('/login')\n          store.dispatch(\n            'flashMessage',\n            LoginMessages.UPDATE_EMAIL_VERIFICATION_ERROR\n          )\n        })\n    }\n  },\n  {\n    path: '/login-token',\n    name: 'LoginAs',\n    component: () =>\n      import(/* webpackChunkName: \"loginAs\" */ '@/components/LogInAs')\n  },\n  {\n    path: '/newsletter/verify/:token',\n    beforeEnter: verifyNewsletterToken,\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register')\n  },\n  {\n    path: '/newsletter/verify',\n    component: () =>\n      import(/* webpackChunkName: \"register\" */ '@/components/Register')\n  }\n]\n\nvar router = new VueRouter({\n  mode: 'history',\n  base: '/user/',\n  routes: routes\n})\n\nrouter.beforeEach((to, from, next) => {\n  if (session.isAuthenticated()) {\n    store.dispatch('authenticate')\n  }\n  store.commit('clearApiError')\n  const isModal = to.meta.isModal || false\n  if (!isModal) {\n    localStorage.removeItem('isModal')\n  }\n  store.commit('setModal', isModal)\n  next()\n})\n\nexport default router\n","import { email, min, max, regex, required } from 'vee-validate/dist/rules'\nimport { extend } from 'vee-validate'\nimport { RegisterMessages } from '@/utils/messages'\nimport api from '../utils/api'\nimport { getGrecaptchaToken } from '@/utils/storeHelpers'\n\nconst isModal = window.location.href.indexOf('/modal/') !== -1\n\nexport const extendValidationRules = () => {\n  extend('alpha_hyphen_spaces', {\n    message() {\n      return 'This field can contain letters, hyphens, and spaces only.'\n    },\n    validate(value) {\n      return /^[A-Z-\\s]*$/i.test(value)\n    }\n  })\n\n  extend('canadaPost', {\n    message: () => `Please enter a valid postal code`,\n    validate: value => {\n      return /^\\s*[a-ceghj-npr-tvxy]\\d[a-ceghj-npr-tv-z](\\s)?\\d[a-ceghj-npr-tv-z]\\d\\s*$/i.test(\n        value\n      )\n    }\n  })\n\n  extend('min', {\n    ...min,\n    message: (field, { length }) =>\n      `The ${field} field must be at least ${length} characters.`,\n    params: ['length']\n  })\n\n  extend('max', {\n    ...max,\n    message: (field, { length }) =>\n      `The ${field} field may not be greater than ${length} characters.`,\n    params: ['length']\n  })\n\n  extend('regex', {\n    ...regex,\n    message: `The {_field_} field format is invalid.`\n  })\n\n  extend('email', {\n    ...email,\n    message: 'The {_field_} field must be a valid email.'\n  })\n\n  extend('required', {\n    ...required,\n    message: 'The {_field_} field is required'\n  })\n\n  extend('unique_displayname', {\n    message(field, data) {\n      return Object.values(data.body.data.displayName.errors)[0]\n    },\n    async validate(value) {\n      const token = await getGrecaptchaToken('accountlogin')\n      const apiConfig = {\n        credentials: false,\n        headers: token ? { token } : null\n      }\n\n      return api\n        .postWithConfig('user/validate', { displayName: value }, apiConfig)\n        .then(response => {\n          if (response.body && response.body.result === true) {\n            return { valid: true }\n          }\n        })\n        .catch(err => {\n          return {\n            valid: false,\n            data: err\n          }\n        })\n    }\n  })\n\n  extend('unique_email', {\n    message(field, data) {\n      const errorKey = Object.keys(data.body.data.email.errors)[0]\n      if (errorKey === 'ALREADY_TAKEN') {\n        return RegisterMessages.ALREADY_TAKEN(isModal)\n      } else {\n        return (\n          RegisterMessages[errorKey] ||\n          Object.values(data.body.data.email.errors)[0]\n        )\n      }\n    },\n    async validate(value) {\n      const token = await getGrecaptchaToken('accountlogin')\n      const apiConfig = {\n        credentials: false,\n        headers: token ? { token } : null\n      }\n\n      return api\n        .postWithConfig('user/validate', { email: value }, apiConfig)\n        .then(response => {\n          if (response.body && response.body.result === true) {\n            return { valid: true }\n          }\n        })\n        .catch(err => {\n          return {\n            valid: false,\n            data: err\n          }\n        })\n    }\n  })\n}\n\nexport default extendValidationRules\n","const { RECAPTCHA_SITE_KEY } = window.cpcConfig\nexport const TIMEOUT = 5000\n\nconst script = document.createElement('script')\nexport const src = `https://www.google.com/recaptcha/api.js?render=${RECAPTCHA_SITE_KEY}`\nscript.setAttribute('src', src)\n\nconst handleCancel = function(reject) {\n  return function() {\n    reject()\n  }\n}\n\nconst handleLoad = function(timer, resolve) {\n  return function() {\n    window.grecaptcha.ready(() => {\n      clearTimeout(timer)\n      resolve()\n    })\n    script.removeEventListener('load', onload)\n  }\n}\n\nconst importRecaptcha = function() {\n  // 1. Set up conditions for loading the script\n  // a) while the script is loading, put a promise in its place\n  window.grecaptcha = new Promise(function(resolve, reject) {\n    // b) time out the load so the promise doesn't hang\n    // even if the http request fails\n    const onCancel = handleCancel(reject)\n    const timer = setTimeout(onCancel, TIMEOUT)\n    const onLoad = handleLoad(timer, resolve)\n    // c) when the script loads, cancel the timer and resolve the promise\n    script.addEventListener('load', onLoad)\n  })\n  // 2. Start loading the script\n  document.body.appendChild(script)\n}\n\nexport default importRecaptcha\n","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport { library } from '@fortawesome/fontawesome-svg-core'\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'\nimport { faFacebookF } from '@fortawesome/free-brands-svg-icons/faFacebookF'\nimport { faGoogle } from '@fortawesome/free-brands-svg-icons/faGoogle'\nimport { store } from './store/store'\nimport VueResource from 'vue-resource'\nimport { setInteractionMode } from 'vee-validate'\nimport App from './App'\nimport Analytics from './plugins/analytics'\nimport router from './routes'\nimport { extendValidationRules } from '@/utils/validations'\nimport importRecaptcha from '@/utils/importRecaptcha'\nimport { ampli } from './vendor/amplitude'\n\nconst envName = window.cpcConfig.ENV_NAME.toLowerCase()\nconst environment = envName === 'prod' ? 'prod' : 'dev'\n\nampli.load({\n  environment,\n  client: {\n    configuration: {\n      defaultTracking: false\n    }\n  }\n})\n\n// sendBeacon sends events in the background, even if the user closes the browser or leaves the page\nwindow.addEventListener('pagehide', () => {\n  ampli.client.setTransport('beacon') // Sets https transport to use `sendBeacon` API\n  ampli.flush() // Flushes the events in the event queue\n})\n\n// font-awesome configuration\nlibrary.add(faGoogle, faFacebookF)\nVue.component('font-awesome-icon', FontAwesomeIcon)\n\n// vee-validate configuration\nextendValidationRules()\nsetInteractionMode('blur', () => ({ on: ['blur'] }))\n\nVue.use(VueResource)\nVue.use(Analytics)\nimportRecaptcha()\n\n/* eslint-disable no-new */\nnew Vue({\n  el: '#app',\n  store,\n  router,\n  components: { App },\n  render: h => h('app')\n})\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAuIwAALiMBeKU/dgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAF6SURBVGiB1dlvTgIxEIfhV7nArngQCcHDixcAUZd7mHgE/bBMUnD/tN12Zvwl/UKG5aEhu8wUrrMBXoE1ftIAL8DzWMEG+AJ+gE984BvgSG/6ZgAfomVZ40O0rCv8ENoaP4T+g9+PFMg6Aa0i+gF4nzHtof92h5lCrZ2f2mlZH6HFA74B3lLQHvDZaEv8YrQFvhhaE9+WRmvgq6Fr4quja+Bb+gdadXRJvDq6BN4MvQRvjs7Bu0FLYkAn4BxRo/nPE4jbeTc7fZtcvClakop3gZbE4ouh70tcBLgDVhF1q0uti8TcYcJ1Bh5NpEFS0S7wuWhT/BroZmAxD6AOZ09NuXvE1HYo7HxOE2COX9K5xLy3Cr5EN66OLzlCUMMXn3sk4Bd1+LW68ZhrZ40+aqKr4ZNHvR7wmuiUz5zEW6AX4y3R2XgP6Cz8vz28emL8uNCqsZ07LtxJ4RDeuhsfO6Dd3RaGeGu0JJweDKIlW/rfj/pYbCItvWkbvvgLh9Klj447fAAAAAAASUVORK5CYII=\"","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/google-logo.7606daf1.svg\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TgamLink.vue?vue&type=style&index=0&id=1da55747&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TgamLink.vue?vue&type=style&index=0&id=1da55747&lang=scss&scoped=true&\"","import Cookie from 'js-cookie'\nimport amelia from '@tgam/amelia'\nimport { store } from '@/store/store'\nimport Vue from 'vue'\nimport VueResource from 'vue-resource'\n\nVue.use(VueResource)\n\nconst ameliaInit = async function() {\n  const sophiId = Cookie.get('sp_tgamid.a05e')\n\n  if (!sophiId) {\n    console.error(\n      'Amelia cannot run because the necessary user id could not be retrieved.'\n    )\n    return\n  }\n\n  const userId = sophiId?.split('.')[0]\n\n  await Vue.http\n    .get(window.cpcConfig.AMELIA_COLLECTION_API)\n    .then(response => {\n      const { experiments = [] } = { ...response.body }\n\n      // call amelia and store the experiments returned by it in a variable\n      const { experiments: processedExperiments = [] } = amelia({\n        datafile: { experiments },\n        user: { id: userId }\n      })\n\n      // commit processed experiements to the store\n      store.commit('setAmeliaState', { experiments: processedExperiments })\n    })\n    .catch(error => {\n      console.error(\n        'Error in retrieving data from amelia collection api',\n        error\n      )\n    })\n}\n\nexport { ameliaInit }\n","module.exports = __webpack_public_path__ + \"img/apple-logo.556432d8.svg\";","const AnalyticsPlugin = {\n  // sends Amelia abTests to the analyticsLayer\n  sendAmeliaEvent(experiments = []) {\n    window.analyticsLayer.push({ event: 'abTests', abTests: experiments })\n  },\n  pageview(pageName) {\n    window.analyticsLayer.push({\n      event: 'page',\n      page: {\n        name: pageName,\n        type: 'CPC',\n        url: document.location.href\n      }\n    })\n  },\n  pageLoaded() {\n    window.analyticsLayer.push({\n      event: 'pageLoaded'\n    })\n  },\n  login() {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'login',\n        action: 'sign in',\n        loginprovider: 'tgam'\n      }\n    })\n  },\n  registerInitiated() {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'registration',\n        action: 'initiated',\n        loginprovider: 'tgam'\n      }\n    })\n  },\n  registerComplete() {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'registration',\n        action: 'completed',\n        loginprovider: 'tgam'\n      }\n    })\n  },\n  registerConfirmed() {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'registration',\n        action: 'email confirmed',\n        loginprovider: 'tgam'\n      }\n    })\n  },\n  logout() {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'login',\n        action: 'sign out'\n      }\n    })\n  },\n  socialLogin(provider) {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'login',\n        action: 'sign in',\n        loginprovider: provider\n      }\n    })\n  },\n  socialRegisterInitiated(provider) {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'registration',\n        loginprovider: provider,\n        action: 'initiated'\n      }\n    })\n  },\n  socialRegisterComplete(provider) {\n    window.analyticsLayer.push({\n      event: 'accountEvent',\n      accountEvent: {\n        type: 'registration',\n        action: 'completed',\n        loginprovider: provider\n      }\n    })\n  },\n  recoverPassword() {\n    window.analyticsLayer.push({\n      event: 'clickEvent',\n      clickEvent: {\n        type: 'button',\n        feature: 'Forgot your password?',\n        label: 'Send me instructions',\n        action: 'instructions sent',\n        page: document.location.href\n      }\n    })\n  },\n  resetPassword() {\n    window.analyticsLayer.push({\n      event: 'clickEvent',\n      clickEvent: {\n        type: 'button',\n        feature: 'Reset Your Password',\n        label: 'Reset Password',\n        action: 'success',\n        page: document.location.href\n      }\n    })\n  }\n}\n\nexport default Vue => {\n  Vue.analytics = AnalyticsPlugin\n  Object.defineProperties(Vue.prototype, {\n    $analytics: {\n      get: () => {\n        return Vue.analytics\n      }\n    }\n  })\n}\n","import Vue from 'vue'\nimport VueResource from 'vue-resource'\n\nVue.use(VueResource)\n\nconst api = {\n  get: function(url, credentials) {\n    return Vue.http\n      .get(`${window.cpcConfig.USERMANAGEMENTAPI}api/v3/${url}`, {\n        credentials: credentials\n      })\n      .then(response => response)\n      .catch(error => error)\n  },\n  getV2: function(url, credentials) {\n    return Vue.http\n      .get(`${window.cpcConfig.USERMANAGEMENTAPI}v2/${url}`, {\n        credentials: credentials\n      })\n      .then(response => response)\n      .catch(error => error)\n  },\n  post: function(url, credentials, payload = null) {\n    return Vue.http\n      .post(`${window.cpcConfig.USERMANAGEMENTAPI}api/v3/${url}`, payload, {\n        credentials\n      })\n      .then(response => {\n        if (response.ok) {\n          return response\n        } else {\n          return Promise.reject(response)\n        }\n      })\n      .catch(error => {\n        return Promise.reject(error)\n      })\n  },\n  postPublicV3: function(url, credentials, payload = null) {\n    return Vue.http\n      .post(`${window.cpcConfig.USERMANAGEMENTAPI}public/v3/${url}`, payload, {\n        credentials\n      })\n      .then(response => {\n        if (response.ok) {\n          return response\n        } else {\n          return Promise.reject(response)\n        }\n      })\n      .catch(error => {\n        return Promise.reject(error)\n      })\n  },\n  postWithConfig: function(url, body = null, config = {}) {\n    return Vue.http\n      .post(`${window.cpcConfig.USERMANAGEMENTAPI}api/v3/${url}`, body, config)\n      .then(response => {\n        if (response.ok) {\n          return response\n        } else {\n          return Promise.reject(response)\n        }\n      })\n      .catch(error => {\n        return Promise.reject(error)\n      })\n  },\n  postWithConfigV4: function(url, body = null, config = {}) {\n    return Vue.http\n      .post(`${window.cpcConfig.USERMANAGEMENTAPI}api/v4/${url}`, body, config)\n      .then(response => {\n        return response.ok ? response : Promise.reject(response)\n      })\n      .catch(error => {\n        return Promise.reject(error)\n      })\n  },\n  postToCheckEntitlements: function(body = null, config = {}) {\n    return Vue.http\n      .post(\n        `${window.cpcConfig.USERMANAGEMENTAPI}api/v1/entitlements/google`,\n        body,\n        config\n      )\n      .then(response => {\n        return response\n      })\n      .catch(error => {\n        return error\n      })\n  },\n  put: function(url, credentials, payload) {\n    let params\n    if (payload) {\n      params = payload\n    } else {\n      params = null\n    }\n    return Vue.http\n      .put(\n        `${window.cpcConfig.USERMANAGEMENTAPI}api/v3/${url}`,\n        params || null,\n        { credentials: credentials }\n      )\n      .then(response => {\n        if (response.ok) {\n          return response\n        } else {\n          return Promise.reject(response)\n        }\n      })\n      .catch(error => {\n        return Promise.reject(error.data)\n      })\n  },\n  putWithConfig: function(url, payload, config) {\n    let body\n    if (payload) {\n      body = payload\n    } else {\n      body = null\n    }\n    return Vue.http\n      .put(`${window.cpcConfig.USERMANAGEMENTAPI}api/v3/${url}`, body, config)\n      .then(response => {\n        if (response.ok) {\n          return response\n        } else {\n          return Promise.reject(response)\n        }\n      })\n      .catch(error => {\n        return Promise.reject(error.data)\n      })\n  },\n  delete: function(url, credentials) {\n    return Vue.http\n      .delete(`${window.cpcConfig.USERMANAGEMENTAPI}api/v3/${url}`, {\n        credentials: credentials\n      })\n      .then(response => response)\n      .catch(error => error)\n  }\n}\n\nexport default api\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecaptchaText.vue?vue&type=style&index=0&id=5a948e63&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecaptchaText.vue?vue&type=style&index=0&id=5a948e63&lang=scss&scoped=true&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmMessage.vue?vue&type=style&index=0&id=1b7adc24&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmMessage.vue?vue&type=style&index=0&id=1b7adc24&lang=scss&scoped=true&\"","let limioMixin = {\n  methods: {\n    getLimioLogInParams() {\n      if (localStorage.getItem('logInWithLimio')) {\n        return\n      }\n\n      if (!this.$route.query.ext_client_id) {\n        return\n      }\n\n      const query = this.$route.query\n\n      // Store Limio log in query params in local storage.\n      localStorage.setItem(\n        'logInWithLimio',\n        JSON.stringify({\n          ext_response_type: query.ext_response_type,\n          ext_client_id: query.ext_client_id,\n          ext_redirect_uri: query.ext_redirect_uri,\n          ext_scope: query.ext_scope,\n          ext_state: query.ext_state\n        })\n      )\n    },\n    redirectToOauth2UrlWithLimioParams() {\n      const logInWithLimio =\n        JSON.parse(localStorage.getItem('logInWithLimio')) || {}\n      localStorage.removeItem('logInWithLimio')\n\n      const oauth2Url = window.cpcConfig.OAUTH2_URL\n\n      // Redirect to new auth server for Limio integration\n      window.location = `${oauth2Url}?response_type=${\n        logInWithLimio.ext_response_type\n      }&client_id=${logInWithLimio.ext_client_id}&redirect_uri=${\n        logInWithLimio.ext_redirect_uri\n      }&scope=${logInWithLimio.ext_scope}&state=${logInWithLimio.ext_state}`\n    }\n  }\n}\n\nexport default limioMixin\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BaseCheckbox.vue?vue&type=style&index=0&id=38f7e036&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BaseCheckbox.vue?vue&type=style&index=0&id=38f7e036&scoped=true&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('label',{staticClass:\"custom-checkbox__container\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.isCheckedValue),expression:\"isCheckedValue\"}],attrs:{\"type\":\"checkbox\"},domProps:{\"value\":_vm.inputValue,\"checked\":_vm.isCheckedValue,\"checked\":Array.isArray(_vm.isCheckedValue)?_vm._i(_vm.isCheckedValue,_vm.inputValue)>-1:(_vm.isCheckedValue)},on:{\"change\":[function($event){var $$a=_vm.isCheckedValue,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=_vm.inputValue,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.isCheckedValue=$$a.concat([$$v]))}else{$$i>-1&&(_vm.isCheckedValue=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.isCheckedValue=$$c}},function($event){return _vm.$emit('checkboxChanged', _vm.isCheckedValue)}]}}),_c('span',{staticClass:\"custom-checkbox__checkmark\",style:(_vm.checkmarkStyle)}),_c('span',{staticClass:\"custom-checkbox__description\"},[_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <label class=\"custom-checkbox__container\">\n      <input\n        v-model=\"isCheckedValue\"\n        type=\"checkbox\"\n        :value=\"inputValue\"\n        :checked=\"isCheckedValue\"\n        @change=\"$emit('checkboxChanged', isCheckedValue)\"\n      />\n      <span class=\"custom-checkbox__checkmark\" :style=\"checkmarkStyle\"></span>\n      <span class=\"custom-checkbox__description\">\n        <slot></slot>\n      </span>\n    </label>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    inputValue: {\n      type: String,\n      required: true\n    },\n    checkmarkStyle: {\n      type: String,\n      default: ''\n    },\n    isChecked: {\n      type: Boolean,\n      default: true\n    }\n  },\n  data() {\n    return {\n      isCheckedValue: this.isChecked // save prop value in component's data property to emit when checkbox is updated\n    }\n  }\n}\n</script>\n\n<style scoped lang=\"scss\">\n.custom-checkbox {\n  &__container {\n    display: flex;\n    align-items: center;\n    width: fit-content;\n    cursor: pointer;\n\n    input {\n      /* Hide the browser's default checkbox */\n      position: absolute;\n      opacity: 0;\n      cursor: pointer;\n      height: 0;\n      width: 0;\n\n      /* When the checkbox is checked, add a black background */\n      &:checked ~ .custom-checkbox__checkmark {\n        background-color: $color-black-100;\n        border: 0.063rem solid $color-black-100;\n      }\n\n      /* Show the checkmark when checked */\n      &:checked ~ .custom-checkbox__checkmark:after {\n        display: block;\n      }\n\n      /* When focused, add outline to the custom checkbox */\n      &:focus ~ .custom-checkbox__checkmark {\n        outline-color: $color-focus;\n        outline-width: 0.125rem;\n        outline-style: solid;\n      }\n    }\n  }\n\n  /* Create a custom checkbox */\n  &__checkmark {\n    position: absolute;\n    height: 1.125rem;\n    width: 1.125rem;\n    background-color: $color-white;\n    border: 0.063rem solid $color-grey-400;\n    border-radius: 0.125rem;\n  }\n\n  /* Create the checkmark (hidden when not checked) */\n  &__checkmark:after {\n    content: '';\n    position: absolute;\n    display: none;\n  }\n\n  /* Style the checkmark */\n  &__checkmark:after {\n    left: 0.25rem;\n    top: -0.063rem;\n    width: 0.5rem;\n    height: 0.875rem;\n    border: solid $color-white;\n    border-width: 0 0.125rem 0.125rem 0;\n    border-radius: 0 10% 20% 10%;\n    transform: rotate(45deg);\n  }\n\n  &__description {\n    margin-left: 1.5rem;\n    color: $color-grey-600;\n  }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BaseCheckbox.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BaseCheckbox.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./BaseCheckbox.vue?vue&type=template&id=38f7e036&scoped=true&\"\nimport script from \"./BaseCheckbox.vue?vue&type=script&lang=js&\"\nexport * from \"./BaseCheckbox.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BaseCheckbox.vue?vue&type=style&index=0&id=38f7e036&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"38f7e036\",\n  null\n  \n)\n\nexport default component.exports","const getGrecaptchaToken = async actionLabel => {\n  let grecaptchaToken\n  try {\n    // on initial load, wait for the grecaptcha library to be ready\n    if (window.grecaptcha.execute === undefined) {\n      await window.grecaptcha\n    }\n    grecaptchaToken = await window.grecaptcha.execute(\n      window.cpcConfig.RECAPTCHA_SITE_KEY,\n      { action: actionLabel }\n    )\n  } catch (err) {\n    grecaptchaToken = null\n  }\n  return grecaptchaToken\n}\n\nexport { getGrecaptchaToken }\n","import { csrPhoneNumber } from '@/utils/constants'\n\nconst LoginMessages = {\n  BAD_CREDENTIALS: `Incorrect email and/or password. Try again or click Forgot password to reset it.`,\n  ACCOUNT_NOT_ACTIVE: `You need to confirm your email address before we can log you in`,\n  REGISTER_EMAIL_VERIFIED: `Done! Your account has been activated.`,\n  REGISTER_EMAIL_VERIFICATION_ERROR: `<div>\n                                    <h3 class=\"text-center\">Verification error </h3>\n                                    <p>You are seeing this page because one of two things has happened:</p>\n                                    <p>It's been more than 30 days since we sent you an email asking you to confirm your email address. The link contained in that email is no longer valid.</p>\n                                    <p><a class=\"redLink\" href=\"${\n                                      window.cpcConfig.LOGIN_REGISTER_URL\n                                    }register\">You should register with us again</a></p>\n                                    <p>You've already successfully registered with us and your email address has already been verified. </p>\n                                    <p><a class=\"redLink\" href=\"${\n                                      window.cpcConfig.LOGIN_REGISTER_URL\n                                    }login\">Perhaps you'd like to login?</a></p>\n                                </div>`,\n  FACEBOOK_EMAIL_MISSING:\n    'Facebook did not return an email address. Your Facebook account must have a verified email address to register.',\n  INTERNAL_SERVER_ERROR: `We are currently experiencing technical difficulties. We're working to resolve the issue.`,\n  GENERIC_ERROR: `There was an error. Please try again later.`,\n  ALREADY_EXISTS: 'The account has already been activated.',\n  EMAIL_UPDATE_VERIFIED: 'Your email has been updated.',\n  UPDATE_EMAIL_VERIFICATION_ERROR:\n    'There was an error activating your updated email address, you may have already activated this address.',\n  BAD_CREDENTIALS_STRICT:\n    \"We've updated our systems to improve your security and require that you reset your password.\"\n}\nconst ResetPasswordMessages = {\n  RESET_PASSWORD_SAVED: `Your new password has been saved.`,\n  PASSWORD_ERROR: 'Password is invalid. Please try again.',\n  RESET_PASSWORD_ERROR: `We are currently experiencing technical difficulties. Please contact our Customer Care team at ${csrPhoneNumber}.`,\n  GENERIC_ERROR: `There was an error. Please try again later.`,\n  RESET_PASSWORD_TOKEN_INVALID: `ERROR! This link is no longer valid.`,\n  SOCIAL_ONLY_ACCOUNT: `Reset password is unavailable for this account. Try signing in with your social account on the log in page or contact Customer Support at ${csrPhoneNumber}.`\n}\n\nconst RecoverMessages = {\n  NOTHING_FOUND_RECOVER: 'This email does not exist in our records',\n  BAD_CREDENTIALS: `The password you've entered doesn't match that display name`,\n  GENERIC_ERROR: 'There was an error. Please try again later.'\n}\n\nconst RegisterMessages = {\n  INTERNAL_SERVER_ERROR: `We are currently experiencing technical difficulties. We're working to resolve the issue.`,\n  PASSWORD_ERROR: 'Password is invalid. Please try again.',\n  GENERIC_ERROR: `There was an error. Please try again later.`,\n  ALREADY_TAKEN: isModal => {\n    let loginLink = `<a\n    href=\"/user/${isModal ? 'modal/' : ''}login\"\n    style=\"text-decoration:underline;\"\n  >log in</a>`\n    const limioParams = localStorage.getItem('logInWithLimio')\n      ? JSON.parse(localStorage.getItem('logInWithLimio'))\n      : ''\n\n    if (limioParams) {\n      let queryParams = []\n      for (const key in limioParams) {\n        queryParams.push(`${key}=${limioParams[key]}`)\n      }\n      queryParams = `?${queryParams.join('&')}`\n      loginLink = `<a\n    href=\"/user/login${queryParams}\"\n    style=\"text-decoration:underline;\"\n  >log in</a>`\n    }\n\n    return `This email is already in use. Try to ${loginLink} or <a class=\"redLink\" style=\"text-decoration:underline;\" href=\"${\n      window.cpcConfig.PASSWORD_RESET_URL\n    }\">reset your password</a>.`\n  },\n  NO_ACCOUNT_FOUND:\n    \"The email that matches your account doesn't match an existing Globe and Mail account. Please register to create one.\",\n  FACEBOOK_EMAIL_MISSING:\n    'Facebook did not return an email address. Your Facebook account must have a verified email address to register.',\n  ALREADY_TAKEN_UNVERIFIED_EMAIL: `<p>The email is already in use. Please contact our Customer Care team <a href=\"https://globeandmail.force.com/helpcentre/s/contactsupport\" target=\"_blank\"><strong>online</strong></a> or call ${csrPhoneNumber}.</p>`,\n  ALREADY_TAKEN_EMAIL_UNDER30D:\n    'This email is in use, but has not been confirmed.',\n  NEWSLETTER_VERIFIED: newsletterName => {\n    return `You’ve successfully signed up for the ${newsletterName} newsletter. To manage your newsletters, you can create an account.`\n  },\n  NEWSLETTER_ERROR: `The confirmation link is no longer valid. To sign up again, visit our <a class=\"newsletters-link\" href=\"${\n    window.cpcConfig.TGAM_LINKS_HOST\n  }newsletters/\">newsletter page</a>.`\n}\nexport {\n  LoginMessages,\n  ResetPasswordMessages,\n  RecoverMessages,\n  RegisterMessages\n}\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SocialLogInSwg.vue?vue&type=style&index=0&id=5c865bc6&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SocialLogInSwg.vue?vue&type=style&index=0&id=5c865bc6&lang=scss&scoped=true&\"","export const csrPhoneNumber = '1-800-387-5400'\n\nexport default {\n  csrPhoneNumber\n}\n","/* tslint:disable */\n/* eslint-disable */\n// @ts-nocheck\n/**\n * Ampli - A strong typed wrapper for your Analytics\n *\n * This file is generated by Amplitude.\n * To update run 'ampli pull website'\n *\n * Required dependencies: @amplitude/analytics-browser@^1.3.0\n * Tracking Plan Version: 4\n * Build: 1.0.0\n * Runtime: browser:javascript-ampli-v2\n *\n * [View Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest)\n *\n * [Full Setup Instructions](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/implementation/website)\n */\n\nimport * as amplitude from '@amplitude/analytics-browser';\n\n/**\n * @typedef BaseEvent\n * @type {object}\n * @property {string} event_type\n * @property {Object.<string, *>} [event_properties]\n */\n\n/**\n * @typedef Plan\n * @type {object}\n * @property {string} [branch]\n * @property {string} [source]\n * @property {string} [version]\n * @property {string} [versionId]\n */\n\n/**\n * @typedef LoadClientOptions\n * @type {object}\n * @property {string} [apiKey]\n * @property {Object} [configuration]\n * @property {BrowserClient} [instance]\n */\n\n/**\n * @typedef LoadOptions\n * @type {object}\n * @property {'dev'|'prod'} [environment]\n * @property {boolean} [disabled]\n * @property {LoadClientOptions} [client]\n */\n\n/**\n * @typedef {Object} EventOptions\n * @type {object}\n */\n\n/**\n * @typedef ApiKey\n * @type {object}\n * @property {string} dev\n * @property {string} prod\n */\nexport const ApiKey = {\n  dev: '38534ef89a01423d002a5e25eeff140c',\n  prod: '21ef8903bbf33cfc2cf72e381844b699'\n};\n\n/**\n * @typedef {Object} AccountEvents\n * @param {string} [account action] The type of action taken in an account event (ex. email change success, registration initiated, etc.)\n * @param {string} account login provider The login provider in an account event (ex. tgam, GOOGLE, FACEBOOK)\n */\n\n/**\n * @typedef {Object} Article\n * @param {string[]} [article byline] Author or authors of an article\n * @param {string} [article colour] Article colour or access category of an article (ex. red, yellow, green)\n * @param {number} [article content size] Number of words in an article\n * @param {string} [article content type] Type of article (ex. longread, column, etc.)\n * @param {string} [article creditline] Creditline of an article (ex. reuters)\n * @param {string} article headline Headline of an article\n * @param {string} article id The distinct ID of an article\n * @param {string[]} [article keywords] Keywords assigned to an article\n * @param {string} [article last modified date] Modified date of an article\n * @param {string} [article ownership] Source of an article (ex. staff writer, wire, etc.)\n * @param {string} [article publish date] Publish date of an article in EST, ISO date format\n * @param {string[]} [article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n * @param {string} [article topics] Topics assigned to an article\n * @param {boolean} [is sponsored] Describes whether the content is sponsored or not\n * @param {string[]} [stock tickers] Array of stock tickers that appeared on an article.\n */\n\n/**\n * @typedef {Object} ArticleConversions\n * @param {string[]} [last article byline] The author or authors of the last article read by the user\n * @param {string} [last article colour] The article colour of the last article read by the user\n * @param {string} [last article headline] The headline of the article last read by a user\n * @param {string} [last article id] The article ID of the last article read by the user\n * @param {string[]} [last article keywords] The keywords of the last article read by the user\n * @param {string[]} [last article tags] The article tag of the last article read by a user.\n * @param {string} [last article topics] The article topics associated with the last article read by the user\n * @param {string} [last content type] Type of article (ex. longread, column, etc.) last read by the user\n */\n\n/**\n * @typedef {Object} AudioAndVideoEvents\n * @param {boolean} [is mute] Describes whether the video played was on mute or not\n * @param {string} [media content id] A distinct ID for video or audio content - for audio articles, this would be the article ID.\n * @param {number} [media duration seconds] The length of the video or audio in seconds\n * @param {number} [media elapsed seconds] Elapsed time in seconds for the video or audio\n * @param {string} [media feature type] Placement of the audio or video on the page (ex. page part, article part, main)\n * @param {string} [media player] Name of the video or audio player platform\n * @param {string} media title Title of the video or audio\n */\n\n/**\n * @typedef {Object} Browser\n * @param {number} [browser view height] Height of browser in pixels\n * @param {number} [browser view width] Width of browser in pixels\n */\n\n/**\n * @typedef {Object} ClickEvents\n * @param {string} [click article id] The article ID of the link clicked on by the user.\n * @param {string} [click element content] This is used only to track clicks to the Subscribe with Google pop up banner.\n * @param {string} [click feature] The name of the feature clicked on by the user.\n * @param {string} [click label] The label on the button or link clicked on by the user.\n * @param {string} [click target url] The URL destination of the link or button that was clicked on.\n */\n\n/**\n * @typedef {Object} MarketingConversions\n * @param {string} [first marketing campaign] The first utm campaign the user encountered in their session\n * @param {string} [first marketing content] The first utm content the user encountered in their session\n * @param {string} [first marketing medium] The first utm medium the user encountered in their session\n * @param {string} [first marketing source] The first utm source the user encountered in their session\n * @param {string} [first marketing terms] The first utm_term the user encountered in their session\n * @param {string} [first referrer host] The first referral host that brought a user to the site for a specific session\n * @param {string} [last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n * @param {string} [last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n * @param {string} [last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n * @param {string} [last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n * @param {string} [last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n * @param {string} [last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n */\n\n/**\n * @typedef {Object} NewsletterEvents\n * @param {string} [newsletter frequency] The frequency the newsletter the user subscribed to is sent (ex. sent saturdays, sent weekday mornings, etc.)\n * @param {string} newsletter name Name of newsletter the user subscribed or unsubscribed to\n */\n\n/**\n * @typedef {Object} Page\n * @param {string} app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n * @param {string} canonical url Canonical URL of the page (strips all paramters in the URL)\n * @param {string} environment User environment during the session (prod, dev, or stg)\n * @param {string} host name Site or host where content is published\n * @param {string} [internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n * @param {string} [marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n * @param {string} [marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n * @param {string} [marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n * @param {string} [marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n * @param {string} [marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n * @param {string} [page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n * @param {string} page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n * @param {string} page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n * @param {string} [page type] The type of page (ex. article, section, video, etc.)\n * @param {string} page url Page URL of the page a user browsed.\n * @param {string} [press release organization] The press release organization that provided a press release for a stock page.\n * @param {string} referrer host The host name of the referral URL.\n * @param {string} referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n * @param {string} section The name of the section\n * @param {string} [subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n * @param {string} [subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n * @param {string} [subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n * @param {string} [subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n * @param {string} [user agent string] User agent string of a device\n */\n\n/**\n * @typedef {Object} PageConversions\n * @param {string} [last subsection 1] Name of the last subsection 1 viewed by the user\n * @param {string} [last subsection 2] Name of the last subsection 2 viewed by the user\n * @param {string} [last subsection 3] Name of the last subsection 3 viewed by the user\n * @param {string} [last subsection 4] Name of the last subsection 4 viewed by the user\n */\n\n/**\n * @typedef {Object} SiteSearchEvents\n * @param {string[]} [site search filters] Values of the filters applied on the advanced search on the website. This is not available for app.\n * @param {number} [site search results] Number of search page results returned by the search bar\n * @param {string[]} [site search terms] Array of search terms used by a user from the search bar\n */\n\n/**\n * @typedef {Object} SubscriptionEvents\n * @param {string} subscription campaign code Subscription offer (ex. EVERGREEN6, NYT21). Note that this is present on all pages in the subscription funnel, including success pages.\n * @param {string} subscription funnel Type of subscription funnel (ex. GAMDIGITAL3, GAMDIGITALFREE)\n * @param {string} subscription payment method Payment method used to purchase a subscription (ex. VISA, MC, PAYPAL_SUBSCRIPTION)\n * @param {string} subscription type Type of subscription (ex. digital)\n */\n\n/**\n * @typedef {Object} WallConversions\n * @param {string} [last wall name] Name of the latest wall encountered by the user\n * @param {string} [last wall reason] The latest Sophi reason for showing the wall to the user\n * @param {string} [last wall type] The latest wall type shown to a user\n */\n\n/**\n * @typedef {Object} WallEvents\n * @param {string} wall name Name of the wall shown to the user (ex. google regwall, globe advisor regwall, paywall, etc.)\n * @param {*} [wall reason] Sophi algorithm reason for why the user was shown a wall.\n * @param {string} [wall trace id] Wall trace ID from Sophi dynamic paywall API response\n * @param {string} [wall type] Type of wall shown to a user (ex. paywall-hard, regwall-hard, regwall-metered, etc.)\n * @param {string} [wall visibility] Wall visibility from Sophi dynamic paywall API response\n * @param {number} [wall visible paragraphs] Number of visible paragraphs after a user encounters a wall\n */\n\n/**\n * Default Amplitude configuration options. Contains tracking plan information.\n */\nexport const DefaultConfiguration = {\n  plan: {\n    version: '4',\n    branch: 'main',\n    source: 'website',\n    versionId: '5c274d57-fb1c-46fb-b750-cbaf70d9e0c6'\n  },\n  ...{\n    ingestionMetadata: {\n      sourceName: 'browser-javascript-ampli',\n      sourceVersion: '2.0.0'\n    }\n  }\n};\n\nexport class Identify {\n  constructor(properties) {\n    this.event_type = amplitude.Types.SpecialEventType.IDENTIFY;\n    this.event_properties = properties;\n  }\n}\n\nexport class AccountInteraction {\n  constructor(properties) {\n    this.event_type = 'account_interaction';\n    this.event_properties = properties;\n  }\n}\n\nexport class AccountLogin {\n  constructor(properties) {\n    this.event_type = 'account_login';\n    this.event_properties = properties;\n  }\n}\n\nexport class AccountLogout {\n  constructor(properties) {\n    this.event_type = 'account_logout';\n    this.event_properties = properties;\n  }\n}\n\nexport class AccountRegistration {\n  constructor(properties) {\n    this.event_type = 'account_registration';\n    this.event_properties = properties;\n  }\n}\n\nexport class AccountSubscription {\n  constructor(properties) {\n    this.event_type = 'account_subscription';\n    this.event_properties = properties;\n  }\n}\n\nexport class ArticleView {\n  constructor(properties) {\n    this.event_type = 'article_view';\n    this.event_properties = properties;\n  }\n}\n\nexport class AudioComplete {\n  constructor(properties) {\n    this.event_type = 'audio_complete';\n    this.event_properties = properties;\n  }\n}\n\nexport class AudioPause {\n  constructor(properties) {\n    this.event_type = 'audio_pause';\n    this.event_properties = properties;\n  }\n}\n\nexport class AudioPlay {\n  constructor(properties) {\n    this.event_type = 'audio_play';\n    this.event_properties = properties;\n  }\n}\n\nexport class ButtonClick {\n  constructor(properties) {\n    this.event_type = 'button_click';\n    this.event_properties = properties;\n  }\n}\n\nexport class CommentPost {\n  constructor(properties) {\n    this.event_type = 'comment_post';\n    this.event_properties = properties;\n  }\n}\n\nexport class CommentReply {\n  constructor(properties) {\n    this.event_type = 'comment_reply';\n    this.event_properties = properties;\n  }\n}\n\nexport class CommentRespect {\n  constructor(properties) {\n    this.event_type = 'comment_respect';\n    this.event_properties = properties;\n  }\n}\n\nexport class ContentImpressions {\n  constructor(properties) {\n    this.event_type = 'content_impressions';\n    this.event_properties = properties;\n  }\n}\n\nexport class HomepageView {\n  constructor(properties) {\n    this.event_type = 'homepage_view';\n    this.event_properties = properties;\n  }\n}\n\nexport class LinkClick {\n  constructor(properties) {\n    this.event_type = 'link_click';\n    this.event_properties = properties;\n  }\n}\n\nexport class NewsletterSignup {\n  constructor(properties) {\n    this.event_type = 'newsletter_signup';\n    this.event_properties = properties;\n  }\n}\n\nexport class NewsletterUnsubscribe {\n  constructor(properties) {\n    this.event_type = 'newsletter_unsubscribe';\n    this.event_properties = properties;\n  }\n}\n\nexport class PaywallHit {\n  constructor(properties) {\n    this.event_type = 'paywall_hit';\n    this.event_properties = properties;\n  }\n}\n\nexport class RegwallHit {\n  constructor(properties) {\n    this.event_type = 'regwall_hit';\n    this.event_properties = properties;\n  }\n}\n\nexport class SectionView {\n  constructor(properties) {\n    this.event_type = 'section_view';\n    this.event_properties = properties;\n  }\n}\n\nexport class SiteSearch {\n  constructor(properties) {\n    this.event_type = 'site_search';\n    this.event_properties = properties;\n  }\n}\n\nexport class VideoComplete {\n  constructor(properties) {\n    this.event_type = 'video_complete';\n    this.event_properties = properties;\n  }\n}\n\nexport class VideoPause {\n  constructor(properties) {\n    this.event_type = 'video_pause';\n    this.event_properties = properties;\n  }\n}\n\nexport class VideoPlay {\n  constructor(properties) {\n    this.event_type = 'video_play';\n    this.event_properties = properties;\n  }\n}\n\n/**\n * @typedef PromiseResult\n * @type {object}\n * @property {Promise|undefined} promise\n */\n\nconst getVoidPromiseResult = () => ({ promise: Promise.resolve() });\n\n// prettier-ignore\nexport class Ampli {\n  constructor() {\n    /* @type {BrowserClient|undefined} */\n    this.amplitude = undefined;\n    this.disabled = false;\n  }\n\n  /**\n   * @return {BrowserClient}\n   */\n  get client() {\n    this.isInitializedAndEnabled();\n    return this.amplitude;\n  }\n\n  /**\n   * @return {boolean}\n   */\n  get isLoaded() {\n    return this.amplitude != null;\n  }\n\n  /**\n   * @private\n   * @return {boolean}\n   */\n  isInitializedAndEnabled() {\n    if (!this.isLoaded) {\n      console.error('ERROR: Ampli is not yet initialized. Have you called ampli.load() on app start?');\n      return false;\n    }\n    return !this.disabled;\n  }\n\n  /**\n   * Initialize the Ampli SDK. Call once when your application starts.\n   *\n   * @param {LoadOptions} options Configuration options to initialize the Ampli SDK with. 'environment', 'client.apiKey' or 'client.instance' is required.\n   *\n   * @return {PromiseResult}\n   */\n  load(options) {\n    this.disabled = options?.disabled ?? false;\n\n    if (this.isLoaded) {\n      console.warn('WARNING: Ampli is already initialized. Ampli.load() should be called once at application startup.');\n      return getVoidPromiseResult();\n    }\n\n    let apiKey;\n    if (options?.client?.apiKey) {\n      apiKey = options.client.apiKey;\n    } else if (options?.environment) {\n      apiKey = ApiKey[options.environment];\n    }\n\n    if (options?.client?.instance) {\n      this.amplitude = options?.client?.instance;\n    } else if (apiKey) {\n      this.amplitude = amplitude.createInstance();\n      return this.amplitude.init(apiKey, undefined, { ...DefaultConfiguration, ...options?.client?.configuration });\n    } else {\n      console.error(\"ERROR: ampli.load() requires 'environment', 'client.apiKey', or 'client.instance'\");\n    }\n\n    return getVoidPromiseResult();\n  }\n\n  /**\n   * Identify a user and set or update that user's properties.\n   *\n   * @param {string|undefined} userId The user's id.\n   * @param {Object} properties The user's properties.\n   * @param {string} properties.account type Denotes whether the user is subscribed, registered, or anonymous. Users who are not logged in are captured as 'anonymous'.\n   * @param {string} [properties.app att status] Tracks permission status set by the user, such as if they consented to allow third party tracking (ex. authorized, restricted, not determined)\n   * @param {number} [properties.app bookmarks] Number of bookmarks a user set on the app.\n   * @param {string} [properties.app build] App build number\n   * @param {boolean} [properties.app dark mode] Denotes whether the user has dark mode on or off on the app.\n   * @param {boolean} [properties.app editorial large widget] Indicates whether the large editorial widget was installed in the app.\n   * @param {boolean} [properties.app editorial medium widget] Indicates whether the medium editorial widget was installed in the app.\n   * @param {string} [properties.app for you status] Indicates the option selected for the Personal Finance For You feature on the app.\n   * @param {string} [properties.app push status] Whether the user enabled push notifications\n   * @param {boolean} [properties.app stocks small widget] Indicates whether the small stocks widget was installed in the app.\n   * @param {string} [properties.app subscription type] How the user bought their subscription\n   * @param {boolean} [properties.app voice over] Denotes whether the user has the voice over feature turned on or off on the app.\n   * @param {boolean} [properties.app watchlist large widget] Indicates whether the large watchlist widget was installed in the app.\n   * @param {number} [properties.app watchlists] Number of watchlists a user created on the app\n   * @param {string} [properties.churn date] Date a user churned or did not renew their subscription\n   * @param {string} [properties.device category] Device type from Sophi Paywall SDK\n   * @param {string} [properties.device os] Device OS from Sophi Paywall SDK\n   * @param {string} [properties.device viewer] Device viewer from Sophi Paywall SDK\n   * @param {boolean} [properties.new visitor] Identifies whether a visitor is new based on whether the session is their first session or not.\n   * @param {string} [properties.previous subscription service] The previous type of subscription a user had.\n   * @param {number} [properties.rfv frequency] Frequency component of the RFV score, ie how many times a user visited during the RFV model's timeframe.\n   * @param {number} [properties.rfv recency] Recency component of the RFV score, ie how days since the last user visited during the RFV model's timeframe.\n   * @param {number} [properties.rfv score] RFV score of a user provided by TGAM. This is a measure of a user's engagement based on their Recency, Frequency, and Volume (ie consumption).\n   * @param {string} [properties.rfv string] Full RFV string value of a user provided by TGAM\n   * @param {number} [properties.rfv volume] Volume component of RFV score, ie how many page views a user had based on the RFV model's timeframe. Only available for Subscribers.\n   * @param {string[]} [properties.sophi test id] Sophi ID for an A/B test experiment\n   * @param {string} [properties.ssvc value] Service code value for a subscriber or registered user, used to distinguish what service the user is subscribed or registered to (ex. GA for Globe Advisor, PREMIUM\\~PREMIUM for GU Digital)\n   * @param {string} [properties.subscription end date] End date of a user's subscription\n   * @param {string} [properties.subscription name] Name of subscription offer (ex. access_weekly, app annual subscription, etc.)\n   * @param {string} [properties.subscription start date] Date a user's subscription started\n   * @param {number} [properties.subscription term length] Length of subscription offer (combined with subscription term period)\n   * @param {string} [properties.subscription term period] The type of period the user's subscription term length is applied for (ex. week)\n   * @param {number} [properties.subscription term price] Amount paid for the subscription term\n   * @param {string[]} [properties.test attribution] The attribution period for an AB test (ie 'visit' indicates the test will run the length of a visit, while 'visitor' indicates the test will run while the user has the same cookie ID)\n   * @param {string[]} [properties.test id] The distinct ID for an AB test experiment\n   * @param {string[]} [properties.test segment] Segment of users targeted by the AB test experiment (ex. fsale, wsj-pencil, etc.)\n   * @param {string[]} [properties.test variant] Name of AB test group the user is assigned to (ex. control, expB, experience, variant)\n   * @param {number} [properties.wall days since last visit] Number of days since the user last visited from Sophi Paywall SDK\n   * @param {string} [properties.wall timezone] Timezone of the user from Sophi Paywall SDK\n   * @param {number} [properties.wall visit count] Number of times the user has come to the site from Sophi Paywall SDK\n   * @param {string} [properties.zipcode] User's postal code\n   * @param {EventOptions} [options] Optional event options.\n   *\n   * @return {PromiseResult}\n   */\n  identify(userId, properties, options) {\n    if (!this.isInitializedAndEnabled()) {\n      return getVoidPromiseResult();\n    }\n\n    if (userId) {\n      options = {...options, user_id: userId};\n    }\n\n    const ampIdentify = new amplitude.Identify();\n    const eventProperties = properties;\n    if (eventProperties != null) {\n      for (const [key, value] of Object.entries(eventProperties)) {\n        ampIdentify.set(key, value);\n      }\n    }\n    return this.amplitude.identify(ampIdentify, options);\n  }\n\n  /**\n  * Flush the event.\n  */\n  flush() {\n    if (!this.isInitializedAndEnabled()) {\n      return getVoidPromiseResult();\n    }\n\n    return this.amplitude.flush();\n  }\n\n  /**\n   * Track event\n   *\n   * @param {BaseEvent} event The event to track.\n   * @param {EventOptions} [options] Optional event options.\n   *\n   * @return {PromiseResult}\n   */\n  track(event, options) {\n    if (!this.isInitializedAndEnabled()) {\n      return getVoidPromiseResult();\n    }\n\n    return this.amplitude.track(event, undefined, options);\n  }\n\n  /**\n   * account_interaction\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/account_interaction)\n   *\n   * This event tracks changes made by users with their accounts (ex. changing their email)\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} [properties.account action] The type of action taken in an account event (ex. email change success, registration initiated, etc.)\n   * @param {string} [properties.account login provider] The login provider in an account event (ex. tgam, GOOGLE, FACEBOOK)\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  accountInteraction(properties, options) {\n    return this.track(new AccountInteraction(properties), options);\n  }\n\n  /**\n   * account_login\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/account_login)\n   *\n   * This event tracks when a user successfully logs into their account\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} [properties.account action] The type of action taken in an account event (ex. email change success, registration initiated, etc.)\n   * @param {string} properties.account login provider The login provider in an account event (ex. tgam, GOOGLE, FACEBOOK)\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  accountLogin(properties, options) {\n    return this.track(new AccountLogin(properties), options);\n  }\n\n  /**\n   * account_logout\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/account_logout)\n   *\n   * This event tracks when a user logs out of their account\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  accountLogout(properties, options) {\n    return this.track(new AccountLogout(properties), options);\n  }\n\n  /**\n   * account_registration\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/account_registration)\n   *\n   * This event tracks when a user creates a new account\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} [properties.account action] The type of action taken in an account event (ex. email change success, registration initiated, etc.)\n   * @param {string} properties.account login provider The login provider in an account event (ex. tgam, GOOGLE, FACEBOOK)\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string[]} [properties.last article tags] The article tag of the last article read by a user.\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  accountRegistration(properties, options) {\n    return this.track(new AccountRegistration(properties), options);\n  }\n\n  /**\n   * account_subscription\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/account_subscription)\n   *\n   * This event tracks when a user successfully purchases a subscription or when a print subscriber activates their digital subscription.\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string[]} [properties.last article tags] The article tag of the last article read by a user.\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} properties.subscription campaign code Subscription offer (ex. EVERGREEN6, NYT21). Note that this is present on all pages in the subscription funnel, including success pages.\n   * @param {string} properties.subscription funnel Type of subscription funnel (ex. GAMDIGITAL3, GAMDIGITALFREE)\n   * @param {string} properties.subscription payment method Payment method used to purchase a subscription (ex. VISA, MC, PAYPAL_SUBSCRIPTION)\n   * @param {string} properties.subscription type Type of subscription (ex. digital)\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  accountSubscription(properties, options) {\n    return this.track(new AccountSubscription(properties), options);\n  }\n\n  /**\n   * article_view\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/article_view)\n   *\n   * This event tracks when a user views an article\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string[]} [properties.last article tags] The article tag of the last article read by a user.\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  articleView(properties, options) {\n    return this.track(new ArticleView(properties), options);\n  }\n\n  /**\n   * audio_complete\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/audio_complete)\n   *\n   * This event is triggered when a user completes playing an audio file\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is mute] Describes whether the video played was on mute or not\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.media content id] A distinct ID for video or audio content - for audio articles, this would be the article ID.\n   * @param {number} [properties.media duration seconds] The length of the video or audio in seconds\n   * @param {number} [properties.media elapsed seconds] Elapsed time in seconds for the video or audio\n   * @param {string} [properties.media feature type] Placement of the audio or video on the page (ex. page part, article part, main)\n   * @param {string} [properties.media player] Name of the video or audio player platform\n   * @param {string} properties.media title Title of the video or audio\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  audioComplete(properties, options) {\n    return this.track(new AudioComplete(properties), options);\n  }\n\n  /**\n   * audio_pause\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/audio_pause)\n   *\n   * This event is triggered when a user pauses the audio playback\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is mute] Describes whether the video played was on mute or not\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.media content id] A distinct ID for video or audio content - for audio articles, this would be the article ID.\n   * @param {number} [properties.media duration seconds] The length of the video or audio in seconds\n   * @param {number} [properties.media elapsed seconds] Elapsed time in seconds for the video or audio\n   * @param {string} [properties.media feature type] Placement of the audio or video on the page (ex. page part, article part, main)\n   * @param {string} [properties.media player] Name of the video or audio player platform\n   * @param {string} properties.media title Title of the video or audio\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  audioPause(properties, options) {\n    return this.track(new AudioPause(properties), options);\n  }\n\n  /**\n   * audio_play\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/audio_play)\n   *\n   * This event tracks when a user starts playing audio content\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is mute] Describes whether the video played was on mute or not\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.media content id] A distinct ID for video or audio content - for audio articles, this would be the article ID.\n   * @param {number} [properties.media duration seconds] The length of the video or audio in seconds\n   * @param {number} [properties.media elapsed seconds] Elapsed time in seconds for the video or audio\n   * @param {string} [properties.media feature type] Placement of the audio or video on the page (ex. page part, article part, main)\n   * @param {string} [properties.media player] Name of the video or audio player platform\n   * @param {string} properties.media title Title of the video or audio\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  audioPlay(properties, options) {\n    return this.track(new AudioPlay(properties), options);\n  }\n\n  /**\n   * button_click\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/button_click)\n   *\n   * Triggered when a user clicks on a button\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} [properties.click article id] The article ID of the link clicked on by the user.\n   * @param {string} [properties.click element content] This is used only to track clicks to the Subscribe with Google pop up banner.\n   * @param {string} [properties.click feature] The name of the feature clicked on by the user.\n   * @param {string} [properties.click label] The label on the button or link clicked on by the user.\n   * @param {string} [properties.click target url] The URL destination of the link or button that was clicked on.\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  buttonClick(properties, options) {\n    return this.track(new ButtonClick(properties), options);\n  }\n\n  /**\n   * comment_post\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/comment_post)\n   *\n   * This event tracks when a user posts a comment on an article\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  commentPost(properties, options) {\n    return this.track(new CommentPost(properties), options);\n  }\n\n  /**\n   * comment_reply\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/comment_reply)\n   *\n   * This event tracks when a user replies to a comment\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  commentReply(properties, options) {\n    return this.track(new CommentReply(properties), options);\n  }\n\n  /**\n   * comment_respect\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/comment_respect)\n   *\n   * This event tracks when a user gives respect to a comment (ie The Globe's version of a thumbs up)\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  commentRespect(properties, options) {\n    return this.track(new CommentRespect(properties), options);\n  }\n\n  /**\n   * content_impressions\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/content_impressions)\n   *\n   * This event tracks the number of times a marketing container or the Subscribe with Google button is displayed to users (web only)\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} [properties.article headline] Headline of an article\n   * @param {string} [properties.article id] The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} [properties.click feature] The name of the feature clicked on by the user.\n   * @param {string} [properties.click label] The label on the button or link clicked on by the user.\n   * @param {string} [properties.click target url] The URL destination of the link or button that was clicked on.\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {string} [properties.wall name] Name of the wall shown to the user (ex. google regwall, globe advisor regwall, paywall, etc.)\n   * @param {*} [properties.wall reason] Sophi algorithm reason for why the user was shown a wall.\n   * @param {string} [properties.wall trace id] Wall trace ID from Sophi dynamic paywall API response\n   * @param {string} [properties.wall type] Type of wall shown to a user (ex. paywall-hard, regwall-hard, regwall-metered, etc.)\n   * @param {string} [properties.wall visibility] Wall visibility from Sophi dynamic paywall API response\n   * @param {number} [properties.wall visible paragraphs] Number of visible paragraphs after a user encounters a wall\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  contentImpressions(properties, options) {\n    return this.track(new ContentImpressions(properties), options);\n  }\n\n  /**\n   * homepage_view\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/homepage_view)\n   *\n   * This event tracks when a user views the homepage.\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  homepageView(properties, options) {\n    return this.track(new HomepageView(properties), options);\n  }\n\n  /**\n   * link_click\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/link_click)\n   *\n   * User clicks on a link on the page\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} [properties.click article id] The article ID of the link clicked on by the user.\n   * @param {string} [properties.click element content] This is used only to track clicks to the Subscribe with Google pop up banner.\n   * @param {string} [properties.click feature] The name of the feature clicked on by the user.\n   * @param {string} [properties.click label] The label on the button or link clicked on by the user.\n   * @param {string} [properties.click target url] The URL destination of the link or button that was clicked on.\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  linkClick(properties, options) {\n    return this.track(new LinkClick(properties), options);\n  }\n\n  /**\n   * newsletter_signup\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/newsletter_signup)\n   *\n   * This event tracks when a user signs up for a newsletter\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string[]} [properties.last article tags] The article tag of the last article read by a user.\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.newsletter frequency] The frequency the newsletter the user subscribed to is sent (ex. sent saturdays, sent weekday mornings, etc.)\n   * @param {string} properties.newsletter name Name of newsletter the user subscribed or unsubscribed to\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  newsletterSignup(properties, options) {\n    return this.track(new NewsletterSignup(properties), options);\n  }\n\n  /**\n   * newsletter_unsubscribe\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/newsletter_unsubscribe)\n   *\n   * This event tracks when a user unsubscribes from a newsletter\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string[]} [properties.last article tags] The article tag of the last article read by a user.\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.newsletter frequency] The frequency the newsletter the user subscribed to is sent (ex. sent saturdays, sent weekday mornings, etc.)\n   * @param {string} properties.newsletter name Name of newsletter the user subscribed or unsubscribed to\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  newsletterUnsubscribe(properties, options) {\n    return this.track(new NewsletterUnsubscribe(properties), options);\n  }\n\n  /**\n   * paywall_hit\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/paywall_hit)\n   *\n   * This event is triggered when a user encounters the paywall, indicating that they have reached the limit of free content and are prompted to subscribe or make a purchase to access further content\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {string} properties.wall name Name of the wall shown to the user (ex. google regwall, globe advisor regwall, paywall, etc.)\n   * @param {*} [properties.wall reason] Sophi algorithm reason for why the user was shown a wall.\n   * @param {string} [properties.wall trace id] Wall trace ID from Sophi dynamic paywall API response\n   * @param {string} [properties.wall type] Type of wall shown to a user (ex. paywall-hard, regwall-hard, regwall-metered, etc.)\n   * @param {string} [properties.wall visibility] Wall visibility from Sophi dynamic paywall API response\n   * @param {number} [properties.wall visible paragraphs] Number of visible paragraphs after a user encounters a wall\n   * @param {string} [properties.wall visit referrer] Page referrer for a paywall event, such as search, internal, direct, etc. (from paywall SDK)\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  paywallHit(properties, options) {\n    return this.track(new PaywallHit(properties), options);\n  }\n\n  /**\n   * regwall_hit\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/regwall_hit)\n   *\n   * This event is triggered when a user encounters a registration wall\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {string} properties.wall name Name of the wall shown to the user (ex. google regwall, globe advisor regwall, paywall, etc.)\n   * @param {*} [properties.wall reason] Sophi algorithm reason for why the user was shown a wall.\n   * @param {string} [properties.wall trace id] Wall trace ID from Sophi dynamic paywall API response\n   * @param {string} [properties.wall type] Type of wall shown to a user (ex. paywall-hard, regwall-hard, regwall-metered, etc.)\n   * @param {string} [properties.wall visibility] Wall visibility from Sophi dynamic paywall API response\n   * @param {number} [properties.wall visible paragraphs] Number of visible paragraphs after a user encounters a wall\n   * @param {string} [properties.wall visit referrer] Page referrer for a paywall event, such as search, internal, direct, etc. (from paywall SDK)\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  regwallHit(properties, options) {\n    return this.track(new RegwallHit(properties), options);\n  }\n\n  /**\n   * section_view\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/section_view)\n   *\n   * This event tracks when a user views a section page (and any subsection page), excluding the homepage. Article views are tracked separately.\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string} [properties.subscription campaign code] Subscription offer (ex. EVERGREEN6, NYT21). Note that this is present on all pages in the subscription funnel, including success pages.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  sectionView(properties, options) {\n    return this.track(new SectionView(properties), options);\n  }\n\n  /**\n   * site_search\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/site_search)\n   *\n   * This event tracks when a user performs a search on the website or app\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.site search filters] Values of the filters applied on the advanced search on the website. This is not available for app.\n   * @param {number} [properties.site search results] Number of search page results returned by the search bar\n   * @param {string[]} [properties.site search terms] Array of search terms used by a user from the search bar\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  siteSearch(properties, options) {\n    return this.track(new SiteSearch(properties), options);\n  }\n\n  /**\n   * video_complete\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/video_complete)\n   *\n   * This event tracks when a user completes watching a video\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is mute] Describes whether the video played was on mute or not\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.media content id] A distinct ID for video or audio content - for audio articles, this would be the article ID.\n   * @param {number} [properties.media duration seconds] The length of the video or audio in seconds\n   * @param {number} [properties.media elapsed seconds] Elapsed time in seconds for the video or audio\n   * @param {string} [properties.media feature type] Placement of the audio or video on the page (ex. page part, article part, main)\n   * @param {string} [properties.media player] Name of the video or audio player platform\n   * @param {string} properties.media title Title of the video or audio\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  videoComplete(properties, options) {\n    return this.track(new VideoComplete(properties), options);\n  }\n\n  /**\n   * video_pause\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/video_pause)\n   *\n   * This event tracks when a user pauses a video\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is mute] Describes whether the video played was on mute or not\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.media content id] A distinct ID for video or audio content - for audio articles, this would be the article ID.\n   * @param {number} [properties.media duration seconds] The length of the video or audio in seconds\n   * @param {number} [properties.media elapsed seconds] Elapsed time in seconds for the video or audio\n   * @param {string} [properties.media feature type] Placement of the audio or video on the page (ex. page part, article part, main)\n   * @param {string} [properties.media player] Name of the video or audio player platform\n   * @param {string} properties.media title Title of the video or audio\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  videoPause(properties, options) {\n    return this.track(new VideoPause(properties), options);\n  }\n\n  /**\n   * video_play\n   *\n   * [View in Tracking Plan](https://data.amplitude.com/the-globe-and-mail/The%20Globe%20and%20Mail/events/main/latest/video_play)\n   *\n   * This event tracks when a user starts playing a video\n   *\n   * Owner: Lourdes Santos\n   *\n   * @param {Object} properties The event's properties.\n   * @param {string} properties.app id A unique identifier for the application (ex. theglobeandmail-website, theglobeandmail-app, tgam:theglobeandmail:app_android)\n   * @param {string[]} [properties.article byline] Author or authors of an article\n   * @param {string} [properties.article colour] Article colour or access category of an article (ex. red, yellow, green)\n   * @param {number} [properties.article content size] Number of words in an article\n   * @param {string} [properties.article content type] Type of article (ex. longread, column, etc.)\n   * @param {string} [properties.article creditline] Creditline of an article (ex. reuters)\n   * @param {string} properties.article headline Headline of an article\n   * @param {string} properties.article id The distinct ID of an article\n   * @param {string[]} [properties.article keywords] Keywords assigned to an article\n   * @param {string} [properties.article last modified date] Modified date of an article\n   * @param {string} [properties.article ownership] Source of an article (ex. staff writer, wire, etc.)\n   * @param {string} [properties.article publish date] Publish date of an article in EST, ISO date format\n   * @param {string[]} [properties.article tags] Story tags of an article (ex. 'folio', 'longread', etc.)\n   * @param {string} [properties.article topics] Topics assigned to an article\n   * @param {number} [properties.browser view height] Height of browser in pixels\n   * @param {number} [properties.browser view width] Width of browser in pixels\n   * @param {string} properties.canonical url Canonical URL of the page (strips all paramters in the URL)\n   * @param {string} properties.environment User environment during the session (prod, dev, or stg)\n   * @param {string} [properties.first marketing campaign] The first utm campaign the user encountered in their session\n   * @param {string} [properties.first marketing content] The first utm content the user encountered in their session\n   * @param {string} [properties.first marketing medium] The first utm medium the user encountered in their session\n   * @param {string} [properties.first marketing source] The first utm source the user encountered in their session\n   * @param {string} [properties.first marketing terms] The first utm_term the user encountered in their session\n   * @param {string} [properties.first referrer host] The first referral host that brought a user to the site for a specific session\n   * @param {string} properties.host name Site or host where content is published\n   * @param {string} [properties.internal campaign] The intcmp parameter in the page URL, used to track internal campaigns.\n   * @param {boolean} [properties.is mute] Describes whether the video played was on mute or not\n   * @param {boolean} [properties.is sponsored] Describes whether the content is sponsored or not\n   * @param {string[]} [properties.last article byline] The author or authors of the last article read by the user\n   * @param {string} [properties.last article colour] The article colour of the last article read by the user\n   * @param {string} [properties.last article credit line] Property has no description in tracking plan.\n   * @param {string} [properties.last article headline] The headline of the article last read by a user\n   * @param {string} [properties.last article id] The article ID of the last article read by the user\n   * @param {string[]} [properties.last article keywords] The keywords of the last article read by the user\n   * @param {string} [properties.last article topics] The article topics associated with the last article read by the user\n   * @param {string} [properties.last content type] Type of article (ex. longread, column, etc.) last read by the user\n   * @param {string} [properties.last internal campaign] The last intcmp parameter encountered in the session, used to track conversions from internal campaigns\n   * @param {string} [properties.last marketing campaign] The last utm_campaign value passed in the page url that a user clicked on, used to attribute conversions to a marketing campaign\n   * @param {string} [properties.last marketing content] The last utm_content value passed in the page url that a user clicked on, used to attribute conversions to specific marketing content\n   * @param {string} [properties.last marketing medium] The last utm_medium value passed in the page url that a user clicked on, used to attribute conversions to specific marketing mediums\n   * @param {string} [properties.last marketing source] The last utm_source value passed in the page url that a user clicked on, used to attribute conversions to specific marketing sources\n   * @param {string} [properties.last marketing terms] The last utm_term value passed in the page url that a user clicked on, used to attribute conversions to a specific marketing term\n   * @param {string} [properties.last subsection 1] Name of the last subsection 1 viewed by the user\n   * @param {string} [properties.last subsection 2] Name of the last subsection 2 viewed by the user\n   * @param {string} [properties.last subsection 3] Name of the last subsection 3 viewed by the user\n   * @param {string} [properties.last subsection 4] Name of the last subsection 4 viewed by the user\n   * @param {string} [properties.last wall name] Name of the latest wall encountered by the user\n   * @param {string} [properties.last wall reason] The latest Sophi reason for showing the wall to the user\n   * @param {string} [properties.last wall type] The latest wall type shown to a user\n   * @param {string} [properties.marketing campaign] The utm_campaign parameter passed in the page URL, used to track what marketing campaign the user came from.\n   * @param {string} [properties.marketing content] The utm_content parameter passed in the page URL, used to track what marketing content the user came from.\n   * @param {string} [properties.marketing medium] The utm_medium parameter passed in the page URL, used to track what marketing medium the user came from.\n   * @param {string} [properties.marketing source] The utm_source parameter passed in the page URL, used to track what marketing source the user came from.\n   * @param {string} [properties.marketing term] The utm_term parameter passed in the page URL, used to track what marketing term the user came from.\n   * @param {string} [properties.media content id] A distinct ID for video or audio content - for audio articles, this would be the article ID.\n   * @param {number} [properties.media duration seconds] The length of the video or audio in seconds\n   * @param {number} [properties.media elapsed seconds] Elapsed time in seconds for the video or audio\n   * @param {string} [properties.media feature type] Placement of the audio or video on the page (ex. page part, article part, main)\n   * @param {string} [properties.media player] Name of the video or audio player platform\n   * @param {string} properties.media title Title of the video or audio\n   * @param {string} [properties.page layout] Describes the layout of the page (ex. premium-section, article-with-sidebar, page-with-sidebar)\n   * @param {string} properties.page name General page name or breadcrumb containing a page's section and subsections. Ex. investing:personalfinance\n   * @param {string} properties.page path Part of the URL after the domain and before query paramters and URL fragments. Ex. /canada/article-this-is-an-example/\n   * @param {string} [properties.page type] The type of page (ex. article, section, video, etc.)\n   * @param {string} properties.page url Page URL of the page a user browsed.\n   * @param {string} [properties.press release organization] The press release organization that provided a press release for a stock page.\n   * @param {string} properties.referrer host The host name of the referral URL.\n   * @param {string} properties.referrer url The previous page's URL, ie where the user came from before landing on the current page URL.\n   * @param {string} properties.section The name of the section\n   * @param {string[]} [properties.stock tickers] Array of stock tickers that appeared on an article.\n   * @param {string} [properties.subsection 1] The first subsection of a page, appears after the section name in the page path (ex. markets in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 2] The second subsection of a page, appears as the third value in the page path (ex. stocks in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 3] The third subsection of a page, appears as the fourth value the page path (ex. QQC-F-T in /investing/markets/stocks/QQC-F-T/)\n   * @param {string} [properties.subsection 4] The fourth subsection of a page, appears as the fifth value in the page path (ex. pressreleases in /investing/markets/stocks/QQC-F-T/pressreleases/)\n   * @param {string} [properties.user agent string] User agent string of a device\n   * @param {EventOptions} [options] Options for this track call.\n   */\n  videoPlay(properties, options) {\n    return this.track(new VideoPlay(properties), options);\n  }\n}\n\nexport const ampli = new Ampli();\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingSpinner.vue?vue&type=style&index=0&id=538d3849&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingSpinner.vue?vue&type=style&index=0&id=538d3849&lang=scss&scoped=true&\"","const isCookieEnabled = function() {\n  try {\n    document.cookie = 'cookietest=1'\n    const val = document.cookie.indexOf('cookietest=') !== -1\n    document.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'\n    return val\n  } catch (e) {\n    return false\n  }\n}\n\nexport { isCookieEnabled }\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Message.vue?vue&type=style&index=0&id=501fa4da&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Message.vue?vue&type=style&index=0&id=501fa4da&lang=scss&scoped=true&\"","const getConfig = () => {\n  return {\n    clientId: window.cpcConfig.COGNITO_USER_POOL_WEB_CLIENT_ID,\n    responseType: window.cpcConfig.COGNITO_RESPONSE_TYPE,\n    scope: window.cpcConfig.COGNITO_SCOPE,\n    redirect_uri: `${window.cpcConfig.AUTHENTICATION_CALLBACK}login/callback`\n  }\n}\n\nexport { getConfig }\n","// Checks if `value` is an empty Object\nexport function isObjectEmpty(value) {\n  return Object.keys(value).length === 0 && value.constructor === Object\n}\n\n// Checks if `value` is `null` or `undefined`.\nexport function isNil(value) {\n  return value === null || value === undefined\n}\n","import { ampli } from '@/vendor/amplitude'\nimport Cookie from 'js-cookie'\nimport {\n  formatForSophi3,\n  formatForAmplitude,\n  getAmeliaExperiments\n} from '@/utils/amelia/utility'\nimport { store } from '@/store/store'\nimport api from '@/utils/api'\nimport { isObjectEmpty, isNil } from '@/utils/is'\n\nfunction sortEventPayload(obj) {\n  // return an object sorted alphabetically by keys\n  return Object.keys(obj)\n    .sort()\n    .reduce((sortedObj, key) => {\n      sortedObj[key] = obj[key]\n      return sortedObj\n    }, {})\n}\n\nfunction getAccountLogInProvider() {\n  const logInProvider = window?.sophi?.data?.visitor?.loginProvider ?? ''\n  return logInProvider === 'tgam' ? 'in-house' : logInProvider\n}\n\nfunction getLimioIntCmp() {\n  const limioConversionCookie = Cookie.get('tgam.amplitude.limioConversions')\n    ? JSON.parse(Cookie.get('tgam.amplitude.limioConversions'))\n    : null\n  const sessionId = ampli?.client?.getSessionId()\n\n  return limioConversionCookie?.sid === sessionId\n    ? limioConversionCookie?.ic ?? ''\n    : ''\n}\n\nfunction getLimioOfferCookieData() {\n  const limioOfferCookie = Cookie.get('tgam.amplitude.limioOffer')\n    ? JSON.parse(Cookie.get('tgam.amplitude.limioOffer'))\n    : null\n\n  const sessionId = ampli?.client?.getSessionId()\n\n  return limioOfferCookie?.sid === sessionId ? limioOfferCookie : null\n}\n\nfunction getEventPayload() {\n  const urlParams = new URLSearchParams(window.location.search)\n  const intcmp = urlParams.get('intcmp') || getLimioIntCmp() || ''\n  const utmCampaign = urlParams.get('utm_campaign') || ''\n  const utmContent = urlParams.get('utm_content') || ''\n  const utmMedium = urlParams.get('utm_medium') || ''\n  const utmSource = urlParams.get('utm_source') || ''\n  const utmTerm = urlParams.get('utm_term') || ''\n  const page = window?.sophi?.data?.page\n  const limioPageName =\n    window.location.pathname === '/user/register/subscription'\n      ? 'subscription:subscriptionregister'\n      : ''\n  const pageName =\n    limioPageName || page?.breadcrumb?.replace(':section', '') || ''\n  const [section, subsection1, subsection2, subsection3, subsection4] =\n    pageName.split(':') ?? []\n  const limioOfferCookieData = getLimioOfferCookieData()\n\n  return {\n    'app id': 'theglobeandmail-website',\n    'browser view height': window.innerHeight,\n    'browser view width': window.innerWidth,\n    'canonical url':\n      `${window.location.origin}${window.location.pathname}` || '',\n    environment: window.cpcConfig.ENV_NAME.toLowerCase(),\n    'host name': window.location.hostname,\n    'internal campaign': intcmp,\n    'marketing campaign': utmCampaign,\n    'marketing content': utmContent,\n    'marketing medium': utmMedium,\n    'marketing source': utmSource,\n    'marketing term': utmTerm,\n    'subsection 1': subsection1?.toLowerCase() || '',\n    'subsection 2': subsection2?.toLowerCase() || '',\n    'subsection 3': subsection3?.toLowerCase() || '',\n    'subsection 4': subsection4?.toLowerCase() || '',\n    'page layout': '',\n    'page name': pageName?.toLowerCase(),\n    'page type': page?.type || '',\n    'page path': window.location.pathname || '',\n    'page url': window.location.href || '',\n    'referrer host': document.referrer\n      ? new URL(document.referrer).hostname\n      : '',\n    'referrer url': document.referrer || '',\n    section: section || '',\n    'user agent string': window.navigator.userAgent,\n    'subscription campaign code': limioOfferCookieData?.scc || '',\n    'subscription funnel': limioOfferCookieData?.sf || '',\n    'subscription type': limioOfferCookieData?.st || ''\n  }\n}\n\n// Mapss the keys of an object based on a provided key mapping\nfunction mapKeys(obj, keyMapping) {\n  const newObj = {}\n\n  for (const key in obj) {\n    if (keyMapping[key]) {\n      newObj[keyMapping[key]] = obj[key]\n    } else {\n      newObj[key] = obj[key]\n    }\n  }\n\n  return newObj\n}\n\n// Returns the first conversion properties\nfunction getFirstConversionsPayload(eventPayload) {\n  const firstConversionCookie = Cookie.get('tgam.amplitude.firstConversions')\n    ? JSON.parse(Cookie.get('tgam.amplitude.firstConversions'))\n    : null\n\n  let firstConversionsPayload\n\n  const keyMappingFirstConversions = {\n    mcam: 'first marketing campaign',\n    mcon: 'first marketing content',\n    mmed: 'first marketing medium',\n    ms: 'first marketing source',\n    mt: 'first marketing terms',\n    rhost: 'first referrer host'\n  }\n\n  if (!firstConversionCookie) {\n    firstConversionsPayload = {\n      'first marketing campaign': eventPayload?.['marketing campaign'] || '',\n      'first marketing content': eventPayload?.['marketing content'] || '',\n      'first marketing medium': eventPayload?.['marketing medium'] || '',\n      'first marketing source': eventPayload?.['marketing source'] || '',\n      'first marketing terms': eventPayload?.['marketing term'] || '',\n      'first referrer host': eventPayload?.['referrer host'] || ''\n    }\n  } else if (firstConversionCookie?.['session id']) {\n    delete firstConversionCookie['session id']\n    firstConversionsPayload = firstConversionCookie\n  } else if (firstConversionCookie?.['sid']) {\n    delete firstConversionCookie['sid']\n    firstConversionsPayload = mapKeys(\n      firstConversionCookie,\n      keyMappingFirstConversions\n    )\n  }\n\n  return firstConversionsPayload\n}\n\n// Returns the last conversion properties\nfunction getLastConversionsPayload(eventPayload) {\n  const lastConversionCookie = Cookie.get('tgam.amplitude.lastConversions')\n    ? JSON.parse(Cookie.get('tgam.amplitude.lastConversions'))\n    : null\n\n  let lastConversionsPayload\n\n  const keyMappingLastConversions = {\n    // ab: \"last article byline\",\n    // ac: \"last article colour\",\n    // acl: \"last article credit line\",\n    ah: 'last article headline',\n    aid: 'last article id',\n    // ak: \"last article keywords\",\n    // at: \"last article topics\",\n    // ct: \"last content type\",\n    ic: 'last internal campaign',\n    mcam: 'last marketing campaign',\n    mcon: 'last marketing content',\n    mmed: 'last marketing medium',\n    ms: 'last marketing source',\n    mt: 'last marketing terms',\n    sub1: 'last subsection 1',\n    sub2: 'last subsection 2',\n    sub3: 'last subsection 3',\n    // sub4: \"last subsection 4\",\n    wn: 'last wall name',\n    // wr: \"last wall reason\",\n    wt: 'last wall type',\n    sid: 'session id'\n  }\n\n  if (lastConversionCookie?.['session id']) {\n    delete lastConversionCookie['session id']\n    lastConversionsPayload = lastConversionCookie\n  } else if (lastConversionCookie?.['sid']) {\n    delete lastConversionCookie['sid']\n    lastConversionsPayload = mapKeys(\n      lastConversionCookie,\n      keyMappingLastConversions\n    )\n  }\n\n  lastConversionsPayload = {\n    ...lastConversionsPayload,\n    'last internal campaign':\n      eventPayload?.['internal campaign'] ||\n      lastConversionsPayload?.['last internal campaign'] ||\n      '',\n    'last marketing campaign':\n      eventPayload?.['marketing campaign'] ||\n      lastConversionsPayload?.['last marketing campaign'] ||\n      '',\n    'last marketing content':\n      eventPayload?.['marketing content'] ||\n      lastConversionsPayload?.['last marketing content'] ||\n      '',\n    'last marketing medium':\n      eventPayload?.['marketing medium'] ||\n      lastConversionsPayload?.['last marketing medium'] ||\n      '',\n    'last marketing source':\n      eventPayload?.['marketing source'] ||\n      lastConversionsPayload?.['last marketing source'] ||\n      '',\n    'last marketing terms':\n      eventPayload?.['marketing term'] ||\n      lastConversionsPayload?.['last marketing terms'] ||\n      '',\n    'last subsection 1':\n      eventPayload?.['subsection 1'] ||\n      lastConversionsPayload?.['last subsection 1'] ||\n      '',\n    'last subsection 2':\n      eventPayload?.['subsection 2'] ||\n      lastConversionsPayload?.['last subsection 2'] ||\n      '',\n    'last subsection 3':\n      eventPayload?.['subsection 3'] ||\n      lastConversionsPayload?.['last subsection 3'] ||\n      ''\n  }\n\n  return lastConversionsPayload\n}\n\nfunction accountRegistration(accountLoginProvider = '') {\n  const payload = getEventPayload()\n  const firstConversionsPayload = getFirstConversionsPayload(payload)\n  const lastConversionsPayload = getLastConversionsPayload(payload)\n\n  const accountRegistrationData = {\n    ...payload,\n    ...firstConversionsPayload,\n    ...lastConversionsPayload,\n    'account action': 'registration completed',\n    'account login provider': getAccountLogInProvider() || accountLoginProvider\n  }\n\n  ampli.accountRegistration(sortEventPayload(accountRegistrationData))\n}\n\nfunction accountLogin() {\n  const payload = getEventPayload()\n  const firstConversionsPayload = getFirstConversionsPayload(payload)\n  const lastConversionsPayload = getLastConversionsPayload(payload)\n\n  const accountLoginData = {\n    ...payload,\n    ...firstConversionsPayload,\n    ...lastConversionsPayload,\n    'account action': 'log in',\n    'account login provider': getAccountLogInProvider()\n  }\n\n  return ampli.accountLogin(sortEventPayload(accountLoginData))\n}\n\nfunction accountLogout() {\n  const payload = getEventPayload()\n\n  const accountLogoutData = {\n    ...payload,\n    'account action': 'log out',\n    'account login provider': getAccountLogInProvider(),\n    'page name': 'globeandmail:cpc:login',\n    section: 'globeandmail',\n    'subsection 1': 'cpc',\n    'subsection 2': 'login'\n  }\n\n  return ampli.accountLogout(sortEventPayload(accountLogoutData))\n}\n\nfunction accountInteraction(accountAction = '') {\n  const payload = getEventPayload()\n  const firstConversionsPayload = getFirstConversionsPayload(payload)\n  const lastConversionsPayload = getLastConversionsPayload(payload)\n\n  const accountInteractionData = {\n    ...payload,\n    ...firstConversionsPayload,\n    ...lastConversionsPayload,\n    'account action': accountAction,\n    'account login provider': getAccountLogInProvider()\n  }\n\n  ampli.accountInteraction(sortEventPayload(accountInteractionData))\n}\n\nfunction sectionView() {\n  const payload = getEventPayload()\n  const firstConversionsPayload = getFirstConversionsPayload(payload)\n  const lastConversionsPayload = getLastConversionsPayload(payload)\n\n  const sectionViewData = {\n    ...payload,\n    ...firstConversionsPayload,\n    ...lastConversionsPayload\n  }\n\n  ampli.sectionView(sortEventPayload(sectionViewData))\n}\n\nasync function getSophiSdkData() {\n  const sdk = window?.sophi?.paywall?.init({\n    hostname: window.location.hostname\n  })\n  const deviceInfo = await sdk?.parseDeviceInformation()\n  const visitInfo = await sdk?.getVisitInformation()\n  return { deviceInfo, visitInfo }\n}\n\nasync function getAnalyticsApiData() {\n  try {\n    const response = await api.get('user/analytics', true)\n\n    return response.body\n  } catch (error) {\n    console.error('Analytics api error: ', error)\n  }\n}\n\nfunction getEntitlements(ssvcs = '') {\n  const PRODUCTS = {\n    ADVISOR: {\n      name: 'globe-advisor',\n      groupCode: 'GA'\n    },\n    DIGITAL: {\n      name: 'digital-subscriber',\n      groupCode: 'PREMIUM'\n    },\n    NONE: {\n      name: 'none',\n      groupCode: null\n    },\n    NYT_PRINT: {\n      name: 'nyt-print-subscriber',\n      groupCode: 'NYT'\n    },\n    ONDEMAND_DIGITAL: {\n      name: 'ondemand-subscriber',\n      groupCode: 'PREMIUM-ONDEMAND'\n    },\n    PRINT: {\n      name: 'print-subscriber',\n      groupCode: 'NPGAM'\n    },\n    FIN_TOOLS_TRIAL: {\n      name: 'finance-tools-trial',\n      groupCode: 'FINANCE'\n    }\n  }\n\n  const defaultProducts = {\n    NONE: PRODUCTS.NONE\n  }\n\n  const services = ssvcs.split(',')\n  const entitlements = {}\n  services.forEach(service => {\n    const code = service.split('~')[0]\n    for (const id in PRODUCTS) {\n      const product = PRODUCTS[id]\n      if (code === product.groupCode) {\n        entitlements[id] = product\n      }\n    }\n  })\n\n  return !isObjectEmpty(entitlements) ? entitlements : defaultProducts\n}\n\nasync function identify() {\n  const accountTypes = {\n    anonymous: 'Anonymous',\n    registered: 'Registered',\n    subscribed: 'Subscribed'\n  }\n\n  const sophiSdkData = await getSophiSdkData()\n  const isAuthenticated = store.state.isAuthenticated\n  const analyticsApiData = isAuthenticated ? await getAnalyticsApiData() : {}\n  const ssvcs = analyticsApiData?.ssvcs ?? ''\n  const access = getEntitlements(ssvcs)\n  const registered = isNil(access.DIGITAL)\n  const accountType = registered\n    ? accountTypes.registered\n    : accountTypes.subscribed\n\n  const trackedRegwallAndFusionExperiments = [\n    ...formatForSophi3(store.state.ameliaAllocation),\n    // tgam.fusion.tests example: promotions-cem3135_promotions-cem3135_100:control:default%2Cpromotions-cem3248_promotions-cem3248_100:control:default%2Ctest1_aa_sophizephr:test1_aa_100:holdout:default%2Carc-10891_version1_100:control:default\n    ...getAmeliaExperiments('tgam.fusion.tests'),\n    // tgam.limio.tests example: gufunnel-sabre1094_gufunnel-sabre1094_100:experience:default%2Csabre1094_sabre1094_100:experience:default\n    ...getAmeliaExperiments('tgam.limio.tests')\n  ]\n\n  const identifyData = {\n    'account type': isAuthenticated ? accountType.toLowerCase() : 'anonymous',\n    'ssvc value': analyticsApiData?.postal ?? '',\n    'test id': formatForAmplitude(trackedRegwallAndFusionExperiments),\n    zipcode: analyticsApiData?.ssvcs ?? '',\n    // sophi test group\n    'sophi test id': Cookie.get('tgam.sophi.tests')\n      ? JSON.parse(Cookie.get('tgam.sophi.tests'))\n      : [],\n    // Sophi data\n    'device category': sophiSdkData?.deviceInfo?.type ?? '',\n    'device viewer': sophiSdkData?.deviceInfo?.viewer ?? '',\n    'device os': sophiSdkData?.deviceInfo?.os ?? '',\n    'wall visit count': sophiSdkData?.visitInfo?.count ?? 0,\n    'wall timezone': sophiSdkData?.visitInfo?.timeZone ?? '',\n    'wall days since last visit':\n      sophiSdkData?.visitInfo?.daysSinceLastVisit ?? 0\n  }\n\n  ampli.identify(\n    isAuthenticated ? analyticsApiData?.guid : undefined, // user id - undefined for anonymous users\n    sortEventPayload(identifyData)\n  )\n}\n\nexport {\n  accountRegistration,\n  accountLogin,\n  accountLogout,\n  accountInteraction,\n  identify,\n  sectionView,\n  getEntitlements,\n  getAnalyticsApiData\n}\n"],"sourceRoot":""}