{ "version": 3, "sources": ["node_modules/what-input/dist/what-input.js", "node_modules/fastdom/fastdom.js", "src/js/site.js", "src/js/base/swap-plugin.js", "src/js/base/ajax-alert.js", "src/js/base/background.js", "src/js/base/page.js", "src/js/base/swap.js", "node_modules/formstone/dist/js/core.js", "node_modules/formstone/dist/js/touch.js", "node_modules/formstone/dist/js/mediaquery.js", "node_modules/formstone/dist/js/carousel.js", "src/js/base/carousel.js", "src/js/base/logo-scroll.js", "src/js/base/menu.js", "src/js/base/nav.js", "src/js/base/search-menu.js", "src/js/base/sub-nav.js", "src/js/base/video-appender.js", "src/js/modules/accordion.js", "node_modules/cookieconsent/build/cookieconsent.min.js", "src/js/modules/cookieconsent-config.js", "src/js/modules/home.js", "src/js/modules/interior.js", "src/js/modules/media-gallery-featured.js", "src/js/modules/media-gallery.js", "src/js/modules/media-top.js", "src/js/base/cookies.js", "src/js/modules/quick-links.js", "src/js/modules/share-tools.js", "src/js/modules/logo_grid.js", "src/js/modules/block_callouts.js", "src/js/modules/topic_image.js", "src/js/modules/thermometer.js", "src/js/modules/department-item.js", "src/js/modules/shuttle-schedule.js"], "sourcesContent": ["/**\n * what-input - A global utility for tracking the current input method (mouse, keyboard or touch).\n * @version v5.2.10\n * @link https://github.com/ten1seven/what-input\n * @license MIT\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"whatInput\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"whatInput\"] = factory();\n\telse\n\t\troot[\"whatInput\"] = factory();\n})(this, function() {\nreturn /*/ (function(modules) { // webpackBootstrap\n/*/ \t// The module cache\n/*/ \tvar installedModules = {};\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\n/*/ \t\t// Create a new module (and put it into the cache)\n/*/ \t\tvar module = installedModules[moduleId] = {\n/*/ \t\t\texports: {},\n/*/ \t\t\tid: moduleId,\n/*/ \t\t\tloaded: false\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.loaded = true;\n\n/*/ \t\t// Return the exports of the module\n/*/ \t\treturn module.exports;\n/*/ \t}\n\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// __webpack_public_path__\n/*/ \t__webpack_require__.p = \"\";\n\n/*/ \t// Load entry module and return exports\n/*/ \treturn __webpack_require__(0);\n/*/ })\n/**/\n/*/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t /*\n\t * bail out if there is no document or window\n\t * (i.e. in a node/non-DOM environment)\n\t *\n\t * Return a stubbed API instead\n\t */\n\t if (typeof document === 'undefined' || typeof window === 'undefined') {\n\t return {\n\t // always return \"initial\" because no interaction will ever be detected\n\t ask: function ask() {\n\t return 'initial';\n\t },\n\n\t // always return null\n\t element: function element() {\n\t return null;\n\t },\n\n\t // no-op\n\t ignoreKeys: function ignoreKeys() {},\n\n\t // no-op\n\t specificKeys: function specificKeys() {},\n\n\t // no-op\n\t registerOnChange: function registerOnChange() {},\n\n\t // no-op\n\t unRegisterOnChange: function unRegisterOnChange() {}\n\t };\n\t }\n\n\t /*\n\t * variables\n\t */\n\n\t // cache document.documentElement\n\t var docElem = document.documentElement;\n\n\t // currently focused dom element\n\t var currentElement = null;\n\n\t // last used input type\n\t var currentInput = 'initial';\n\n\t // last used input intent\n\t var currentIntent = currentInput;\n\n\t // UNIX timestamp of current event\n\t var currentTimestamp = Date.now();\n\n\t // check for a `data-whatpersist` attribute on either the `html` or `body` elements, defaults to `true`\n\t var shouldPersist = 'false';\n\n\t // form input types\n\t var formInputs = ['button', 'input', 'select', 'textarea'];\n\n\t // empty array for holding callback functions\n\t var functionList = [];\n\n\t // list of modifier keys commonly used with the mouse and\n\t // can be safely ignored to prevent false keyboard detection\n\t var ignoreMap = [16, // shift\n\t 17, // control\n\t 18, // alt\n\t 91, // Windows key / left Apple cmd\n\t 93 // Windows menu / right Apple cmd\n\t ];\n\n\t var specificMap = [];\n\n\t // mapping of events to input types\n\t var inputMap = {\n\t keydown: 'keyboard',\n\t keyup: 'keyboard',\n\t mousedown: 'mouse',\n\t mousemove: 'mouse',\n\t MSPointerDown: 'pointer',\n\t MSPointerMove: 'pointer',\n\t pointerdown: 'pointer',\n\t pointermove: 'pointer',\n\t touchstart: 'touch',\n\t touchend: 'touch'\n\n\t // boolean: true if the page is being scrolled\n\t };var isScrolling = false;\n\n\t // store current mouse position\n\t var mousePos = {\n\t x: null,\n\t y: null\n\n\t // map of IE 10 pointer events\n\t };var pointerMap = {\n\t 2: 'touch',\n\t 3: 'touch', // treat pen like touch\n\t 4: 'mouse'\n\n\t // check support for passive event listeners\n\t };var supportsPassive = false;\n\n\t try {\n\t var opts = Object.defineProperty({}, 'passive', {\n\t get: function get() {\n\t supportsPassive = true;\n\t }\n\t });\n\n\t window.addEventListener('test', null, opts);\n\t } catch (e) {}\n\t // fail silently\n\n\n\t /*\n\t * set up\n\t */\n\n\t var setUp = function setUp() {\n\t // add correct mouse wheel event mapping to `inputMap`\n\t inputMap[detectWheel()] = 'mouse';\n\n\t addListeners();\n\t };\n\n\t /*\n\t * events\n\t */\n\n\t var addListeners = function addListeners() {\n\t // `pointermove`, `MSPointerMove`, `mousemove` and mouse wheel event binding\n\t // can only demonstrate potential, but not actual, interaction\n\t // and are treated separately\n\t var options = supportsPassive ? { passive: true } : false;\n\n\t document.addEventListener('DOMContentLoaded', setPersist);\n\n\t // pointer events (mouse, pen, touch)\n\t if (window.PointerEvent) {\n\t window.addEventListener('pointerdown', setInput);\n\t window.addEventListener('pointermove', setIntent);\n\t } else if (window.MSPointerEvent) {\n\t window.addEventListener('MSPointerDown', setInput);\n\t window.addEventListener('MSPointerMove', setIntent);\n\t } else {\n\t // mouse events\n\t window.addEventListener('mousedown', setInput);\n\t window.addEventListener('mousemove', setIntent);\n\n\t // touch events\n\t if ('ontouchstart' in window) {\n\t window.addEventListener('touchstart', setInput, options);\n\t window.addEventListener('touchend', setInput);\n\t }\n\t }\n\n\t // mouse wheel\n\t window.addEventListener(detectWheel(), setIntent, options);\n\n\t // keyboard events\n\t window.addEventListener('keydown', setInput);\n\t window.addEventListener('keyup', setInput);\n\n\t // focus events\n\t window.addEventListener('focusin', setElement);\n\t window.addEventListener('focusout', clearElement);\n\t };\n\n\t // checks if input persistence should happen and\n\t // get saved state from session storage if true (defaults to `false`)\n\t var setPersist = function setPersist() {\n\t shouldPersist = !(docElem.getAttribute('data-whatpersist') || document.body.getAttribute('data-whatpersist') === 'false');\n\n\t if (shouldPersist) {\n\t // check for session variables and use if available\n\t try {\n\t if (window.sessionStorage.getItem('what-input')) {\n\t currentInput = window.sessionStorage.getItem('what-input');\n\t }\n\n\t if (window.sessionStorage.getItem('what-intent')) {\n\t currentIntent = window.sessionStorage.getItem('what-intent');\n\t }\n\t } catch (e) {\n\t // fail silently\n\t }\n\t }\n\n\t // always run these so at least `initial` state is set\n\t doUpdate('input');\n\t doUpdate('intent');\n\t };\n\n\t // checks conditions before updating new input\n\t var setInput = function setInput(event) {\n\t var eventKey = event.which;\n\t var value = inputMap[event.type];\n\n\t if (value === 'pointer') {\n\t value = pointerType(event);\n\t }\n\n\t var ignoreMatch = !specificMap.length && ignoreMap.indexOf(eventKey) === -1;\n\n\t var specificMatch = specificMap.length && specificMap.indexOf(eventKey) !== -1;\n\n\t var shouldUpdate = value === 'keyboard' && eventKey && (ignoreMatch || specificMatch) || value === 'mouse' || value === 'touch';\n\n\t // prevent touch detection from being overridden by event execution order\n\t if (validateTouch(value)) {\n\t shouldUpdate = false;\n\t }\n\n\t if (shouldUpdate && currentInput !== value) {\n\t currentInput = value;\n\n\t persistInput('input', currentInput);\n\t doUpdate('input');\n\t }\n\n\t if (shouldUpdate && currentIntent !== value) {\n\t // preserve intent for keyboard interaction with form fields\n\t var activeElem = document.activeElement;\n\t var notFormInput = activeElem && activeElem.nodeName && (formInputs.indexOf(activeElem.nodeName.toLowerCase()) === -1 || activeElem.nodeName.toLowerCase() === 'button' && !checkClosest(activeElem, 'form'));\n\n\t if (notFormInput) {\n\t currentIntent = value;\n\n\t persistInput('intent', currentIntent);\n\t doUpdate('intent');\n\t }\n\t }\n\t };\n\n\t // updates the doc and `inputTypes` array with new input\n\t var doUpdate = function doUpdate(which) {\n\t docElem.setAttribute('data-what' + which, which === 'input' ? currentInput : currentIntent);\n\n\t fireFunctions(which);\n\t };\n\n\t // updates input intent for `mousemove` and `pointermove`\n\t var setIntent = function setIntent(event) {\n\t var value = inputMap[event.type];\n\n\t if (value === 'pointer') {\n\t value = pointerType(event);\n\t }\n\n\t // test to see if `mousemove` happened relative to the screen to detect scrolling versus mousemove\n\t detectScrolling(event);\n\n\t // only execute if scrolling isn't happening\n\t if ((!isScrolling && !validateTouch(value) || isScrolling && event.type === 'wheel' || event.type === 'mousewheel' || event.type === 'DOMMouseScroll') && currentIntent !== value) {\n\t currentIntent = value;\n\n\t persistInput('intent', currentIntent);\n\t doUpdate('intent');\n\t }\n\t };\n\n\t var setElement = function setElement(event) {\n\t if (!event.target.nodeName) {\n\t // If nodeName is undefined, clear the element\n\t // This can happen if click inside an element.\n\t clearElement();\n\t return;\n\t }\n\n\t currentElement = event.target.nodeName.toLowerCase();\n\t docElem.setAttribute('data-whatelement', currentElement);\n\n\t if (event.target.classList && event.target.classList.length) {\n\t docElem.setAttribute('data-whatclasses', event.target.classList.toString().replace(' ', ','));\n\t }\n\t };\n\n\t var clearElement = function clearElement() {\n\t currentElement = null;\n\n\t docElem.removeAttribute('data-whatelement');\n\t docElem.removeAttribute('data-whatclasses');\n\t };\n\n\t var persistInput = function persistInput(which, value) {\n\t if (shouldPersist) {\n\t try {\n\t window.sessionStorage.setItem('what-' + which, value);\n\t } catch (e) {\n\t // fail silently\n\t }\n\t }\n\t };\n\n\t /*\n\t * utilities\n\t */\n\n\t var pointerType = function pointerType(event) {\n\t if (typeof event.pointerType === 'number') {\n\t return pointerMap[event.pointerType];\n\t } else {\n\t // treat pen like touch\n\t return event.pointerType === 'pen' ? 'touch' : event.pointerType;\n\t }\n\t };\n\n\t // prevent touch detection from being overridden by event execution order\n\t var validateTouch = function validateTouch(value) {\n\t var timestamp = Date.now();\n\n\t var touchIsValid = value === 'mouse' && currentInput === 'touch' && timestamp - currentTimestamp < 200;\n\n\t currentTimestamp = timestamp;\n\n\t return touchIsValid;\n\t };\n\n\t // detect version of mouse wheel event to use\n\t // via https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event\n\t var detectWheel = function detectWheel() {\n\t var wheelType = null;\n\n\t // Modern browsers support \"wheel\"\n\t if ('onwheel' in document.createElement('div')) {\n\t wheelType = 'wheel';\n\t } else {\n\t // Webkit and IE support at least \"mousewheel\"\n\t // or assume that remaining browsers are older Firefox\n\t wheelType = document.onmousewheel !== undefined ? 'mousewheel' : 'DOMMouseScroll';\n\t }\n\n\t return wheelType;\n\t };\n\n\t // runs callback functions\n\t var fireFunctions = function fireFunctions(type) {\n\t for (var i = 0, len = functionList.length; i < len; i++) {\n\t if (functionList[i].type === type) {\n\t functionList[i].fn.call(undefined, type === 'input' ? currentInput : currentIntent);\n\t }\n\t }\n\t };\n\n\t // finds matching element in an object\n\t var objPos = function objPos(match) {\n\t for (var i = 0, len = functionList.length; i < len; i++) {\n\t if (functionList[i].fn === match) {\n\t return i;\n\t }\n\t }\n\t };\n\n\t var detectScrolling = function detectScrolling(event) {\n\t if (mousePos.x !== event.screenX || mousePos.y !== event.screenY) {\n\t isScrolling = false;\n\n\t mousePos.x = event.screenX;\n\t mousePos.y = event.screenY;\n\t } else {\n\t isScrolling = true;\n\t }\n\t };\n\n\t // manual version of `closest()`\n\t var checkClosest = function checkClosest(elem, tag) {\n\t var ElementPrototype = window.Element.prototype;\n\n\t if (!ElementPrototype.matches) {\n\t ElementPrototype.matches = ElementPrototype.msMatchesSelector || ElementPrototype.webkitMatchesSelector;\n\t }\n\n\t if (!ElementPrototype.closest) {\n\t do {\n\t if (elem.matches(tag)) {\n\t return elem;\n\t }\n\n\t elem = elem.parentElement || elem.parentNode;\n\t } while (elem !== null && elem.nodeType === 1);\n\n\t return null;\n\t } else {\n\t return elem.closest(tag);\n\t }\n\t };\n\n\t /*\n\t * init\n\t */\n\n\t // don't start script unless browser cuts the mustard\n\t // (also passes if polyfills are used)\n\t if ('addEventListener' in window && Array.prototype.indexOf) {\n\t setUp();\n\t }\n\n\t /*\n\t * api\n\t */\n\n\t return {\n\t // returns string: the current input type\n\t // opt: 'intent'|'input'\n\t // 'input' (default): returns the same value as the `data-whatinput` attribute\n\t // 'intent': includes `data-whatintent` value if it's different than `data-whatinput`\n\t ask: function ask(opt) {\n\t return opt === 'intent' ? currentIntent : currentInput;\n\t },\n\n\t // returns string: the currently focused element or null\n\t element: function element() {\n\t return currentElement;\n\t },\n\n\t // overwrites ignored keys with provided array\n\t ignoreKeys: function ignoreKeys(arr) {\n\t ignoreMap = arr;\n\t },\n\n\t // overwrites specific char keys to update on\n\t specificKeys: function specificKeys(arr) {\n\t specificMap = arr;\n\t },\n\n\t // attach functions to input and intent \"events\"\n\t // funct: function to fire on change\n\t // eventType: 'input'|'intent'\n\t registerOnChange: function registerOnChange(fn, eventType) {\n\t functionList.push({\n\t fn: fn,\n\t type: eventType || 'input'\n\t });\n\t },\n\n\t unRegisterOnChange: function unRegisterOnChange(fn) {\n\t var position = objPos(fn);\n\n\t if (position || position === 0) {\n\t functionList.splice(position, 1);\n\t }\n\t },\n\n\t clearStorage: function clearStorage() {\n\t window.sessionStorage.clear();\n\t }\n\t };\n\t}();\n\n/***/ })\n/*/ ])\n});\n;", "!(function(win) {\n\n/**\n * FastDom\n *\n * Eliminates layout thrashing\n * by batching DOM read/write\n * interactions.\n *\n * @author Wilson Page \n * @author Kornel Lesinski \n */\n\n'use strict';\n\n/**\n * Mini logger\n *\n * @return {Function}\n */\nvar debug = 0 ? console.log.bind(console, '[fastdom]') : function() {};\n\n/**\n * Normalized rAF\n *\n * @type {Function}\n */\nvar raf = win.requestAnimationFrame\n || win.webkitRequestAnimationFrame\n || win.mozRequestAnimationFrame\n || win.msRequestAnimationFrame\n || function(cb) { return setTimeout(cb, 16); };\n\n/**\n * Initialize a `FastDom`.\n *\n * @constructor\n */\nfunction FastDom() {\n var self = this;\n self.reads = [];\n self.writes = [];\n self.raf = raf.bind(win); // test hook\n debug('initialized', self);\n}\n\nFastDom.prototype = {\n constructor: FastDom,\n\n /**\n * We run this inside a try catch\n * so that if any jobs error, we\n * are able to recover and continue\n * to flush the batch until it's empty.\n *\n * @param {Array} tasks\n */\n runTasks: function(tasks) {\n debug('run tasks');\n var task; while (task = tasks.shift()) task();\n },\n\n /**\n * Adds a job to the read batch and\n * schedules a new frame if need be.\n *\n * @param {Function} fn\n * @param {Object} ctx the context to be bound to `fn` (optional).\n * @public\n */\n measure: function(fn, ctx) {\n debug('measure');\n var task = !ctx ? fn : fn.bind(ctx);\n this.reads.push(task);\n scheduleFlush(this);\n return task;\n },\n\n /**\n * Adds a job to the\n * write batch and schedules\n * a new frame if need be.\n *\n * @param {Function} fn\n * @param {Object} ctx the context to be bound to `fn` (optional).\n * @public\n */\n mutate: function(fn, ctx) {\n debug('mutate');\n var task = !ctx ? fn : fn.bind(ctx);\n this.writes.push(task);\n scheduleFlush(this);\n return task;\n },\n\n /**\n * Clears a scheduled 'read' or 'write' task.\n *\n * @param {Object} task\n * @return {Boolean} success\n * @public\n */\n clear: function(task) {\n debug('clear', task);\n return remove(this.reads, task) || remove(this.writes, task);\n },\n\n /**\n * Extend this FastDom with some\n * custom functionality.\n *\n * Because fastdom must *always* be a\n * singleton, we're actually extending\n * the fastdom instance. This means tasks\n * scheduled by an extension still enter\n * fastdom's global task queue.\n *\n * The 'super' instance can be accessed\n * from `this.fastdom`.\n *\n * @example\n *\n * var myFastdom = fastdom.extend({\n * initialize: function() {\n * // runs on creation\n * },\n *\n * // override a method\n * measure: function(fn) {\n * // do extra stuff ...\n *\n * // then call the original\n * return this.fastdom.measure(fn);\n * },\n *\n * ...\n * });\n *\n * @param {Object} props properties to mixin\n * @return {FastDom}\n */\n extend: function(props) {\n debug('extend', props);\n if (typeof props != 'object') throw new Error('expected object');\n\n var child = Object.create(this);\n mixin(child, props);\n child.fastdom = this;\n\n // run optional creation hook\n if (child.initialize) child.initialize();\n\n return child;\n },\n\n // override this with a function\n // to prevent Errors in console\n // when tasks throw\n catch: null\n};\n\n/**\n * Schedules a new read/write\n * batch if one isn't pending.\n *\n * @private\n */\nfunction scheduleFlush(fastdom) {\n if (!fastdom.scheduled) {\n fastdom.scheduled = true;\n fastdom.raf(flush.bind(null, fastdom));\n debug('flush scheduled');\n }\n}\n\n/**\n * Runs queued `read` and `write` tasks.\n *\n * Errors are caught and thrown by default.\n * If a `.catch` function has been defined\n * it is called instead.\n *\n * @private\n */\nfunction flush(fastdom) {\n debug('flush');\n\n var writes = fastdom.writes;\n var reads = fastdom.reads;\n var error;\n\n try {\n debug('flushing reads', reads.length);\n fastdom.runTasks(reads);\n debug('flushing writes', writes.length);\n fastdom.runTasks(writes);\n } catch (e) { error = e; }\n\n fastdom.scheduled = false;\n\n // If the batch errored we may still have tasks queued\n if (reads.length || writes.length) scheduleFlush(fastdom);\n\n if (error) {\n debug('task errored', error.message);\n if (fastdom.catch) fastdom.catch(error);\n else throw error;\n }\n}\n\n/**\n * Remove an item from an Array.\n *\n * @param {Array} array\n * @param {*} item\n * @return {Boolean}\n */\nfunction remove(array, item) {\n var index = array.indexOf(item);\n return !!~index && !!array.splice(index, 1);\n}\n\n/**\n * Mixin own properties of source\n * object into the target.\n *\n * @param {Object} target\n * @param {Object} source\n */\nfunction mixin(target, source) {\n for (var key in source) {\n if (source.hasOwnProperty(key)) target[key] = source[key];\n }\n}\n\n// There should never be more than\n// one instance of `FastDom` in an app\nvar exports = win.fastdom = (win.fastdom || new FastDom()); // jshint ignore:line\n\n// Expose to CJS & AMD\nif ((typeof define) == 'function') define(function() { return exports; });\nelse if ((typeof module) == 'object') module.exports = exports;\n\n})( typeof window !== 'undefined' ? window : this);\n", "jQuery(\"html\").removeClass(\"no-js\").addClass(\"js\");\n\n// setup.scss uses this.\nimport \"what-input\";\n\n// TODO: This seems like a polyfill for loading=\"lazy\" but\n// it also does something stupid not using CSS. Remove\n// once merged with ShortPixel AI branch\n//import \"./vendor/lazysizes.js\";\n\nimport \"./base/ajax-alert.js\"; // every page\n// require(\"../base/audience-nav.js\");\nimport \"./base/background.js\"; // background-video.php\nimport \"./base/carousel.js\"; // homepage_events, homepage_news, etc\n// require(\"../base/equalize.js\");\n// require(\"../base/lightbox.js\");\nimport \"./base/logo-scroll.js\"; // header\nimport \"./base/menu.js\"; // menu.php\nimport \"./base/nav.js\"; // basic.php\n// require(\"../base/page-video.js\");\nimport \"./base/page.js\"; // every page\nimport \"./base/search-menu.js\"; // search-menu.php\nimport \"./base/sub-nav.js\"; // sub.php\nimport \"./base/swap.js\"; // every page\nimport \"./base/video-appender.js\"; // media_gallery_set, media_gallery\nimport \"./modules/accordion.js\"; // accordion.php\nimport \"./modules/cookieconsent-config.js\"; // every page\nimport \"./modules/home.js\"; // page-home.php\nimport \"./modules/interior.js\"; // sub.php\nimport \"./modules/media-gallery-featured.js\"; // media_gallery_set\nimport \"./modules/media-gallery.js\"; // media_gallery.php\nimport \"./modules/media-top.js\"; // media-top.php\nimport \"./modules/quick-links.js\"; // quick-links.php\nimport \"./modules/share-tools.js\"; // share.php\nimport \"./modules/logo_grid.js\"; // logo_grid.php\nimport \"./modules/block_callouts.js\" // block_callouts\nimport \"./modules/topic_image.js\" // topic_image (topic media)\nimport \"./modules/thermometer.js\" // thermometer.php\nimport \"./modules/department-item.js\" // department-item.php\nimport \"./modules/shuttle-schedule.js\" //shuttle-schedule.php\n// require(\"../modules/video-appender.js\"); // hidden behind base/video-appender.js\n", "/* --------------------------------------------------------------------------\n\tRe-implementation of Formstone's swap.js plugin.\n\n\tGoal is to avoid importing FormStone core. Side goal is move as much\n\twork away from load time.\n\n\tMissing features are \"destroy\" and the maxWidth option.\n\n-------------------------------------------------------------------------- */\n\n\"use strict\";\nvar $ = jQuery;\n\nvar pluginOptions = {\n\tcollapse: true,\n\tmaxWidth: Infinity,\n};\n\n$.fn.swap = function swapPlugin(method) {\n\t// TODO: FormStone core adds some methods, like destroy and getData.\n\t// AFAICT we don't call them.\n\tvar METHODS = {\n\t\t'defaults': setDefaults,\n\t\t'activate': activate,\n\t\t'deactivate': deactivate,\n\t\t'enable': enable,\n\t\t'disable': disable,\n\t};\n\t\n\tif (typeof method === \"object\" || !method) {\n\t\t// $().swap(options) or .swap()\n\t\tconstruct.apply(this, arguments);\n\t} else {\n\t\t// $().swap('method', arg1, arg2)\n\t\tvar args = Array.prototype.slice.call(arguments, 1);\n\t\tMETHODS[method].apply(this, args);\n\t}\n\n\treturn this;\n};\n\n/**\n * Updates default plugin options.\n * \n * @param {object} options \n */\nfunction setDefaults(options) {\n\t$.extend(pluginOptions, options);\n}\n\n/**\n * Adds listeners and classes. Called bound to a jQuery collection. \n */\nfunction construct(optionsArgs) {\n\tvar options = {};\n\t$.extend(options, pluginOptions);\n\tif (optionsArgs) {\n\t\t$.extend(options, optionsArgs);\n\t}\n\t\n\t// Avoid adding duplicate listeners. Also do enable here\n\t// to avoid repeating the same searches.\n\tvar $elements = this.not('.fs-swap-element');\n\t$elements.on('click.swap', null, options, onClick)\n\t$elements.addClass(['fs-swap-element', 'fs-swap-enabled']);\n\n\tvisitTargets($elements, function (selector, links) {\n\t\tvar $targets = $(selector);\n\t\tif ($targets.length == 0) {\n\t\t\t// Swap element controls element that doesn't exist. Sometimes\n\t\t\t// part of linked set and the other member's target works.\n\t\t\t// Wastes some CPU time.\n\t\t\tconsole.warn(\"data-swap-target='\" + selector + \"' didn't match\");\n\t\t\treturn;\n\t\t}\n\t\tvar dups = false;\n\t\tvar key;\n\t\tfor (key in links) {\n\t\t\tif (dups) {\n\t\t\t\t// Swap elements control same target, but not as a linked set.\n\t\t\t\t// Allows mismatched active states between element and target.\n\t\t\t\tconsole.warn(\"data-swap-target='\" + selector + \"' has multiple controllers\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdups = true;\n\t\t}\n\t\t$targets.addClass(['fs-swap-target', 'fs-swap-enabled']);\n\t});\n\n\t$elements.trigger('enable.swap');\n\tactivate.apply($elements.filter('[data-swap-active]'));\n}\n\n/**\n * Old fashioned state kept in the DOM.\n * \n * @param {DOMElement} el \n * @returns boolean True if active\n */\nfunction isActive(el) {\n\treturn $(el).hasClass('fs-swap-active');\n}\n\n/**\n * Old fashioned state kept in the DOM.\n * \n * @param {DOMElement} el \n * @returns boolean True if enabled\n */\n function isEnabled(el) {\n\treturn $(el).hasClass('fs-swap-enabled');\n}\n\n/**\n * Finds swapper \"buttons\" linked together. Usually they share a target,\n * but \"don't\" have to.\n * \n * @param {DOMElement} el \n * @returns jQuery collection of elements linked together.\n */\n function getLinked(el) {\n\t// data-swap-linked: key that ties buttons controlling same target\n\tvar elements = $(el);\n\tvar linkName = elements.attr('data-swap-linked');\n\tif (linkName) {\n\t\telements = $('[data-swap-linked=\"' + linkName + '\"]');\n\t}\n\treturn elements;\n}\n\n/**\n * Finds swapper \"buttons\" groups. Like a radio button group\n * that unchecks the other radio buttons.\n * \n * @param {DOMElement} el \n * @returns jQuery collection in the \"radio\" group or null\n * if not grouped.\n */\nfunction getGroup(el) {\n\t// data-swap-group: key that ties buttons into a group\n\tvar group = null;\n\tvar groupName = $(el).attr('data-swap-group');\n\tif (groupName) {\n\t\tgroup = $('[data-swap-group=\"' + groupName + '\"]');\n\t}\n\treturn group;\n}\n\n/**\n * Collects swap target selectors and calls 'callback(selector)'\n * \n * @param {jQuery} $linked Collection of linked buttons\n * @param {function} callback Called with selector of targets\n */\nfunction visitTargets($linked, callback) {\n\tvar linkedTargets = {};\n\tvar unlinkedId = 0;\n\t$linked.each(function () {\n\t\tvar target = $(this).attr('data-swap-target');\n\t\tvar linked = $(this).attr('data-swap-linked');\n\t\tif (!linked) {\n\t\t\tunlinkedId++;\n\t\t\tlinked = \"unlinked-\" + unlinkedId;\n\t\t}\n\t\tlinkedTargets[target] = linkedTargets[target] || {};\n\t\tlinkedTargets[target][linked] = 1;\n\t});\n\n\tvar selector;\n\tfor (selector in linkedTargets) {\n\t\tif (linkedTargets.hasOwnProperty(selector)) {\n\t\t\tcallback(selector, linkedTargets[selector]);\n\t\t}\n\t}\n}\n\n/**\n * Handles clicked swappers. Called bound to a DOMElement as an\n * event handler.\n */\nfunction onClick(event) {\n\tif (!isEnabled(this)) {\n\t\treturn;\n\t}\n\n\tvar options;\n\t\n\tif ($(this).attr('data-swap-options')) {\n\t\tvar optionJson = $(this).attr('data-swap-options');\n\t\tvar elementOptions = JSON.parse(optionJson);\n\t\toptions = {};\n\t\t$.extend(options, event.data, elementOptions);\n\t} else {\n\t\toptions = event.data;\n\t}\n\n\tif (event && event.preventDefault) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n\n\tif (isActive(this)) {\n\t\tif (options.collapse) {\n\t\t\tdeactivateElement.apply(this);\n\t\t}\n\t} else {\n\t\tactivateElement.apply(this);\n\t}\n}\n\n/**\n * Activates a collection. Called bound to a jQuery collection.\n */\nfunction activate() {\n\tthis.each(activateElement);\n\treturn this;\n}\n\n/**\n * Activates an element. Called bound to a DOMElement.\n */\nfunction activateElement() {\n\tvar el = this;\n\tvar $group = getGroup(el);\n\tvar $linked = getLinked(el);\n\n\t// TODO: Can we optimize this to deactivate all the \"other\"\n\t// controls in one shot? The only benefit is combining\n\t// activate and activateElement.\n\tif ($group) {\n\t\tvar $others = $group.not($linked);\n\t\tvisitTargets($others, function (selector) {\n\t\t\t$(selector).removeClass('fs-swap-active');\n\t\t});\n\t\t$others.removeClass('fs-swap-active');\n\t\t$others.trigger('deactivate.swap');\n\t}\n\n\tvisitTargets($linked, function (selector) {\n\t\t$(selector).addClass('fs-swap-active');\n\t});\n\n\t$linked.addClass('fs-swap-active');\n\t$linked.trigger('activate.swap');\n}\n\n/**\n * Deactivates a collection. Called bound to a jQuery collection.\n */\nfunction deactivate() {\n\tthis.each(deactivateElement);\n\treturn this;\n}\n\n/**\n * Deactivates an element. Called bound to a DOMElement.\n */\nfunction deactivateElement() {\n\tvar el = this;\n\tvar $linked = getLinked(el);\n\n\tvisitTargets($linked, function (selector) {\n\t\t$(selector).removeClass('fs-swap-active');\n\t});\n\n\t$linked.removeClass('fs-swap-active');\n\t$linked.trigger('deactivate.swap');\n}\n\nfunction enable() {\n\tthis.each(enableElement);\n\treturn this;\n}\n\nfunction enableElement() {\n\tif (isEnabled(this)) {\n\t\treturn;\n\t}\n\n\tvar $el = $(this);\n\n\t$el.addClass('fs-swap-enabled');\n\n\tvar target = $el.attr('data-swap-target');\n\tvar $target = $(target);\n\t$target.addClass('fs-swap-enabled');\n\n\t$el.trigger('enable.swap');\n\n\tif ($el.attr('data-swap-active')) {\n\t\tactivateElement.apply(this);\n\t}\n}\n\nfunction disable() {\n\tthis.each(disableElement);\n\treturn this;\n}\n\nfunction disableElement() {\n\tif (!isEnabled(this)) {\n\t\treturn;\n\t}\n\n\tif (isActive(this)) {\n\t\tdeactivate.apply(this);\n\t}\n\n\tvar $linked = getLinked(this);\n\t$linked.removeClass(['fs-swap-enabled']);\n\n\tvisitTargets($linked, function (selector) {\n\t\t$(selector).removeClass('fs-swap-enabled');\n\t});\n\n\t$(this).trigger('disable.swap');\n}\n", "/* --------------------------------------------------------------------------\n\tAlert - WordPress / Drupal\n-------------------------------------------------------------------------- */\n\n\t\"use strict\";\n\n\tvar $ = jQuery;\n\timport \"./swap-plugin.js\";\n\n\tvar $Alert,\n\t\t$CloseButton,\n\t\t$OpenButton,\n\t\t$SkipLink,\n\t\tAlertID,\n\t\tTime;\n\n\tfunction initAjaxAlert() {\n\t\t// AlertURL is a global from functions.php\n\t\tif (typeof AlertURL === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\n\t\t$SkipLink = $(\".js-skip-alert\").hide();\n\n\t\t$.ajax(AlertURL).done(function(response) {\n\t\t\tif (!response) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$(\".js-alert-wrapper\").html(response);\n\n\t\t\t// This HTML loaded after swap.js so needs to call swap() again.\n\t\t\t$Alert = $(\".js-alert\");\n\t\t\t$Alert.find(\".js-swap\").swap();\n\t\t\t$SkipLink.show();\n\t\t\t$CloseButton = $(\".js-alert-close\");\n\t\t\t$OpenButton = $(\".js-alert-open\");\n\t\t\tAlertID = $Alert.data(\"alert-id\");\n\t\t\tTime = $Alert.data(\"time\");\n\n\t\t\t// Not hidden, show it and hide the open button\n\t\t\tif (isAlertVisible(AlertID, Time)) {\n\t\t\t\talertOpen();\n\t\t\t\t// Should it focus? I assume I'd be annoying to\n\t\t\t\t// hear the alert every visit to the site.\n\t\t\t} else {\n\t\t\t\talertClose();\n\n\t\t\t\t// Cover up the dismiss animation?\n\t\t\t\t$Alert.hide();\n\t\t\t\t$CloseButton.swap(\"activate\");\n\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t$Alert.show();\n\t\t\t\t}, 250);\n\t\t\t}\n\n\t\t\t$CloseButton.on(\"click\", onCloseClick);\n\t\t\t$SkipLink.on(\"click\", onOpenClick);\n\t\t\t$OpenButton.on(\"click\", onOpenClick);\n\t\t});\n\t}\n\n\t//\n\t// Store alert-dismissed = {\"post_id\": \"modified_time\", ...}\n\t//\n\tfunction loadState() {\n\t\ttry {\n\t\t\tvar x = window.localStorage.getItem(\"dimissed-alerts\");\n\t\t\tif (x) {\n\t\t\t\treturn JSON.parse(x);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// localStorage or JSON threw. Continue with an empty state.\n\t\t\tconsole.log(e);\n\t\t}\n\t\treturn {};\n\t}\n\n\tfunction saveState(state) {\n\t\twindow.localStorage.setItem(\"dimissed-alerts\", JSON.stringify(state));\n\t}\n\n\tfunction isAlertVisible(id, time) {\n\t\tvar dismissed = loadState();\n\t\tid = \"\"+id;\n\t\ttime = 0+time;\n\t\treturn dismissed[id] !== time;\n\t}\n\n\tfunction rearmAlert(id) {\n\t\tvar dismissed = loadState();\n\t\tid = \"\" + id;\n\t\tdismissed[id] = 0;\n\t\tsaveState(dismissed);\n\t}\n\n\tfunction dismissAlert(id, time) {\n\t\tvar dismissed = loadState();\n\t\tid = \"\" + id;\n\t\ttime = 0 + time;\n\t\tdismissed[id] = time;\n\t\tsaveState(dismissed);\n\t}\n\t\n\tfunction alertClose() {\n\t\t$Alert.attr(\"aria-hidden\", \"true\");\n\t\t$Alert.find(\"a, button\").attr(\"tabindex\", \"-1\");\n\t}\n\n\tfunction alertOpen() {\n\t\t$Alert.attr(\"aria-hidden\", \"false\");\n\t\t$Alert.find(\"a, button\").removeAttr(\"tabindex\");\n\t}\n\n\tfunction onCloseClick() {\n\t\tdismissAlert(AlertID, Time);\n\t\talertClose();\n\t\t$CloseButton.blur();\n\t}\n\n\tfunction onOpenClick() {\n\t\trearmAlert(AlertID);\n\t\talertOpen();\n\n\t\t// Move focus to the alert once the the animation\n\t\t// is done.\n\t\t$Alert.one('transitionend', function () {\n\t\t\t$Alert.focus();\n\t\t});\n\t}\n\n\t$(initAjaxAlert);\n", "/* --------------------------------------------------------------------------\n\tBackground Video Controls\n-------------------------------------------------------------------------- */\n\n\t\"use strict\";\n\t\n\tvar $ = jQuery;\n\n\tfunction initBackground() {\n\t\t$(\".js-background-video\").each(function () {\n\t\t\tbackgroundVideo(this);\n\t\t});\n\t}\n\n\tfunction backgroundVideo(element) {\n\t\tvar $background = $(element);\n\t\tvar parent = $background.parent();\n\t\tvar video = parent.find('video');\n\t\tvar playbtn = parent.find(\".js-background-control-play\")\n\t\tvar pausebtn = parent.find(\".js-background-control-pause\")\n\n\t\tfunction onPlayClick() {\n\t\t\tif (video.length > 0) {\n\t\t\t\tvideo[0].play();\n\t\t\t}\n\t\t\tplaybtn.addClass(\"background-control-active\")\n\t\t\t\t\t .attr(\"aria-pressed\", \"true\");\n\t\n\t\t\tpausebtn.removeClass(\"background-control-active\")\n\t\t\t\t\t .attr(\"aria-pressed\", \"false\");\n\t\t}\n\t\n\t\tfunction onPauseClick() {\n\t\t\tif (video.length > 0) {\n\t\t\t\tvideo[0].pause();\n\t\t\t}\n\t\t\tpausebtn.addClass(\"background-control-active\")\n\t\t\t\t\t .attr(\"aria-pressed\", \"true\");\n\t\n\t\t\tplaybtn.removeClass(\"background-control-active\")\n\t\t\t\t\t .attr(\"aria-pressed\", \"false\");\n\t\t}\n\n\t\tplaybtn.on(\"click\", onPlayClick);\n\t\tpausebtn.on(\"click\", onPauseClick);\n\t}\n\n\t$(initBackground);\n", "/* --------------------------------------------------------------------------\n\tPage\n-------------------------------------------------------------------------- */\n\n\t\"use strict\";\n\tvar $ = jQuery;\n\timport 'fastdom';\n\timport \"../base/swap.js\";\n\n\tvar $FixedHeader = null,\n\t\tFixedHeaderHeight = null,\n\t\tScrollYPosition = 0;\n\n\tfunction initPage() {\n\t\t// If you want a fixed header, set $FixedHeader to the DOM element\n\t\t$FixedHeader = $(\"#header\");\n\n\t\t$(\".js-toggle\").not(\".js-bound\")\n\t\t .on(\"click\", \".js-toggle-handle\", onToggleClick)\n\t\t .addClass(\"js-bound\");\n\n\t\t$(\".js-scroll-to\").not(\".js-bound\")\n\t\t .on(\"click\", onScrollTo)\n\t\t .addClass(\"js-bound\");\n\n\t\t// Fix IE SVG references to target an embedded tag in the DOM rather than externally referenced IDs\n\t\tvar ua = window.navigator.userAgent,\n\t\t msie = ua.indexOf(\"MSIE \");\n\n\t\tif (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\\:11\\./)) {\n\t\t\t// IE11 Compat mode, see function icon()\n\t\t\t$.get(ICONS_SVG_URL, function(data) {\n\t\t\t\tvar $div = $(\"
\").hide()\n\t\t\t\t .html(new XMLSerializer().serializeToString(data.documentElement))\n\t\t\t\t .appendTo(\"body\");\n\n\t\t\t\t$(\"svg use\").each(function() {\n\t\t\t\t\tvar parts = $(this).attr(\"xlink:href\").split(\"#\");\n\n\t\t\t\t\t$(this).attr(\"xlink:href\", \"#\" + parts[1]);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// Wrap iframe videos for responsiveness\n\t\t$(\"iframe[src*='vimeo.com'], iframe[src*='youtube.com']\", \".typography\").each(function() {\n\t\t\t$(this).wrap('
');\n\t\t});\n\n\t\t// Wrap tables for responsive tables\n\t\t$(\".typography table\").wrap('
');\n\n\t\t// Set active state of search areas when typing in their inputs\n\t\t$(\".js-site-search-input\").on(\"input\", function() {\n\t\t\tif ($(this).val()) {\n\t\t\t\t$(this).closest(\".js-site-search\").addClass(\"active\");\n\t\t\t} else {\n\t\t\t\t$(this).closest(\".js-site-search\").removeClass(\"active\");\n\t\t\t}\n\t\t});\n\n\t\t$(window).on(\"resize.page\", tableOverflow);\n\t\t$(window).on(\"resize.page\", recalculateFixedHeaderHeight);\n\t\tonPageLoad();\n\t}\n\n\n\tfunction onPageLoad() {\n\t\t$(\"body\").removeClass(\"preload\").addClass(\"loaded\");\n\n\t\t// TODO: Why?\n\t\t//$(window).trigger(\"resize\");\n\n\t\t// Checks to see if URL has deep link to #quicklinks, and loads the \"For You\" menu.\n\t\tif (window.location.hash == \"#quicklinks\") {\n\t\t\t$(\".audience_toggle\").swap('activate');\n\n\t\t} else if (window.location.hash) {\n\t\t\t// ?? deep link to an element\n\t\t\tscrollToElement(window.location.hash);\n\t\t}\n\t}\n\n\tfunction onScrollTo(e) {\n\t\tkillEvent(e);\n\n\t\tscrollToElement($(e.delegateTarget).attr(\"href\"));\n\t}\n\n\tfunction onToggleClick(e) {\n\t\tkillEvent(e);\n\n\t\t$(e.delegateTarget).toggleClass(\"js-toggle-active\");\n\t}\n\n\tfunction recalculateFixedHeaderHeight() {\n\t\tvar wp_bar_height;\n\t\tvar window_width;\n\t\tvar header_logo_height;\n\t\tvar header_ribbon_height;\n\n\t\tfastdom.measure(function () {\n\t\t\twp_bar_height = $(\"#wpadminbar\").outerHeight();\n\t\t\twindow_width = $(window).width();\n\t\t\theader_logo_height = $(\".js-header-logo\").outerHeight();\n\t\t\theader_ribbon_height = $(\"#header .header_ribbon\").outerHeight()\n\t\t\tif (window_width < 980) {\n\t\t\t\tFixedHeaderHeight = header_logo_height + 10;\n\t\t\t} else {\n\t\t\t\tFixedHeaderHeight = header_ribbon_height + header_logo_height + 10;\n\t\t\t}\n\t\t\tif (wp_bar_height) {\n\t\t\t\tFixedHeaderHeight = FixedHeaderHeight + wp_bar_height;\n\t\t\t}\n\t\t});\n\n\t\tfastdom.mutate(function () {\n\t\t\tif (wp_bar_height) {\n\t\t\t\t$FixedHeader.css(\"top\", wp_bar_height);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction scrollToElement(id) {\n\t\tvar offset = $(id).offset();\n\n\t\tif (typeof offset !== \"undefined\") {\n\t\t\tscrollToPosition(offset.top);\n\t\t}\n\t}\n\n\tfunction scrollToPosition(top) {\n\t\tif ($FixedHeader && !FixedHeaderHeight) {\n\t\t\trecalculateFixedHeaderHeight();\n\t\t}\n\n\t\t$(\"html, body\").animate({\n\t\t\tscrollTop: top - FixedHeaderHeight\n\t\t});\n\t}\n\n\tfunction tableOverflow() {\n\t\tvar addOverflow = [];\n\t\tvar removeOverflow = [];\n\n\t\tfastdom.measure(function () {\n\t\t\t$(\".table_wrapper\").each(function() {\n\t\t\t\tvar $inner = $(this).find(\".table_wrapper_inner\"),\n\t\t\t\t\tscrollWidth = $inner.get(0).scrollWidth,\n\t\t\t\t\tclientWidth = $inner.get(0).clientWidth;\n\t\n\t\t\t\tif (scrollWidth > clientWidth) {\n\t\t\t\t\taddOverflow.push(this);\n\t\t\t\t} else {\n\t\t\t\t\tremoveOverflow.push(this);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tfastdom.mutate(function () {\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < addOverflow.length; i++) {\n\t\t\t\t$(addOverflow[i])\n\t\t\t\t\t.addClass(\"table_wrapper_overflow\")\n\t\t\t\t\t.attr({ \"tabindex\": \"0\", \"role\": \"group\" });\n\t\t\t}\n\t\t\tfor (i = 0; i < removeOverflow.length; i++) {\n\t\t\t\t$(removeOverflow[i])\n\t\t\t\t\t.removeClass(\"table_wrapper_overflow\")\n\t\t\t\t\t.removeAttr(\"tabindex role\");\n\t\t\t}\n\t\t});\n\t}\n\n\texport function saveScrollYPosition() {\n\t\tScrollYPosition = window.pageYOffset;\n\n\t\t$(\".page_wrapper\").css({\n\t\t\t\"width\": \"100%\",\n\t\t\t\"position\": \"fixed\",\n\t\t\t\"top\": (ScrollYPosition * -1)\n\t\t});\n\t}\n\n\texport function restoreScrollYPosition() {\n\t\t$(\".page_wrapper\").css({\n\t\t\t\"width\": \"\",\n\t\t\t\"position\": \"\",\n\t\t\t\"top\": \"\"\n\t\t});\n\n\t\t$(\"html, body\").scrollTop(ScrollYPosition);\n\t}\n\n\texport function getScrollbarWidth() {\n\t\tvar $outer = $(\"
\").css({\n\t\t\t\"visibility\": \"hidden\",\n\t\t\t\"width\": \"100px\",\n\t\t\t\"msOverflowStyle\": \"scrollbar\"\n\t\t}).appendTo(\"body\");\n\n\t\tvar no_scroll_width = $outer.outerWidth();\n\n\t\t// force scrollbars\n\t\t$outer.css({ \"overflow\": \"scroll\" });\n\n\t\t// add inner div and calculate width difference\n\t\tvar $inner = $(\"
\").css({ \"width\": \"100%\" }).appendTo($outer);\n\t\tvar width = no_scroll_width - $inner.outerWidth();\n\n\t\t// remove divs\n\t\t$outer.remove();\n\n\t\treturn width;\n\t}\n\n\texport var Namespace = \"framework\";\n\texport var MinXS = 320;\n\texport var MinSM = 500;\n\texport var MinMD = 740;\n\texport var MinLG = 980;\n\texport var MinXL = 1220;\n\texport var MinXXL = 1330;\n\texport var IsIE = calcIsIE();\n\texport var largeModeQuery = matchMedia(\"(min-width: \" + MinLG + \"px)\");\n\n\tfunction calcIsIE() {\n\t\tvar ua = window.navigator.userAgent;\n\t\treturn ua.indexOf(\"MSIE \") > 0 || !!ua.match(/Trident.*rv\\:11\\./);\n\t}\n\n\t// Returns icon markup\n\texport function icon(icon) {\n\t\tvar markup = '';\n\n\t\tif (IsIE) {\n\t\t\t// IE11 compat. page.js inject SVG into document\n\t\t\tmarkup += '';\n\t\t} else {\n\t\t\tmarkup += '';\n\t\t}\n\n\t\treturn markup + '';\n\t}\n\n\texport function killEvent(e) {\n\t\tif (e && e.preventDefault) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t}\n\n\t/**\n\t * Listens when page size changes between mobile and\n\t * desktop modes.\n\t * \n\t * @param {function(event)} callback \n\t */\n\texport function addLargeListener(callback) {\n\t\tif (largeModeQuery.addEventListener) {\n\t\t\tlargeModeQuery.addEventListener('change', callback);\n\t\t} else {\n\t\t\t// For IE 11 and Safari 13 and earlier support\n\t\t\tlargeModeQuery.addListener(callback);\n\t\t}\n\t\tcallback({\"matches\": largeModeQuery.matches});\n\t}\n\n\t$(initPage);\n", "\n\t\"use strict\";\n\tvar $ = jQuery;\n\timport \"./swap-plugin.js\";\n\n\tfunction initSwap() {\n\t\t$(\".js-swap\").swap();\n\t}\n\n\t$(initSwap);\n", "/*! formstone v1.4.22 [core.js] 2021-10-01 | GPL-3.0 License | formstone.it */\n!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\"],e):e(jQuery)}(function(w){\"use strict\";function e(){this.Version=\"1.4.22\",this.Plugins={},this.DontConflict=!1,this.Conflicts={fn:{}},this.ResizeHandlers=[],this.RAFHandlers=[],this.window=i,this.$window=w(i),this.document=r,this.$document=w(r),this.$body=null,this.windowWidth=0,this.windowHeight=0,this.fallbackWidth=1024,this.fallbackHeight=768,this.userAgent=window.navigator.userAgent||window.navigator.vendor||window.opera,this.isFirefox=/Firefox/i.test(this.userAgent),this.isChrome=/Chrome/i.test(this.userAgent),this.isSafari=/Safari/i.test(this.userAgent)&&!this.isChrome,this.isMobile=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(this.userAgent),this.isIEMobile=/IEMobile/i.test(this.userAgent),this.isFirefoxMobile=this.isFirefox&&this.isMobile,this.transform=null,this.transition=null,this.support={file:!!(window.File&&window.FileList&&window.FileReader),history:!!(window.history&&window.history.pushState&&window.history.replaceState),matchMedia:!(!window.matchMedia&&!window.msMatchMedia),pointer:!!window.PointerEvent,raf:!(!window.requestAnimationFrame||!window.cancelAnimationFrame),touch:!!(\"ontouchstart\"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),transition:!1,transform:!1}}var t,n,s,i=\"undefined\"!=typeof window?window:this,r=i.document,o={killEvent:function(e,t){try{e.preventDefault(),e.stopPropagation(),t&&e.stopImmediatePropagation()}catch(e){}},killGesture:function(e){try{e.preventDefault()}catch(e){}},lockViewport:function(e){h[e]=!0,w.isEmptyObject(h)||p||(t.length?t.attr(\"content\",s):t=w(\"head\").append(''),c.$body.on(u.gestureChange,o.killGesture).on(u.gestureStart,o.killGesture).on(u.gestureEnd,o.killGesture),p=!0)},unlockViewport:function(e){void 0!==h[e]&&delete h[e],w.isEmptyObject(h)&&p&&(t.length&&(n?t.attr(\"content\",n):t.remove()),c.$body.off(u.gestureChange).off(u.gestureStart).off(u.gestureEnd),p=!1)},startTimer:function(e,t,n,s){return o.clearTimer(e),s?setInterval(n,t):setTimeout(n,t)},clearTimer:function(e,t){e&&(t?clearInterval(e):clearTimeout(e),e=null)},sortAsc:function(e,t){return parseInt(e,10)-parseInt(t,10)},sortDesc:function(e,t){return parseInt(t,10)-parseInt(e,10)},decodeEntities:function(e){var t=c.document.createElement(\"textarea\");return t.innerHTML=e,t.value},parseQueryString:function(e){for(var t={},n=e.slice(e.indexOf(\"?\")+1).split(\"&\"),s=0;st.threshold,l=Math.abs(o)>t.threshold;if(!t.passedAxis&&t.axis&&(t.axisX&&l||t.axisY&&r))d(e);else{!t.passedAxis&&(!t.axis||t.axis&&t.axisX&&r||t.axisY&&l)&&(t.passedAxis=!0),t.passedAxis&&(w.killEvent(e),w.killEvent(t.startE));var h=!0,u=Y(t.scale?m.scale:m.pan,e,n,i,t.scaleD,s,o,c,p);if(t.scale)if(t.touches&&2<=t.touches.length){var g=t.touches;t.pinch.endX=f(g[0].pageX,g[1].pageX),t.pinch.endY=f(g[0].pageY,g[1].pageY),t.pinch.endD=x(g[1].pageX-g[0].pageX,g[1].pageY-g[0].pageY),t.scaleD=t.pinch.endD/t.pinch.startD,u.pageX=t.pinch.endX,u.pageY=t.pinch.endY,u.scale=t.scaleD,u.deltaX=t.pinch.endX-t.pinch.startX,u.deltaY=t.pinch.endY-t.pinch.startY}else t.pan||(h=!1);h&&t.$el.trigger(u)}}function d(e){var t=e.data,a=void 0!==t.touches&&t.touches.length?t.touches[0]:null,n=a?a.pageX:e.pageX,i=a?a.pageY:e.pageY,s=n-t.startX,o=i-t.startY,c=(new Date).getTime(),p=t.scale?m.scaleEnd:m.panEnd,r=0t.threshold&&(p=m.swipe),t.axis&&(t.axisX&&u||t.axisY&&h)||h||u){t.$links=t.$el.find(\"a\");for(var g=0,d=t.$links.length;gr[e])&&(r[e]=n))}}(),n.trigger(c.mqChange,[r])}function h(e){var t=m(e.media),n=d[t],i=e.matches,r=i?c.enter:c.leave;if(n&&(n.active||!n.active&&i)){for(var a in n[r])n[r].hasOwnProperty(a)&&n[r][a].apply(n.mq);n.active=!0}}function m(e){return e.replace(/[^a-z0-9\\s]/gi,\"\").replace(/[_\\s]/g,\"\").replace(/^\\s+|\\s+$/g,\"\")}var t=e.Plugin(\"mediaquery\",{utilities:{_initialize:function(e){for(var t in e=e||{},u)u.hasOwnProperty(t)&&(s[t]=e[t]?a.merge(e[t],s[t]):s[t]);for(var n in(s=a.extend(s,e)).minWidth.sort(v.sortDesc),s.maxWidth.sort(v.sortAsc),s.minHeight.sort(v.sortDesc),s.maxHeight.sort(v.sortAsc),u)if(u.hasOwnProperty(n))for(var i in l[n]={},s[n])if(s[n].hasOwnProperty(i)){var r=window.matchMedia(\"(\"+u[n]+\": \"+(s[n][i]===1/0?1e5:s[n][i])+s.unit+\")\");r.addListener(o),l[n][s[n][i]]=r}o()},state:function(){return r},bind:function(e,t,n){var i=f.matchMedia(t),r=m(i.media);for(var a in d[r]||(d[r]={mq:i,active:!0,enter:{},leave:{}},d[r].mq.addListener(h)),n)n.hasOwnProperty(a)&&d[r].hasOwnProperty(a)&&(d[r][a][e]=n[a]);var o=d[r],s=i.matches;s&&o[c.enter].hasOwnProperty(e)?(o[c.enter][e].apply(i),o.active=!0):!s&&o[c.leave].hasOwnProperty(e)&&(o[c.leave][e].apply(i),o.active=!1)},unbind:function(e,t){if(e)if(t){var n=m(t);d[n]&&(d[n].enter[e]&&delete d[n].enter[e],d[n].leave[e]&&delete d[n].leave[e])}else for(var i in d)d.hasOwnProperty(i)&&(d[i].enter[e]&&delete d[i].enter[e],d[i].leave[e]&&delete d[i].leave[e])}},events:{mqChange:\"mqchange\"}}),s={minWidth:[0],maxWidth:[1/0],minHeight:[0],maxHeight:[1/0],unit:\"px\"},c=a.extend(t.events,{enter:\"enter\",leave:\"leave\"}),n=e.$window,f=n[0],v=t.functions,r=null,d=[],l={},u={minWidth:\"min-width\",maxWidth:\"max-width\",minHeight:\"min-height\",maxHeight:\"max-height\"}});", "/*! formstone v1.4.22 [carousel.js] 2021-10-01 | GPL-3.0 License | formstone.it */\n!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\",\"./core\",\"./mediaquery\",\"./touch\"],e):e(jQuery,Formstone)}(function(u,m){\"use strict\";function g(){H=u(j.base)}function h(e){e.enabled&&(X.clearTimer(e.autoTimer),e.enabled=!1,e.$subordinate.off(L.update),this.removeClass([y.enabled,y.animated].join(\" \")).off(L.namespace),e.$canister.fsTouch(\"destroy\").off(L.namespace).attr(\"style\",\"\").css(z,\"none\"),e.$items.css({width:\"\",height:\"\"}).removeClass([y.visible,j.item_previous,j.item_next].join(\" \")),e.$images.off(L.namespace),e.$controlItems.off(L.namespace),e.$pagination.html(\"\").off(L.namespace),$(e),e.useMargin?e.$canister.css({marginLeft:\"\"}):e.$canister.css(N,\"\"),e.index=0)}function p(e){e.enabled||(e.enabled=!0,this.addClass(y.enabled),e.$controlItems.on(L.click,e,o),e.$pagination.on(L.click,j.page,e,r),e.$items.on(L.click,e,W),e.$subordinate.on(L.update,e,P),P({data:e},0),e.touch&&e.$canister.fsTouch({axis:\"x\",pan:!0,swipe:!0}).on(L.panStart,e,l).on(L.pan,e,c).on(L.panEnd,e,d).on(L.swipe,e,x).on(L.focusIn,e,M).css(z,\"\"),f(e),e.$images.on(L.load,e,s),e.autoAdvance&&(e.autoTimer=X.startTimer(e.autoTimer,e.autoTime,function(){!function(e){var t=e.index+1;t>=e.pageCount&&(t=0);v(e,t)}(e)},!0)),i.call(this,e))}function i(e){if(e.enabled){var t,i,a,n,s;if(e.count=e.$items.length,e.count<1)return $(e),void e.$canister.css({height:\"\"});if(this.removeClass(y.animated),e.containerWidth=e.$container.outerWidth(!1),e.visible=function(e){var t=1;{if(e.single)return t;if(\"object\"==typeof e.show)for(var i in e.show)e.show.hasOwnProperty(i)&&(m.support.matchMedia?e.show[i].mq.matches&&(t=e.show[i].count):e.show[i].widthe.containerWidth+e.itemMargin||e.paged&&0e.itemHeight&&(e.itemHeight=n);if(e.rtl?i.eq(i.length-1):i.eq(0),s=e.canisterWidth-e.containerWidth-(e.rtl?e.itemMarginLeft:e.itemMarginRight),e.pages.push({left:e.rtl?-s:s,height:n,width:a,$items:i}),e.pageCount=e.pages.length,e.paged&&e.matchWidth&&(e.pageCount-=e.count%e.visible),e.pageCount<=0&&(e.pageCount=1),e.maxMove=(e.canisterWidth-e.containerWidth-(e.rtl?e.itemMarginLeft:e.itemMarginRight))*(e.rtl?1:-1),e.paged&&!e.matchWidth)for(t=0;tMath.abs(e.maxMove)){e.pageCount=t;break}e.autoHeight?e.$canister.css({height:e.pages[0].height}):e.matchHeight&&e.$items.css({height:e.itemHeight});var d=\"\";for(t=0;t'+(t+1)+\"\";e.$pagination.html(d),e.pageCount<=1?$(e):function(e){e.$controls.addClass(y.visible),e.$controlItems.addClass(y.visible),e.$pagination.addClass(y.visible),C(e,e.$controlItems)}(e),e.$paginationItems=e.$pagination.find(j.page),v(e,e.index,!1),setTimeout(function(){e.$el.addClass(y.animated)},5)}}function f(e){e.$items=e.$canister.children().not(\":hidden\").addClass(y.item),e.$images=e.$canister.find(\"img\"),e.totalImages=e.$images.length}function t(e,t){e.$images.off(L.namespace),!1!==t&&e.$canister.html(t),e.index=0,f(e),i.call(this,e)}function e(e,t,i,a,n){e.enabled&&(a||X.clearTimer(e.autoTimer),void 0===n&&(n=!0),v(e,t-1,n,i,a))}function a(e){var t=e.index-1;e.infinite&&t<0&&(t=e.pageCount-1),v(e,t)}function n(e){var t=e.index+1;e.infinite&&t>=e.pageCount&&(t=0),v(e,t)}function s(e){var t=e.data;t.resizeTimer=X.startTimer(t.resizeTimer,1,function(){i.call(t.$el,t)})}function o(e){X.killEvent(e);var t=e.data,i=t.index+(u(e.currentTarget).hasClass(y.control_next)?1:-1);X.clearTimer(t.autoTimer),v(t,i)}function r(e){X.killEvent(e);var t=e.data,i=t.$paginationItems.index(u(e.currentTarget));X.clearTimer(t.autoTimer),v(t,i)}function v(e,t,i,a,n){if(t<0&&(t=e.infinite?e.pageCount-1:0),t>=e.pageCount&&(t=e.infinite?0:e.pageCount-1),!(e.count<1)){if(e.pages[t]&&(e.leftPosition=-e.pages[t].left),e.leftPosition=T(e,e.leftPosition),e.useMargin?e.$canister.css({marginLeft:e.leftPosition}):!1===i?(e.$canister.css(z,\"none\").css(N,\"translateX(\"+e.leftPosition+\"px)\"),setTimeout(function(){e.$canister.css(z,\"\")},5)):e.$canister.css(N,\"translateX(\"+e.leftPosition+\"px)\"),e.$items.removeClass([y.visible,y.item_previous,y.item_next].join(\" \")),e.single)for(var s=0,o=e.pages.length;s=e.pageCount-1||!e.single&&e.leftPosition===e.maxMove)&&(e.$controlNext.removeClass(y.visible),b(e,e.$controlNext)))}(e)}}function $(e){e.$controls.removeClass(y.visible),e.$controlItems.removeClass(y.visible),e.$pagination.removeClass(y.visible),b(e,e.$controlItems)}function b(e,t){e.customControls||t.prop(\"disabled\",!0)}function C(e,t){e.customControls||t.prop(\"disabled\",!1)}function l(e,t){var i=e.data;if(X.clearTimer(i.autoTimer),!i.single){if(i.useMargin)i.leftPosition=parseInt(i.$canister.css(\"marginLeft\"));else{var a=i.$canister.css(N).split(\",\");i.leftPosition=parseInt(a[4])}if(i.$canister.css(z,\"none\").css(\"will-change\",\"transform\"),c(e),i.linked&&!0!==t){var n=e.deltaX/i.pageWidth;i.rtl&&(n*=-1),u(i.linked).not(i.$el)[q](\"panStart\",n)}}i.isTouching=!0}function c(e,t){var i=e.data;if(!i.single&&(i.touchLeft=T(i,i.leftPosition+e.deltaX),i.useMargin?i.$canister.css({marginLeft:i.touchLeft}):i.$canister.css(N,\"translateX(\"+i.touchLeft+\"px)\"),i.linked&&!0!==t)){var a=e.deltaX/i.pageWidth;i.rtl&&(a*=-1),u(i.linked).not(i.$el)[q](\"pan\",a)}}function d(e,t){var i=e.data,a=Math.abs(e.deltaX),n=I(i,e),s=!1;if(i.didPan=!1,0==n)s=i.index;else{if(!i.single){var o,r,l=Math.abs(i.touchLeft),c=!1,d=i.rtl?\"right\":\"left\";if(e.directionX===d)for(o=0,r=i.pages.length;oMath.abs(c.left)+20&&(s=o+1);else for(o=i.pages.length-1,r=0;r<=o;o--)c=i.pages[o],le.maxMove&&(t=e.maxMove),t<0&&(t=0)):(t',i+='\",i+='\",i+=\"
\"),e.pagination&&!e.customPagination&&(e.labels.pagination=e.labels.pagination.replace(\"{guid}\",e.numGuid),a+='
',a+=\"
\"),e.autoHeight&&e.carouselClasses.push(y.auto_height),e.contained&&e.carouselClasses.push(y.contained),e.single&&e.carouselClasses.push(y.single),this.addClass(e.carouselClasses.join(\" \")).wrapInner('
').append(i).wrapInner('
').append(a),e.$viewport=this.find(j.viewport).eq(0),e.$container=this.find(j.container).eq(0),e.$canister=this.find(j.canister).eq(0),e.$pagination=this.find(j.pagination).eq(0),e.$controlPrevious=e.$controlNext=u(\"\"),e.customControls?(e.$controls=u(e.controls.container).addClass([y.controls,y.controls_custom].join(\" \")),e.$controlPrevious=u(e.controls.previous).addClass(n),e.$controlNext=u(e.controls.next).addClass(s)):(e.$controls=this.find(j.controls).eq(0),e.$controlPrevious=e.$controls.find(j.control_previous),e.$controlNext=e.$controls.find(j.control_next)),e.$controlItems=e.$controlPrevious.add(e.$controlNext),e.customPagination&&(e.$pagination=u(e.pagination).addClass([y.pagination])),e.$paginationItems=e.$pagination.find(j.page),e.index=0,e.enabled=!1,e.leftPosition=0,e.autoTimer=null,e.resizeTimer=null;var o=this.data(k+\"-linked\");e.linked=!!o&&\"[data-\"+k+'-linked=\"'+o+'\"]',e.linked&&(e.paged=!0);var r=this.data(k+\"-controller-for\")||\"\";if(e.$subordinate=u(r),e.$subordinate.length&&(e.controller=!0),\"object\"==typeof e.show){var l=e.show,c=[],d=[];for(t in l)l.hasOwnProperty(t)&&d.push(t);for(t in d.sort(X.sortAsc),d)d.hasOwnProperty(t)&&c.push({width:parseInt(d[t]),count:l[d[t]],mq:window.matchMedia(\"(min-width: \"+parseInt(d[t])+\"px)\")});e.show=c}f(e),u.fsMediaquery(\"bind\",e.rawGuid,e.mq,{enter:function(){p.call(e.$el,e)},leave:function(){h.call(e.$el,e)}}),g(),e.carouselClasses.push(y.enabled),e.carouselClasses.push(y.animated)},_destruct:function(e){X.clearTimer(e.autoTimer),X.clearTimer(e.resizeTimer),h.call(this,e),u.fsMediaquery(\"unbind\",e.rawGuid),e.id!==e.ariaId&&this.removeAttr(\"id\"),e.$controlItems.removeClass([j.control,y.control_previous,j.control_next,j.visible].join(\" \")).off(L.namespace),C(e,e.$controlItems),e.$images.off(L.namespace),e.$canister.fsTouch(\"destroy\"),e.$items.removeClass([y.item,y.visible,j.item_previous,j.item_next].join(\" \")).unwrap().unwrap().unwrap().unwrap(),e.controls&&!e.customControls&&e.$controls.remove(),e.customControls&&e.$controls.removeClass([y.controls,y.controls_custom,y.visible].join(\" \")),e.pagination&&!e.customPagination&&e.$pagination.remove(),e.customPagination&&e.$pagination.html(\"\").removeClass([y.pagination,y.visible].join(\" \")),this.removeClass(e.carouselClasses.join(\" \")),g()},_resize:function(e){X.iterate.call(H,i)},disable:h,enable:p,jump:e,previous:a,next:n,jumpPage:e,previousPage:a,nextPage:n,jumpItem:function(e,t,i,a,n){if(e.enabled){X.clearTimer(e.autoTimer);var s=e.$items.eq(t-1);void 0===n&&(n=!0);for(var o=0;o\" + icon(PrevIcon) + \"\" +\n\t\t\t \"\" + previous_text + \"\");\n\n\t\t\t$next_button.attr(\"disabled\", \"\")\n\t\t\t .html(\"\" + icon(NextIcon) + \"\" +\n\t\t\t \"\" + next_text + \"\");\n\n\t\t\tif ($previous_button.is(\".fs-carousel-visible\")) {\n\t\t\t\t$previous_button.removeAttr(\"disabled\");\n\t\t\t}\n\n\t\t\tif ($next_button.is(\".fs-carousel-visible\")) {\n\t\t\t\t$next_button.removeAttr(\"disabled\");\n\t\t\t}\n\n\t\t\t$gallery_item.find(\"a, button\").attr(\"tabindex\", \"-1\");\n\n\t\t\t$(this).find(\".fs-carousel-item.fs-carousel-visible a, .fs-carousel-item.fs-carousel-visible button\").removeAttr(\"tabindex\");\n\t\t});\n\t}\n\n\tfunction onCarouselUpdate() {\n\t\tvar $carousel = $(this);\n\n\t\t$carousel.find(\".fs-carousel-control\").attr(\"disabled\", \"\");\n\n\t\t$carousel.find(\".fs-carousel-item a, .fs-carousel-item button\").attr(\"tabindex\", \"-1\");\n\n\t\tsetTimeout(function () {\n\t\t\t$carousel.find(\".fs-carousel-control.fs-carousel-visible\").removeAttr(\"disabled\");\n\n\t\t\t$carousel.find(\".fs-carousel-item.fs-carousel-visible a, .fs-carousel-item.fs-carousel-visible button\").removeAttr(\"tabindex\");\n\t\t}, 0);\n\t}\n\n\t$(initCarousel);\n", "/* --------------------------------------------------------------------------\n\tLogo Scroll\n-------------------------------------------------------------------------- */\n\n\"use strict\";\n\nimport 'fastdom';\n\n// When the user scrolls down 80px from the top of the document, add a new class to define the animation.\njQuery(document).ready(function($) {\n var top;\n \n function measureFunc() { \n top = $(document).scrollTop() >= 160;\n }\n \n function mutateFunc() {\n if (top) {\n $('.logo_header').addClass('js-scrolling');\n } else {\n $('.logo_header').removeClass('js-scrolling');\n }\n }\n\n $(document).scroll(function() {\n fastdom.measure(measureFunc);\n fastdom.mutate(mutateFunc);\n });\n});\n", "/* --------------------------------------------------------------------------\n\tMenu\n-------------------------------------------------------------------------- */\n\n\t\"use strict\";\n\n\tvar $ = jQuery;\n\timport { saveScrollYPosition, getScrollbarWidth, restoreScrollYPosition } from \"../base/page.js\";\n\timport \"../base/swap.js\";\n\t\n\tvar $Menu,\n\t $MenuClose,\n\t\t$MenuToggle,\n\t\t$AudienceToggle,\n\t\t$ShiftingElements,\n\t\tToggleStatus,\n\t LockClass;\n\n\tfunction initMenu() {\n\t\t$Menu = $(\".js-menu\");\n\n\t\tif (!$Menu.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t$MenuToggle = $(\".js-menu-toggle\");\n\t\t$MenuClose = $(\".js-menu-close-toggle\");\n\t\t$AudienceToggle = $(\".js-audience-toggle\");\n\t\t$ShiftingElements = $(\".header, .page, .footer\");\n\t\tToggleStatus = false;\n\t\tLockClass = \"fs-page-lock\";\n\n\t\t$Menu.find(\".js-nav-link, button, input\").attr(\"tabindex\", \"-1\");\n\t\t$Menu.on(\"keydown\", onMenuKeydown)\n\t\t .on(\"keyup\", onMenuKeyup)\n\t\t .attr(\"aria-hidden\", \"true\");\n\n\t\t$MenuToggle.on(\"activate.swap\", onMenuSwapActivate)\n\t\t .on(\"deactivate.swap\", onMenuSwapDeactivate)\n\t\t .attr({ \"aria-expanded\": \"false\", \"role\": \"button\" });\n\n\t\t$MenuClose.on(\"keydown\", onCloseKeydown)\n\t\t .on(\"click\", onMenuSwapDeactivate);\n\n\t\t$(document).on(\"click touchstart\", onDocumentClick);\n\n\t\t$(window).on('resize', onWindowResize);\n\t}\n\n\tfunction onWindowResize() {\n\t\t// Only apply the logic if the campaign site is active\n\t\tif ($('.campaign-site-menu').length > 0 && $(window).width() >= 980) {\n\t\t\t// If the menu is active, deactivate it\n\t\t\tif (ToggleStatus === true) {\n\t\t\t\t$MenuToggle.swap(\"deactivate\");\n\t\n\t\t\t\t// Optionally focus back on the main content after closing the menu\n\t\t\t\t// $('body').focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onDocumentClick(e) {\n\t\tif ($(\"body\").hasClass(LockClass)) {\n\t\t\tif (!$(e.target).closest(\".js-menu\").length) {\n\t\t\t\t$MenuToggle.swap(\"deactivate\");\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMenuSwapActivate() {\n\n\t\tif(ToggleStatus == false) {\n\t\t\tsaveScrollYPosition();\n\t\t\tToggleStatus = true;\n\t\t}\n\n\t\t$(\"body\").addClass(LockClass);\n\n\t\t$MenuToggle.attr(\"aria-expanded\", \"true\");\n\n\t\t$Menu.attr({ \"aria-hidden\": \"false\", \"tabindex\": \"0\" })\n\t\t .one('transitionend', function() { $Menu.focus(); })\n\t\t .find(\".js-nav-link, button, input\").removeAttr(\"tabindex\");\n\n\t\t$ShiftingElements.css(\"padding-right\", getScrollbarWidth());\n\n\t\t$Menu.css({\n\t\t\t\"margin-right\": \"\",\n\t\t\t\"width\": \"\"\n\t\t});\n\n\t\t$AudienceToggle.swap(\"deactivate\");\t\t\n\t}\n\n\tfunction onMenuSwapDeactivate() {\n\t\t$(\"body\").removeClass(LockClass);\n\n\t\tif(ToggleStatus == true) {\n\t\t\trestoreScrollYPosition();\n\t\t\tToggleStatus = false;\n\t\t}\n\n\t\t$Menu.attr(\"aria-hidden\", \"true\").removeAttr(\"tabindex\")\n\t\t .find(\".js-nav-link, button, input\").attr(\"tabindex\", \"-1\");\n\n\t\t$MenuToggle.attr(\"aria-expanded\", \"false\").focus();\n\n\t\t$ShiftingElements.css(\"padding-right\", \"\");\n\n\t\t$Menu.css({\n\t\t\t\"margin-right\": getScrollbarWidth() * -1,\n\t\t\t\"width\": \"calc(100% + \" + getScrollbarWidth() + \"px)\"\n\t\t});\t\t\n\t}\n\n\tfunction onCloseKeydown(e) {\n\t\t// tab\n\t\tif (e.keyCode === 9) {\n\t\t\tif (!(e.shiftKey)) {\n\t\t\t\t$Menu.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMenuKeydown(e) {\n\t\tif ($Menu.is(\":focus\")) {\n\t\t\t// tab\n\t\t\tif (e.keyCode === 9) {\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t$MenuClose.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMenuKeyup(e) {\n\t\t// escape\n\t\tif (e.keyCode === 27) {\n\t\t\t$MenuToggle.swap(\"deactivate\");\n\t\t}\n\t}\n\n\t$(initMenu);\n", "/* --------------------------------------------------------------------------\n\tNavigation\n-------------------------------------------------------------------------- */\n\n\t\"use strict\";\n\tvar $ = jQuery;\n\timport \"../base/swap.js\";\n\n\tvar $ActiveItem,\n\t\t$ActiveToggle,\n\t\t$Children,\n\t\t$ChildLink,\n\t $Toggle;\n\n\tfunction initNav() {\n\t\tif (!$(\".js-nav\").length) {\n\t\t\treturn;\n\t\t}\n\n\t\t$Children = $(\".js-nav-children\");\n\t\t$Children.attr(\"aria-hidden\", \"true\");\n\n\t\t$ChildLink = $(\".js-nav-child-link\");\n\t\t$ChildLink.attr(\"tabindex\", \"-1\");\n\t\t$ChildLink.on(\"keydown\", onChildLinkKeydown);\n\n\t\t$Toggle = $(\".js-nav-toggle\");\n\t\t$Toggle.on(\"activate.swap\", onToggleSwapActivate)\n\t\t .on(\"deactivate.swap\", onToggleSwapDeactivate)\n\t\t .on(\"keydown\", onToggleKeydown);\n\t}\n\n\tfunction onChildLinkKeydown(e) {\n\t\tvar key = e.keyCode;\n\n\t\tif ([27, 38, 40].indexOf(key) === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $childItem = $(this).closest(\".js-nav-child-item\");\n\n\t\te.preventDefault();\n\n\t\tswitch (key) {\n\t\t\t// tab\n\t\t\tcase 9:\n\t\t\t\t$ActiveToggle.swap(\"deactivate\");\n\n\t\t\t\tbreak;\n\t\t\t// escape\n\t\t\tcase 27:\n\t\t\t\t$ActiveToggle.swap(\"deactivate\").focus();\n\n\t\t\t\tbreak;\n\t\t\t// up\n\t\t\tcase 38:\n\t\t\t\t$childItem.prev(\".js-nav-child-item\").find(\".js-nav-child-link\").focus();\n\n\t\t\t\tbreak;\n\t\t\t// down\n\t\t\tcase 40:\n\t\t\t\t$childItem.next(\".js-nav-child-item\").find(\".js-nav-child-link\").focus();\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tfunction onToggleKeydown(e) {\n\t\tvar key = e.keyCode;\n\n\t\tif (key !== 27 || key !== 40) {\n\t\t\treturn;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\t// escape\n\t\tif (key === 27) {\n\t\t\t$(this).swap(\"deactivate\");\n\t\t// down\n\t\t} else {\n\t\t\t$(this).swap(\"activate\");\n\t\t}\n\t}\n\n\tfunction onToggleSwapActivate() {\n\t\t$ActiveToggle = $(this);\n\t\t$ActiveItem = $ActiveToggle.closest(\".js-nav-item\");\n\n\t\t$ActiveToggle.attr(\"aria-expanded\", \"true\");\n\t\t$ActiveItem.find(\".js-nav-children\")\n\t\t .attr(\"aria-hidden\", \"false\")\n\t\t .one('transitionend', function() {\n\t\t $ActiveItem.find(\".js-nav-child-link\").first().focus();\n\t\t });\n\t\t$ActiveItem.find(\".js-nav-child-link\").removeAttr(\"tabindex\").first().focus();\n\t}\n\n\tfunction onToggleSwapDeactivate() {\n\t\t$ActiveToggle = $(this);\n\t\t$ActiveItem = $ActiveToggle.closest(\".js-nav-item\");\n\n\t\t$ActiveToggle.attr(\"aria-expanded\", \"false\");\n\t\t$ActiveItem.find(\".js-nav-children\").attr(\"aria-hidden\", \"true\");\n\t\t$ActiveItem.find(\".js-nav-child-link\").attr(\"tabindex\", \"-1\");\n\t}\n\n\t$(initNav);\n", "/* --------------------------------------------------------------------------\n\tMenu\n-------------------------------------------------------------------------- */\n\n\t\"use strict\";\n\tvar $ = jQuery;\n\timport { saveScrollYPosition, getScrollbarWidth, restoreScrollYPosition } from \"../base/page.js\";\n\timport '../base/swap.js';\n\n\tvar $SearchMenu,\n\t $SearchMenuClose,\n\t\t$SearchMenuToggle,\n\t $ShiftingElements,\n\t LockClass;\n\n\tfunction initSearchMenu() {\n\t\t$SearchMenu = $(\".js-search-menu\");\n\n\t\tif ($SearchMenu.length) {\n\t\t\t\n\t\t\t$SearchMenuToggle = $(\".js-search-toggle\");\n\t\t\t$SearchMenuClose = $(\".js-search-menu-close-toggle\");\n\t\t\t$ShiftingElements = $(\".header, .page, .footer\");\n\t\t\tLockClass = \"fs-page-lock\";\n\n\t\t\t$SearchMenu.find(\".js-nav-link, button, input\").attr(\"tabindex\", \"-1\");\n\t\t\t$SearchMenu.on(\"keydown\", onMenuKeydown)\n\t\t\t\t.on(\"keyup\", onMenuKeyup)\n\t\t\t\t.attr(\"aria-hidden\", \"true\");\n\n\t\t\t$SearchMenuToggle.on(\"activate.swap\", onMenuSwapActivate)\n\t\t\t\t\t.on(\"deactivate.swap\", onMenuSwapDeactivate)\n\t\t\t\t\t.attr({ \"aria-expanded\": \"false\", \"role\": \"button\" });\n\n\t\t\t$SearchMenuClose.on(\"keydown\", onCloseKeydown)\n\t\t\t\t\t.on(\"click\", onMenuSwapDeactivate);\n\n\t\t\t$(document).on(\"click touchstart\", onDocumentClick);\n\n\t\t}\n\t}\n\n\tfunction onDocumentClick(e) {\n\t\tif ($(\"body\").hasClass(LockClass)) {\n\t\t\tif (!$(e.target).closest(\".js-search-menu\").length) {\n\t\t\t\t$SearchMenuToggle.swap(\"deactivate\");\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMenuSwapActivate() {\n\t\t$(\"body\").addClass(LockClass);\n\n\t\tsaveScrollYPosition();\n\n\t\t$SearchMenuToggle.attr(\"aria-expanded\", \"true\");\n\n\t\t$SearchMenu.attr({ \"aria-hidden\": \"false\", \"tabindex\": \"0\" })\n\t\t .one('transitionend', function() { $SearchMenu.find(\".site_search_input\").focus(); })\n\t\t .find(\".js-nav-link, button, input\").removeAttr(\"tabindex\");\n\n\t\t$ShiftingElements.css(\"padding-right\", getScrollbarWidth());\n\n\t\t$SearchMenu.css({\n\t\t\t\"margin-right\": \"\",\n\t\t\t\"width\": \"\"\n\t\t});\n\t}\n\n\tfunction onMenuSwapDeactivate() {\n\t\t$(\"body\").removeClass(LockClass);\n\n\t\trestoreScrollYPosition();\n\n\t\t$SearchMenu.attr(\"aria-hidden\", \"true\").removeAttr(\"tabindex\")\n\t\t .find(\".js-nav-link, button, input\").attr(\"tabindex\", \"-1\");\n\n\t\t$SearchMenuToggle.attr(\"aria-expanded\", \"false\").focus();\n\n\t\t$ShiftingElements.css(\"padding-right\", \"\");\n\n\t\t$SearchMenu.css({\n\t\t\t\"margin-right\": getScrollbarWidth() * -1,\n\t\t\t\"width\": \"calc(100% + \" + getScrollbarWidth() + \"px)\"\n\t\t});\n\t}\n\n\tfunction onCloseKeydown(e) {\n\t\t// tab\n\t\tif (e.keyCode === 9) {\n\t\t\tif (!(e.shiftKey)) {\n\t\t\t\t$SearchMenu.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMenuKeydown(e) {\n\t\tif ($SearchMenu.is(\":focus\")) {\n\t\t\t// tab\n\t\t\tif (e.keyCode === 9) {\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t$SearchMenuClose.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMenuKeyup(e) {\n\t\t// escape\n\t\tif (e.keyCode === 27) {\n\t\t\t$SearchMenuToggle.swap(\"deactivate\");\n\t\t}\n\t}\n\n\t$(initSearchMenu);\n", "/* --------------------------------------------------------------------------\n\tSub Nav\n-------------------------------------------------------------------------- */\n\n\t\"use strict\";\n\tvar $ = jQuery;\n\timport \"fastdom\";\n\timport { MinLG } from \"./page.js\";\n\timport '../base/swap.js';\n\n\tvar $SubNav,\n\t\t$SubNavBody,\n\t $SubNavInner,\n\t $SubNavList,\n\t\t$SubNavToggle,\n\t\t$PageHeaderInner,\n\t\tDisablePosition;\n\n\tfunction initSubNav() {\n\t\t$SubNavBody = $(\".js-sub-nav-body\");\n\n\t\tif (!$SubNavBody.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t$SubNav = $(\".js-sub-nav\");\n\t\t$SubNavInner = $(\".js-sub-nav-body-inner\");\n\n\t\t$SubNavList = $(\".js-sub-nav-list\");\n\t\t$SubNavList.attr(\"aria-hidden\", \"true\")\n\t\t .find(\"a\").attr(\"tabindex\", \"-1\");\n\n\t\t$SubNavToggle = $(\".js-sub-nav-toggle\");\n\t\t$SubNavToggle.attr(\"aria-expanded\", \"false\")\n\t\t .attr(\"aria-haspopup\", \"true\")\n\t\t .on(\"activate.swap\", onSubSwapActivate)\n\t\t\t\t\t .on(\"deactivate.swap\", onSubSwapDeactivate);\n\t\t\t\t\t \n\t\t$PageHeaderInner = $(\".js-page-header-inner\");\n\n\t\tDisablePosition = false;\n\n\t\tif( $(\"body\").hasClass(\"page_theme_listing\") ) {\n\t\t\tDisablePosition = true;\n\t\t}\n\n\t\t$(window).on('resize', onResize);\n\t\tonResize();\n\t}\n\n\tfunction onResize() {\n\t\tvar height;\n\t\tvar subnavActive;\n\t\tvar window_width;\n\t\tvar offset = 0;\n\n\t\t// This feature is cursed.\n\t\t//\n\t\t// Not Large Mode: There is an \"Explore This\n\t\t// Section\" button to expand the sub-nav. The animation is really\n\t\t// nav:after expanding and sliding up AND \n\t\t// .js-sub-nav-body expanding. There is jank everywhere and crashes\n\t\t// older Safari versions.\n\t\t//\n\t\t// Should be