{"status":"OK","geo":"US","deviceDetected":1,"fiViewerId":"f042623a023dcf00cb2679294b5ebb6d","pageViewUniqueId":2296695850574139,"datasource":"LIVE","options":{"cmp_enableintegration":true,"amp":{"initialMinSpacing":0.9,"initialMinSpacingUnits":"vp"},"hb_analytics":true,"notHotDog":{"enabled":false,"selectors":[]},"siteLang":"en","campaignLimitations":{},"eventTracking":{"trackingDomains":[{"host":"cdn.firstimpression.io","type":"full"}],"trackScroll":1,"trackTimeOnPage":1,"probability":12,"cookiename":"fitracking"},"prependScript":"if( (new Date() - new Date(FI.options.builtOn)) \/ (1000*60*60) > 24 ) {\n    if(!window.fi_reloaded) { window.fi_reloaded=true;\n    \tfetch(\"https:\/\/\" + FI.options.ecdnDomain + \"\/fi_client.js\",  {cache: \"reload\"}).then(()=>{ \t\t\n    \t    clearTimeout(FI.g_clientManager.appendLoopTimeout);\n    \t\tvar body = document.getElementsByTagName(\"head\")[0];\n                newdiv = document.createElement(\"script\");\n    \t\t    newdiv.setAttribute(\"type\", \"text\/javascript\");\n    \t\t    newdiv.setAttribute(\"src\", \"https:\/\/\" + FI.options.ecdnDomain + \"\/fi_client.js\");    \n    \t    delete FI; delete fipb; delete fiQuery;\n    \t    body.appendChild(newdiv);\n    \t\tthrow (\"Cache problem!\");\n    \t});\n    \treturn;\n    }\n}\n\/*{trackingcode|cookiename:fitracking}*\/  \nfiQuery(window).on('SPCReturned', function() {\n     FI.state.utils = fiUtils = {\n            getPlacementsPerCond: function(...cond) {\n                var count = 0;\n                return fiQuery.map(FI.g_clientManager.placementQueue, function($placement) {\n                    count = 0;\n                    for (let i = 0; i < cond.length; i++) {\n                        if (fiUtils[cond[i].placement]($placement, cond[i].is)) count++;\n                    }\n                    if (count == cond.length) return [$placement];\n                });               \n            },\n            enabledExtraOption : function($placement, option) {\n                return (typeof $placement.options.extra != 'undefined' && typeof $placement.options.extra[option] != 'undefined' && (typeof $placement.options.extra[option].enabled != 'undefined' && $placement.options.extra[option].enabled || typeof $placement.options.extra[option].enabled == 'undefined')) \n                || (typeof $placement.options[option] != 'undefined' && (typeof $placement.options[option].enabled != 'undefined' && $placement.options[option].enabled || typeof $placement.options[option].enabled == 'undefined'));\n             },\n            enabledExtraValue : function($placement, optionPathAndValueArr) {\n                let optionVal = optionPathAndValueArr.length - 1,\n                \tplacementOption = typeof $placement.options.extra != 'undefined' ? $placement.options.extra : $placement.options,\n                \toptionNotFound = false;\n                for (var i = 0; i <= optionPathAndValueArr.length - 2; i++) {\n                \tif (typeof placementOption[optionPathAndValueArr[i]] != \"undefined\") \n                \t\tplacementOption = placementOption[optionPathAndValueArr[i]];\n                \telse {\n                \t\toptionNotFound = true;\n                \t\tbreak;\n                \t} \n                }\n                return ! optionNotFound && placementOption == optionVal;\n            },\n            enabledOptionValue : function($placement, optionPathAndValueArr) {\n                let optionVal = optionPathAndValueArr.length - 1,\n                \tplacementOption = $placement.options;\n                \toptionNotFound = false;\n                for (var i = 0; i <= optionPathAndValueArr.length - 2; i++) {\n                \tif (typeof placementOption[optionPathAndValueArr[i]] != \"undefined\") \n                \t\tplacementOption = placementOption[optionPathAndValueArr[i]];\n                \telse {\n                \t\toptionNotFound = true;\n                \t\tbreak;\n                \t} \n                }\n                return ! optionNotFound && placementOption == optionVal;\n            },\n            multiInstance: function($placement) {\n                return $placement.options.totalRenderedInstancesLimitation > 1;\n            },\n             type : function($placement, type) {\n                return $placement.type == type;\n             },\n            pageErrors: [],\n            showAllErrors: function(_module) {\n                for (var i = 0; i < this.pageErrors.length; i++) {\n                    if (typeof _module == \"undefined\" || this.pageErrors[i].module == _module)\n                        this.console(this.pageErrors[i].message, \"Error\", this.pageErrors[i].module);\n                }\n            },\n            console: function(message, type, _module, placementId, bannerId) {\n                FI.console.log(typeof message != \"undefined\" ? message : \"No message here.. This seems odd\", \n                               typeof placementId != \"undefined\" ? placementId : '',\n                               typeof bannerId != \"undefined\" ? bannerId : '',\n                               typeof type != \"undefined\" ? type : 'Misc',\n                               typeof _module != \"undefined\" ? _module : '')\n            },\n            pageError: function(message, _module, placement) {\n                this.pageErrors.push({\"message\": message, \"module\": _module, \"placement\": placement});\n                this.console(message, \"Error\", _module);\n            },\n            getExtra: function($placement) {\n                if (typeof $placement == \"object\" && typeof $placement.options != \"undefined\")\n                    return typeof $placement.options.extra != \"undefined\" ? $placement.options.extra : $placement.options;  \n                else if (typeof $placement == \"number\")\n                    return typeof FI.g_clientManager.getPlacement($placement).options.extra != \"undefined\" ? $placement.options.extra : $placement.options;  \n                else {\n                    fiUtils.pageError(\"Invoking getExtra but providing ${$placement} which is not a number or an object\");\n                    return { \"options\" : { \"extra\": {} } }\n                }\n            },\n            getWebsiteMacro: function(macro) {\n                return macro.indexOf(\"{\") == -1 ? macro : null;\n            },\n            isLastInstance : function($instance) {\n                return $instance.instanceId.split('_')[2] == $instance.placement.instances.length - 1;\n            },\n            getInstanceId: function($instance) {\n                return $instance.instanceId.split(\"_\")[2];\n            },\n            isPlacementOptionEnabled: function($instance, option) {\n                return typeof $instance.placement.options[option] != \"undefined\" && $instance.placement.options[option][\"enabled\"];\n            },\n            appenndRecorderDiv: function(recorderClass) {\n                if (fiQuery(\"recorder\").length == 0) {\n                    fiQuery('body').append(`<div class=recorder ${recorderClass}><\/div>`);\n                } else {\n                    fiQuery(\"recorder\").addClass(`${recorderClass}`);\n                }\n            },\n            detectDeviceOrientation: function () {\n                return window.matchMedia(\"(orientation: portrait)\") ? \"portrait\" : \"landscape\";\n            },\n\t\t\tgetManupiliationStateByHighestValuePerPlacementType: function(arr, placementType) { \n\t\t\t\tarr = arr.map((state, index, array) => {\n\t\t\t\t\tif (typeof state != \"undefined\") return typeof fiUtils.fixed.manupiliateElementsPerPlacementType[placementType][state.name] != \"undefined\" ? state : '';\n\t\t\t\t}).filter(elem => elem != \"\");\n\n\t\t\t\treturn arr.reduce(function(prev, current) { \n\t\t\t\t\tif (typeof current != \"undefined\") return Math.abs(prev.value) > Math.abs(current.value) ? prev : current;\n\t\t\t\t\treturn Math.abs(prev.value);\n\t\t\t\t});\n\t\t\t},\n            setRecorder: function(update) {\n                if (fiQuery(\"div#fi_recorder\").length == 0) fiQuery('body').append('<div id=fi_recorder><\/div>');\n                if (typeof update != 'undefined' ) fiQuery(\"div#fi_recorder\").addClass(update);\n            },\n\t\t\tfixed: {\n\t\t\t\tManipulationState : function(name, CSSKeyValuePair, selector) { \n\t\t\t\t\tthis.name = name;\n\t\t\t\t\t\/\/ Selector not found, let's wait for it\n\t\t\t\t\tif (fiQuery(selector).length == 0) { \n\t\t\t\t\t\tthis.value = fiUtils.fixed.waitForSelector(selector, this, CSSKeyValuePair);\n\t\t\t\t\t\tthis.selector = null;\n\t\t\t\t\t\/\/ We need to pull the value dynamically from the DOM\n\t\t\t\t\t} else if (CSSKeyValuePair.property != null) {\n\t\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\t\tthis.value = fiQuery(CSSKeyValuePair.value)[CSSKeyValuePair.property]();\n\t\t\t\t\t\/\/ Seems selector is found and value is static so let's just move on \n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\t\tthis.value = CSSKeyValuePair.value;\n\t\t\t\t\t}\n\t\t\t\t\tthis.viewable = false;\n\t\t\t\t},\n\t\t\t\tplacementsToManupiliate : [],\n\t\t\t\tmanupiliateElementsPerPlacementType :  {\n\t\t\t\t\theaderKick: {\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickInner').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickAnchor').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t\tfiQuery(fiUtils.getWebsiteMacro('{{m:nav_on_scroll}}')).css({transform: `translateY(0px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickInner').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickAnchor').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery(fiUtils.getWebsiteMacro('{{m:nav_on_scroll}}')).css({transform: `translateY(${fiQuery('div#FIHeaderKickAnchor').height()}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclose : function(value) {\n\t\t\t\t\t\t    FI.console.log(`Resetting all manupiliations on other elements since placement was either closed or reached its end of the waterfall`, ``, ``, `fiUtils.fixed`);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush : function(valie) {\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickInner').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery('div#FIHeaderKickAnchor').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t\tfiQuery(fiUtils.getWebsiteMacro('{{m:nav_on_scroll}}')).css({transform: `translateY(${fiQuery('div#FIHeaderKickAnchor').height()}px)`});\n\t\t\t\t\t\t}\n\t\t\t\t\t},  \n\t\t\t\t\tbottomsticky: { \n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(${-value}px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcookieNoticePush: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(${-value}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbottomBarPush: function(value) {\n\t\t\t\t\t\t\tfiQuery('div#FIBottomStickyInner').css({transform: `translateY(${-value}px)`});\n\t\t\t\t\t\t}\n\t\t\t\t\t}, \n\t\t\t\t\touterdocked: {\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex:`${value}`});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush: function(value) { \n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t}\t\t\n\t\t\t\t\t}, \n\t\t\t\t\tdocked: {\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex:`${value}`});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(0px)`});\n\t\t\t\t\t\t}, \n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush: function(value) {\n\t\t\t\t\t\t\tfiQuery('div.fi-docked').css({zIndex: 99998});\n\t\t\t\t\t\t\tfiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({transform: `translateY(${value}px)`});\n\t\t\t\t\t\t}\t\n\t\t\t\t\t}, \n\t\t\t\t\thybridDocked:  {\n\t\t\t\t\t\tinitStaticStateFailSafeStyle: function () {\n\t\t\t\t\t\t\tfiQuery('body').append('<style id=\"fi-translateY-control\"> .fi-detachable-hybriddocked[style*=\"static\"] { transform: translateY(0px) !important; } <\/style>');\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thide: function(value) {\n\t\t\t\t\t\t\tif (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked-stripe').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked.apd_docked').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnavBarPush: function(value) {\n\t\t\t\t\t\t\tif (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked-stripe').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked.apd_docked').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\t\t\t\t\t\tshow: function(value) {\n\t\t\t\t\t\t\tif (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked.apd_docked').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\n\t\t\t\t\t\t\tfiQuery('.fi-detachable-hybriddocked-stripe').css({transform: `translateY(${value}px)`, transition: `all 0.1s`});\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twaitForSelector: function(selector, state, CSSKeyValuePair) { \n\t\t\t\t\tFI.awaitFor(() => fiQuery(selector).length > 0)\n\t\t\t\t\t\t.then(() => { \n\t\t\t\t\t\t\tstate.selector = selector;\n\t\t\t\t\t\t\tif (CSSKeyValuePair.property != null ) state.value = fiQuery(CSSKeyValuePair.value)[CSSKeyValuePair.property]();\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tstate.value = CSSKeyValuePair.value;\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tobservedManupilationArray : [],\n\t\t\t\ttrakcedManipulationStatesArray : [],\n\t\t\t\tpushObservedManupilationArray: function(name, value, selector) {\n\t\t\t\t\tif (fiUtils.getWebsiteMacro(selector) != null)\n\t\t\t\t\t\tfiUtils.fixed.observedManupilationArray.push(new fiUtils.fixed.ManipulationState(name, value, selector));\n\t\t\t\t},\n\t\t\t\tresetElementViewability: function(initManupilation) {\n\t\t\t\t\tfiUtils.fixed.observedManupilationArray.forEach((element, index, arr) => {\n\t\t\t\t\t\tif (element.viewable && fiQuery(element.selector).length == 0) element.viewable = false;\n\t\t\t\t\t});\n\t\t\t\t\tfor (var i = 0; i < fiUtils.fixed.trakcedManipulationStatesArray.length; i++) {\n\t\t\t\t\t\tif (! fiUtils.fixed.trakcedManipulationStatesArray[i].viewable) {\n\t\t\t\t\t\t\tfiUtils.fixed.trakcedManipulationStatesArray.splice(i,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (fiUtils.fixed.trakcedManipulationStatesArray.length > 0) { \n\t\t\t\t\t\tfiUtils.fixed.manupilateThis(fiUtils.fixed.trakcedManipulationStatesArray, initManupilation);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tisFixedState: function() {\n\t\t\t\t\treturn fiQuery('div.apd_docked').length > 0 || fiQuery('div#FIHeaderKickInner').length > 0 || fiQuery('div#FIBottomStickyInner').length > 0 || fiQuery('div.FIOnDemandWrapper > div.fi-docked').length > 0;\n\t\t\t\t},\n\t\t\t\tshouldWeManupiliate : function(arr, initManupilation) { \n\t\t\t\t\tif (fiUtils.fixed.isFixedState()) { \n\t\t\t\t\t\tlet changedObservedManupilationArray = arr.filter((element, index, array) => fiQuery(element.selector).length > 0 && ! element.viewable ? element : '');\n\t\t\t\t\t\tif (changedObservedManupilationArray.length == 0 && fiUtils.fixed.trakcedManipulationStatesArray.length > 0) fiUtils.fixed.resetElementViewability(initManupilation);\n\t\t\t\t\t\tif (changedObservedManupilationArray.length > 0) { \n\t\t\t\t\t\t\tchangedObservedManupilationArray.forEach((manupliationState) =>  fiUtils.fixed.trakcedManipulationStatesArray.push(manupliationState));\n\t\t\t\t\t\t\tfor (var i = 0; i < changedObservedManupilationArray.length; i++) {\n\t\t\t\t\t\t\t\tfor (var j = 0; j < fiUtils.fixed.observedManupilationArray.length; j++) {\n\t\t\t\t\t\t\t\t\tif (changedObservedManupilationArray[i].name == fiUtils.fixed.observedManupilationArray[j].name) {\n\t\t\t\t\t\t\t\t\t\tfiUtils.fixed.observedManupilationArray[j].viewable = true;\n\t\t\t\t\t\t\t\t\t\tFI.console.log(`${fiUtils.fixed.observedManupilationArray[j].name} is in view!`, ``, ``, `fiUtils.fixed`);\n\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}, \n\t\t\t\tmanageManupiliations: function(arr, initManupilation) {\n\t\t\t\t\tif (typeof initManupilation != \"function\") {\n\t\t\t\t\t\tFI.console.log(`ERROR: You provided an init manupilate but its not a function. This won't work`, ``, ``, `fiUtils.fixed`)\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tFI.awaitFor(() => fiUtils.fixed.shouldWeManupiliate(arr, initManupilation))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tfiUtils.fixed.manupilateThis(fiUtils.fixed.trakcedManipulationStatesArray, initManupilation);\n\t\t\t\t\t\t\t\/\/Re-init\n\t\t\t\t\t\t\tfiUtils.fixed.manageManupiliations(arr ,initManupilation);\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmanupilateThis(arr, initManupilation) {\n\t\t\t\t\tfiUtils.fixed.placementsToManupiliate.forEach(($placement) => initManupilation(fiUtils.getManupiliationStateByHighestValuePerPlacementType(arr, $placement.type).value, $placement.type, fiUtils.getManupiliationStateByHighestValuePerPlacementType(arr, $placement.type).name));\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n    };\n    if (localStorage.apdAdmin == 1) {\n        Object.keys(fiUtils).forEach((utilFunc) => {\n              if (typeof fiUtils[utilFunc] == \"function\" && utilFunc.indexOf(\"error\") == -1 && FI.options.prependScript.indexOf(`${utilFunc}(`) == -1)\n                  fiUtils.pageErrors.push({\"message\": `The fiUtils function ${utilFunc} seems not to be in use in the website prepend`, \"module\" : `fiUtils`});\n        });\n    }\n});"},"sessionTracking":true,"GDPRApplies":false,"USnatApplies":true,"USstatesApplies":false,"cmp_enforce":null,"incognito":null,"placements":[],"messages":[{"type":"info","text":"Will serve you ALL LIVE placements (all enabled placements, that are not in QA and not hidden)"}],"utm":{"utm_source":"direct","utm_medium":"direct","utm_campaign":"","utm_content":"","utm_keyword":"","utm_ref":""}}