with its height set to 100vh and measure that since that's what the scrolling is based on anyway and it's not affected by address bar showing/hiding.\n\n _div100vh.style.height = \"100vh\";\n _div100vh.style.position = \"absolute\";\n\n _refresh100vh();\n\n _rafBugFix();\n\n Observer.register(gsap); // isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer.\n\n ScrollTrigger.isTouch = Observer.isTouch;\n _fixIOSBug = Observer.isTouch && /(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent); // since 2017, iOS has had a bug that causes event.clientX/Y to be inaccurate when a scroll occurs, thus we must alternate ignoring every other touchmove event to work around it. See https://bugs.webkit.org/show_bug.cgi?id=181954 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503\n\n _addListener(_win, \"wheel\", _onScroll); // mostly for 3rd party smooth scrolling libraries.\n\n\n _root = [_win, _doc, _docEl, _body];\n\n if (gsap.matchMedia) {\n ScrollTrigger.matchMedia = function (vars) {\n var mm = gsap.matchMedia(),\n p;\n\n for (p in vars) {\n mm.add(p, vars[p]);\n }\n\n return mm;\n };\n\n gsap.addEventListener(\"matchMediaInit\", function () {\n return _revertAll();\n });\n gsap.addEventListener(\"matchMediaRevert\", function () {\n return _revertRecorded();\n });\n gsap.addEventListener(\"matchMedia\", function () {\n _refreshAll(0, 1);\n\n _dispatch(\"matchMedia\");\n });\n gsap.matchMedia(\"(orientation: portrait)\", function () {\n // when orientation changes, we should take new base measurements for the ignoreMobileResize feature.\n _setBaseDimensions();\n\n return _setBaseDimensions;\n });\n } else {\n console.warn(\"Requires GSAP 3.11.0 or later\");\n }\n\n _setBaseDimensions();\n\n _addListener(_doc, \"scroll\", _onScroll); // some browsers (like Chrome), the window stops dispatching scroll events on the window if you scroll really fast, but it's consistent on the document!\n\n\n var bodyStyle = _body.style,\n border = bodyStyle.borderTopStyle,\n AnimationProto = gsap.core.Animation.prototype,\n bounds,\n i;\n AnimationProto.revert || Object.defineProperty(AnimationProto, \"revert\", {\n value: function value() {\n return this.time(-0.01, true);\n }\n }); // only for backwards compatibility (Animation.revert() was added after 3.10.4)\n\n bodyStyle.borderTopStyle = \"solid\"; // works around an issue where a margin of a child element could throw off the bounds of the _body, making it seem like there's a margin when there actually isn't. The border ensures that the bounds are accurate.\n\n bounds = _getBounds(_body);\n _vertical.m = Math.round(bounds.top + _vertical.sc()) || 0; // accommodate the offset of the caused by margins and/or padding\n\n _horizontal.m = Math.round(bounds.left + _horizontal.sc()) || 0;\n border ? bodyStyle.borderTopStyle = border : bodyStyle.removeProperty(\"border-top-style\"); // TODO: (?) maybe move to leveraging the velocity mechanism in Observer and skip intervals.\n\n _syncInterval = setInterval(_sync, 250);\n gsap.delayedCall(0.5, function () {\n return _startup = 0;\n });\n\n _addListener(_doc, \"touchcancel\", _passThrough); // some older Android devices intermittently stop dispatching \"touchmove\" events if we don't listen for \"touchcancel\" on the document.\n\n\n _addListener(_body, \"touchstart\", _passThrough); //works around Safari bug: https://greensock.com/forums/topic/21450-draggable-in-iframe-on-mobile-is-buggy/\n\n\n _multiListener(_addListener, _doc, \"pointerdown,touchstart,mousedown\", _pointerDownHandler);\n\n _multiListener(_addListener, _doc, \"pointerup,touchend,mouseup\", _pointerUpHandler);\n\n _transformProp = gsap.utils.checkPrefix(\"transform\");\n\n _stateProps.push(_transformProp);\n\n _coreInitted = _getTime();\n _resizeDelay = gsap.delayedCall(0.2, _refreshAll).pause();\n _autoRefresh = [_doc, \"visibilitychange\", function () {\n var w = _win.innerWidth,\n h = _win.innerHeight;\n\n if (_doc.hidden) {\n _prevWidth = w;\n _prevHeight = h;\n } else if (_prevWidth !== w || _prevHeight !== h) {\n _onResize();\n }\n }, _doc, \"DOMContentLoaded\", _refreshAll, _win, \"load\", _refreshAll, _win, \"resize\", _onResize];\n\n _iterateAutoRefresh(_addListener);\n\n _triggers.forEach(function (trigger) {\n return trigger.enable(0, 1);\n });\n\n for (i = 0; i < _scrollers.length; i += 3) {\n _wheelListener(_removeListener, _scrollers[i], _scrollers[i + 1]);\n\n _wheelListener(_removeListener, _scrollers[i], _scrollers[i + 2]);\n }\n }\n }\n };\n\n ScrollTrigger.config = function config(vars) {\n \"limitCallbacks\" in vars && (_limitCallbacks = !!vars.limitCallbacks);\n var ms = vars.syncInterval;\n ms && clearInterval(_syncInterval) || (_syncInterval = ms) && setInterval(_sync, ms);\n \"ignoreMobileResize\" in vars && (_ignoreMobileResize = ScrollTrigger.isTouch === 1 && vars.ignoreMobileResize);\n\n if (\"autoRefreshEvents\" in vars) {\n _iterateAutoRefresh(_removeListener) || _iterateAutoRefresh(_addListener, vars.autoRefreshEvents || \"none\");\n _ignoreResize = (vars.autoRefreshEvents + \"\").indexOf(\"resize\") === -1;\n }\n };\n\n ScrollTrigger.scrollerProxy = function scrollerProxy(target, vars) {\n var t = _getTarget(target),\n i = _scrollers.indexOf(t),\n isViewport = _isViewport(t);\n\n if (~i) {\n _scrollers.splice(i, isViewport ? 6 : 2);\n }\n\n if (vars) {\n isViewport ? _proxies.unshift(_win, vars, _body, vars, _docEl, vars) : _proxies.unshift(t, vars);\n }\n };\n\n ScrollTrigger.clearMatchMedia = function clearMatchMedia(query) {\n _triggers.forEach(function (t) {\n return t._ctx && t._ctx.query === query && t._ctx.kill(true, true);\n });\n };\n\n ScrollTrigger.isInViewport = function isInViewport(element, ratio, horizontal) {\n var bounds = (_isString(element) ? _getTarget(element) : element).getBoundingClientRect(),\n offset = bounds[horizontal ? _width : _height] * ratio || 0;\n return horizontal ? bounds.right - offset > 0 && bounds.left + offset < _win.innerWidth : bounds.bottom - offset > 0 && bounds.top + offset < _win.innerHeight;\n };\n\n ScrollTrigger.positionInViewport = function positionInViewport(element, referencePoint, horizontal) {\n _isString(element) && (element = _getTarget(element));\n var bounds = element.getBoundingClientRect(),\n size = bounds[horizontal ? _width : _height],\n offset = referencePoint == null ? size / 2 : referencePoint in _keywords ? _keywords[referencePoint] * size : ~referencePoint.indexOf(\"%\") ? parseFloat(referencePoint) * size / 100 : parseFloat(referencePoint) || 0;\n return horizontal ? (bounds.left + offset) / _win.innerWidth : (bounds.top + offset) / _win.innerHeight;\n };\n\n ScrollTrigger.killAll = function killAll(allowListeners) {\n _triggers.slice(0).forEach(function (t) {\n return t.vars.id !== \"ScrollSmoother\" && t.kill();\n });\n\n if (allowListeners !== true) {\n var listeners = _listeners.killAll || [];\n _listeners = {};\n listeners.forEach(function (f) {\n return f();\n });\n }\n };\n\n return ScrollTrigger;\n}();\nScrollTrigger.version = \"3.12.2\";\n\nScrollTrigger.saveStyles = function (targets) {\n return targets ? _toArray(targets).forEach(function (target) {\n // saved styles are recorded in a consecutive alternating Array, like [element, cssText, transform attribute, cache, matchMedia, ...]\n if (target && target.style) {\n var i = _savedStyles.indexOf(target);\n\n i >= 0 && _savedStyles.splice(i, 5);\n\n _savedStyles.push(target, target.style.cssText, target.getBBox && target.getAttribute(\"transform\"), gsap.core.getCache(target), _context());\n }\n }) : _savedStyles;\n};\n\nScrollTrigger.revert = function (soft, media) {\n return _revertAll(!soft, media);\n};\n\nScrollTrigger.create = function (vars, animation) {\n return new ScrollTrigger(vars, animation);\n};\n\nScrollTrigger.refresh = function (safe) {\n return safe ? _onResize() : (_coreInitted || ScrollTrigger.register()) && _refreshAll(true);\n};\n\nScrollTrigger.update = function (force) {\n return ++_scrollers.cache && _updateAll(force === true ? 2 : 0);\n};\n\nScrollTrigger.clearScrollMemory = _clearScrollMemory;\n\nScrollTrigger.maxScroll = function (element, horizontal) {\n return _maxScroll(element, horizontal ? _horizontal : _vertical);\n};\n\nScrollTrigger.getScrollFunc = function (element, horizontal) {\n return _getScrollFunc(_getTarget(element), horizontal ? _horizontal : _vertical);\n};\n\nScrollTrigger.getById = function (id) {\n return _ids[id];\n};\n\nScrollTrigger.getAll = function () {\n return _triggers.filter(function (t) {\n return t.vars.id !== \"ScrollSmoother\";\n });\n}; // it's common for people to ScrollTrigger.getAll(t => t.kill()) on page routes, for example, and we don't want it to ruin smooth scrolling by killing the main ScrollSmoother one.\n\n\nScrollTrigger.isScrolling = function () {\n return !!_lastScrollTime;\n};\n\nScrollTrigger.snapDirectional = _snapDirectional;\n\nScrollTrigger.addEventListener = function (type, callback) {\n var a = _listeners[type] || (_listeners[type] = []);\n ~a.indexOf(callback) || a.push(callback);\n};\n\nScrollTrigger.removeEventListener = function (type, callback) {\n var a = _listeners[type],\n i = a && a.indexOf(callback);\n i >= 0 && a.splice(i, 1);\n};\n\nScrollTrigger.batch = function (targets, vars) {\n var result = [],\n varsCopy = {},\n interval = vars.interval || 0.016,\n batchMax = vars.batchMax || 1e9,\n proxyCallback = function proxyCallback(type, callback) {\n var elements = [],\n triggers = [],\n delay = gsap.delayedCall(interval, function () {\n callback(elements, triggers);\n elements = [];\n triggers = [];\n }).pause();\n return function (self) {\n elements.length || delay.restart(true);\n elements.push(self.trigger);\n triggers.push(self);\n batchMax <= elements.length && delay.progress(1);\n };\n },\n p;\n\n for (p in vars) {\n varsCopy[p] = p.substr(0, 2) === \"on\" && _isFunction(vars[p]) && p !== \"onRefreshInit\" ? proxyCallback(p, vars[p]) : vars[p];\n }\n\n if (_isFunction(batchMax)) {\n batchMax = batchMax();\n\n _addListener(ScrollTrigger, \"refresh\", function () {\n return batchMax = vars.batchMax();\n });\n }\n\n _toArray(targets).forEach(function (target) {\n var config = {};\n\n for (p in varsCopy) {\n config[p] = varsCopy[p];\n }\n\n config.trigger = target;\n result.push(ScrollTrigger.create(config));\n });\n\n return result;\n}; // to reduce file size. clamps the scroll and also returns a duration multiplier so that if the scroll gets chopped shorter, the duration gets curtailed as well (otherwise if you're very close to the top of the page, for example, and swipe up really fast, it'll suddenly slow down and take a long time to reach the top).\n\n\nvar _clampScrollAndGetDurationMultiplier = function _clampScrollAndGetDurationMultiplier(scrollFunc, current, end, max) {\n current > max ? scrollFunc(max) : current < 0 && scrollFunc(0);\n return end > max ? (max - current) / (end - current) : end < 0 ? current / (current - end) : 1;\n},\n _allowNativePanning = function _allowNativePanning(target, direction) {\n if (direction === true) {\n target.style.removeProperty(\"touch-action\");\n } else {\n target.style.touchAction = direction === true ? \"auto\" : direction ? \"pan-\" + direction + (Observer.isTouch ? \" pinch-zoom\" : \"\") : \"none\"; // note: Firefox doesn't support it pinch-zoom properly, at least in addition to a pan-x or pan-y.\n }\n\n target === _docEl && _allowNativePanning(_body, direction);\n},\n _overflow = {\n auto: 1,\n scroll: 1\n},\n _nestedScroll = function _nestedScroll(_ref5) {\n var event = _ref5.event,\n target = _ref5.target,\n axis = _ref5.axis;\n\n var node = (event.changedTouches ? event.changedTouches[0] : event).target,\n cache = node._gsap || gsap.core.getCache(node),\n time = _getTime(),\n cs;\n\n if (!cache._isScrollT || time - cache._isScrollT > 2000) {\n // cache for 2 seconds to improve performance.\n while (node && node !== _body && (node.scrollHeight <= node.clientHeight && node.scrollWidth <= node.clientWidth || !(_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]))) {\n node = node.parentNode;\n }\n\n cache._isScroll = node && node !== target && !_isViewport(node) && (_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]);\n cache._isScrollT = time;\n }\n\n if (cache._isScroll || axis === \"x\") {\n event.stopPropagation();\n event._gsapAllow = true;\n }\n},\n // capture events on scrollable elements INSIDE the and allow those by calling stopPropagation() when we find a scrollable ancestor\n_inputObserver = function _inputObserver(target, type, inputs, nested) {\n return Observer.create({\n target: target,\n capture: true,\n debounce: false,\n lockAxis: true,\n type: type,\n onWheel: nested = nested && _nestedScroll,\n onPress: nested,\n onDrag: nested,\n onScroll: nested,\n onEnable: function onEnable() {\n return inputs && _addListener(_doc, Observer.eventTypes[0], _captureInputs, false, true);\n },\n onDisable: function onDisable() {\n return _removeListener(_doc, Observer.eventTypes[0], _captureInputs, true);\n }\n });\n},\n _inputExp = /(input|label|select|textarea)/i,\n _inputIsFocused,\n _captureInputs = function _captureInputs(e) {\n var isInput = _inputExp.test(e.target.tagName);\n\n if (isInput || _inputIsFocused) {\n e._gsapAllow = true;\n _inputIsFocused = isInput;\n }\n},\n _getScrollNormalizer = function _getScrollNormalizer(vars) {\n _isObject(vars) || (vars = {});\n vars.preventDefault = vars.isNormalizer = vars.allowClicks = true;\n vars.type || (vars.type = \"wheel,touch\");\n vars.debounce = !!vars.debounce;\n vars.id = vars.id || \"normalizer\";\n\n var _vars2 = vars,\n normalizeScrollX = _vars2.normalizeScrollX,\n momentum = _vars2.momentum,\n allowNestedScroll = _vars2.allowNestedScroll,\n onRelease = _vars2.onRelease,\n self,\n maxY,\n target = _getTarget(vars.target) || _docEl,\n smoother = gsap.core.globals().ScrollSmoother,\n smootherInstance = smoother && smoother.get(),\n content = _fixIOSBug && (vars.content && _getTarget(vars.content) || smootherInstance && vars.content !== false && !smootherInstance.smooth() && smootherInstance.content()),\n scrollFuncY = _getScrollFunc(target, _vertical),\n scrollFuncX = _getScrollFunc(target, _horizontal),\n scale = 1,\n initialScale = (Observer.isTouch && _win.visualViewport ? _win.visualViewport.scale * _win.visualViewport.width : _win.outerWidth) / _win.innerWidth,\n wheelRefresh = 0,\n resolveMomentumDuration = _isFunction(momentum) ? function () {\n return momentum(self);\n } : function () {\n return momentum || 2.8;\n },\n lastRefreshID,\n skipTouchMove,\n inputObserver = _inputObserver(target, vars.type, true, allowNestedScroll),\n resumeTouchMove = function resumeTouchMove() {\n return skipTouchMove = false;\n },\n scrollClampX = _passThrough,\n scrollClampY = _passThrough,\n updateClamps = function updateClamps() {\n maxY = _maxScroll(target, _vertical);\n scrollClampY = _clamp(_fixIOSBug ? 1 : 0, maxY);\n normalizeScrollX && (scrollClampX = _clamp(0, _maxScroll(target, _horizontal)));\n lastRefreshID = _refreshID;\n },\n removeContentOffset = function removeContentOffset() {\n content._gsap.y = _round(parseFloat(content._gsap.y) + scrollFuncY.offset) + \"px\";\n content.style.transform = \"matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, \" + parseFloat(content._gsap.y) + \", 0, 1)\";\n scrollFuncY.offset = scrollFuncY.cacheID = 0;\n },\n ignoreDrag = function ignoreDrag() {\n if (skipTouchMove) {\n requestAnimationFrame(resumeTouchMove);\n\n var offset = _round(self.deltaY / 2),\n scroll = scrollClampY(scrollFuncY.v - offset);\n\n if (content && scroll !== scrollFuncY.v + scrollFuncY.offset) {\n scrollFuncY.offset = scroll - scrollFuncY.v;\n\n var y = _round((parseFloat(content && content._gsap.y) || 0) - scrollFuncY.offset);\n\n content.style.transform = \"matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, \" + y + \", 0, 1)\";\n content._gsap.y = y + \"px\";\n scrollFuncY.cacheID = _scrollers.cache;\n\n _updateAll();\n }\n\n return true;\n }\n\n scrollFuncY.offset && removeContentOffset();\n skipTouchMove = true;\n },\n tween,\n startScrollX,\n startScrollY,\n onStopDelayedCall,\n onResize = function onResize() {\n // if the window resizes, like on an iPhone which Apple FORCES the address bar to show/hide even if we event.preventDefault(), it may be scrolling too far now that the address bar is showing, so we must dynamically adjust the momentum tween.\n updateClamps();\n\n if (tween.isActive() && tween.vars.scrollY > maxY) {\n scrollFuncY() > maxY ? tween.progress(1) && scrollFuncY(maxY) : tween.resetTo(\"scrollY\", maxY);\n }\n };\n\n content && gsap.set(content, {\n y: \"+=0\"\n }); // to ensure there's a cache (element._gsap)\n\n vars.ignoreCheck = function (e) {\n return _fixIOSBug && e.type === \"touchmove\" && ignoreDrag(e) || scale > 1.05 && e.type !== \"touchstart\" || self.isGesturing || e.touches && e.touches.length > 1;\n };\n\n vars.onPress = function () {\n skipTouchMove = false;\n var prevScale = scale;\n scale = _round((_win.visualViewport && _win.visualViewport.scale || 1) / initialScale);\n tween.pause();\n prevScale !== scale && _allowNativePanning(target, scale > 1.01 ? true : normalizeScrollX ? false : \"x\");\n startScrollX = scrollFuncX();\n startScrollY = scrollFuncY();\n updateClamps();\n lastRefreshID = _refreshID;\n };\n\n vars.onRelease = vars.onGestureStart = function (self, wasDragging) {\n scrollFuncY.offset && removeContentOffset();\n\n if (!wasDragging) {\n onStopDelayedCall.restart(true);\n } else {\n _scrollers.cache++; // make sure we're pulling the non-cached value\n // alternate algorithm: durX = Math.min(6, Math.abs(self.velocityX / 800)),\tdur = Math.max(durX, Math.min(6, Math.abs(self.velocityY / 800))); dur = dur * (0.4 + (1 - _power4In(dur / 6)) * 0.6)) * (momentumSpeed || 1)\n\n var dur = resolveMomentumDuration(),\n currentScroll,\n endScroll;\n\n if (normalizeScrollX) {\n currentScroll = scrollFuncX();\n endScroll = currentScroll + dur * 0.05 * -self.velocityX / 0.227; // the constant .227 is from power4(0.05). velocity is inverted because scrolling goes in the opposite direction.\n\n dur *= _clampScrollAndGetDurationMultiplier(scrollFuncX, currentScroll, endScroll, _maxScroll(target, _horizontal));\n tween.vars.scrollX = scrollClampX(endScroll);\n }\n\n currentScroll = scrollFuncY();\n endScroll = currentScroll + dur * 0.05 * -self.velocityY / 0.227; // the constant .227 is from power4(0.05)\n\n dur *= _clampScrollAndGetDurationMultiplier(scrollFuncY, currentScroll, endScroll, _maxScroll(target, _vertical));\n tween.vars.scrollY = scrollClampY(endScroll);\n tween.invalidate().duration(dur).play(0.01);\n\n if (_fixIOSBug && tween.vars.scrollY >= maxY || currentScroll >= maxY - 1) {\n // iOS bug: it'll show the address bar but NOT fire the window \"resize\" event until the animation is done but we must protect against overshoot so we leverage an onUpdate to do so.\n gsap.to({}, {\n onUpdate: onResize,\n duration: dur\n });\n }\n }\n\n onRelease && onRelease(self);\n };\n\n vars.onWheel = function () {\n tween._ts && tween.pause();\n\n if (_getTime() - wheelRefresh > 1000) {\n // after 1 second, refresh the clamps otherwise that'll only happen when ScrollTrigger.refresh() is called or for touch-scrolling.\n lastRefreshID = 0;\n wheelRefresh = _getTime();\n }\n };\n\n vars.onChange = function (self, dx, dy, xArray, yArray) {\n _refreshID !== lastRefreshID && updateClamps();\n dx && normalizeScrollX && scrollFuncX(scrollClampX(xArray[2] === dx ? startScrollX + (self.startX - self.x) : scrollFuncX() + dx - xArray[1])); // for more precision, we track pointer/touch movement from the start, otherwise it'll drift.\n\n if (dy) {\n scrollFuncY.offset && removeContentOffset();\n var isTouch = yArray[2] === dy,\n y = isTouch ? startScrollY + self.startY - self.y : scrollFuncY() + dy - yArray[1],\n yClamped = scrollClampY(y);\n isTouch && y !== yClamped && (startScrollY += yClamped - y);\n scrollFuncY(yClamped);\n }\n\n (dy || dx) && _updateAll();\n };\n\n vars.onEnable = function () {\n _allowNativePanning(target, normalizeScrollX ? false : \"x\");\n\n ScrollTrigger.addEventListener(\"refresh\", onResize);\n\n _addListener(_win, \"resize\", onResize);\n\n if (scrollFuncY.smooth) {\n scrollFuncY.target.style.scrollBehavior = \"auto\";\n scrollFuncY.smooth = scrollFuncX.smooth = false;\n }\n\n inputObserver.enable();\n };\n\n vars.onDisable = function () {\n _allowNativePanning(target, true);\n\n _removeListener(_win, \"resize\", onResize);\n\n ScrollTrigger.removeEventListener(\"refresh\", onResize);\n inputObserver.kill();\n };\n\n vars.lockAxis = vars.lockAxis !== false;\n self = new Observer(vars);\n self.iOS = _fixIOSBug; // used in the Observer getCachedScroll() function to work around an iOS bug that wreaks havoc with TouchEvent.clientY if we allow scroll to go all the way back to 0.\n\n _fixIOSBug && !scrollFuncY() && scrollFuncY(1); // iOS bug causes event.clientY values to freak out (wildly inaccurate) if the scroll position is exactly 0.\n\n _fixIOSBug && gsap.ticker.add(_passThrough); // prevent the ticker from sleeping\n\n onStopDelayedCall = self._dc;\n tween = gsap.to(self, {\n ease: \"power4\",\n paused: true,\n scrollX: normalizeScrollX ? \"+=0.1\" : \"+=0\",\n scrollY: \"+=0.1\",\n modifiers: {\n scrollY: _interruptionTracker(scrollFuncY, scrollFuncY(), function () {\n return tween.pause();\n })\n },\n onUpdate: _updateAll,\n onComplete: onStopDelayedCall.vars.onComplete\n }); // we need the modifier to sense if the scroll position is altered outside of the momentum tween (like with a scrollTo tween) so we can pause() it to prevent conflicts.\n\n return self;\n};\n\nScrollTrigger.sort = function (func) {\n return _triggers.sort(func || function (a, b) {\n return (a.vars.refreshPriority || 0) * -1e6 + a.start - (b.start + (b.vars.refreshPriority || 0) * -1e6);\n });\n};\n\nScrollTrigger.observe = function (vars) {\n return new Observer(vars);\n};\n\nScrollTrigger.normalizeScroll = function (vars) {\n if (typeof vars === \"undefined\") {\n return _normalizer;\n }\n\n if (vars === true && _normalizer) {\n return _normalizer.enable();\n }\n\n if (vars === false) {\n return _normalizer && _normalizer.kill();\n }\n\n var normalizer = vars instanceof Observer ? vars : _getScrollNormalizer(vars);\n _normalizer && _normalizer.target === normalizer.target && _normalizer.kill();\n _isViewport(normalizer.target) && (_normalizer = normalizer);\n return normalizer;\n};\n\nScrollTrigger.core = {\n // smaller file size way to leverage in ScrollSmoother and Observer\n _getVelocityProp: _getVelocityProp,\n _inputObserver: _inputObserver,\n _scrollers: _scrollers,\n _proxies: _proxies,\n bridge: {\n // when normalizeScroll sets the scroll position (ss = setScroll)\n ss: function ss() {\n _lastScrollTime || _dispatch(\"scrollStart\");\n _lastScrollTime = _getTime();\n },\n // a way to get the _refreshing value in Observer\n ref: function ref() {\n return _refreshing;\n }\n }\n};\n_getGSAP() && gsap.registerPlugin(ScrollTrigger);\nexport { ScrollTrigger as default };","import {handleImageLoad} from './components/handleImageLoad';\r\nimport {observeScroll} from './components/observe-scroll';\r\nimport {pauseVideos} from './components/brightcove-videos';\r\n\r\nimport {viewportCheck} from './components/viewport-check';\r\nimport {cursorFollow} from './components/cursor-follow';\r\nimport {projectsGrid} from './components/projectsGrid';\r\nimport {initSliders} from './components/splidejs';\r\nimport {reportsPage} from './components/reports-page';\r\nimport {LoadReports} from './components/reports-page';\r\nimport {GetParameters} from './components/reports-page';\r\nimport {reportDownloadFormHandler} from './components/reportDownload';\r\nimport {mediaBlocks2x} from './components/media-blocks-2x';\r\nimport {newsletterForm} from './components/newsletter-form';\r\nimport {mediaCarousel} from './components/media-carousel';\r\nimport {enableVideoAutoplay} from './components/video-autoplay';\r\nimport {scrollTrigger} from './components/scroller';\r\n\r\nimport {handleSubscribe} from './components/subscribe-component';\r\n\r\n// ! Dev script - Shows the grid\r\n// document.addEventListener('keydown', function(event) {\r\n// \tif (event.shiftKey && event.key === 'G') {\r\n// \t\tvar element = document.getElementsByClassName('design-grid')[0];\r\n// \t\telement.classList.toggle('show');\r\n// \t}\r\n// });\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n\t// The DOM has loaded (but other stuff hasnt yet neccessarily)\r\n\tif(!$('body').hasClass('contentPage')) {\r\n\t\tobserveScroll();\r\n\t}\r\n\tenableVideoAutoplay();\r\n\thandleSubscribe();\r\n});\r\n\r\nwindow.addEventListener(\"load\", (event) => {\r\n\t// alert(\"Window Loaded\");\r\n\t// console.log(\"Window Loaded\");\r\n\r\n\r\n\tcursorFollow();\r\n\r\n\r\n\t// Homepage conveyor\r\n\tconst sliderSpeed = 0.4;\r\n\t$.when(initSliders(sliderSpeed)).then(function() {\r\n\t\t$('div.project-slides > div').addClass(\"ready\");\r\n\t});\r\n\r\n\r\n\t// Projects Grid filter\r\n\tprojectsGrid();\r\n\r\n\r\n\t// Reports page \r\n\treportsPage();\r\n\tLoadReports(GetParameters(), true);\r\n\treportDownloadFormHandler();\r\n\t\r\n\tnewsletterForm();\r\n\tmediaCarousel();\r\n\t\r\n\tscrollTrigger();\r\n\t\r\n\t// Check when the footer is loaded\r\n\tconst body = document.querySelector('body');\r\n\tconst footer = document.querySelector('body > .main-footer');\r\n\tviewportCheck(footer, body);\r\n});\r\n\r\nfunction VideoTransform() {\r\n\t// Check if video is in middle\r\n\t// calculate percentage value of steps between 100% and video size \r\n\t//if scroll up, increase size by percentage - \r\n\t// if scroll down decrese percetange until > 0\r\n\r\n\tvar lastScrollTop = 0;\r\n\tconst videoEle = 'main div.umb-block-list div.single-:first-child';\r\n\tif ($(videoEle).length < 1) {\r\n\t\treturn;\r\n\t} \r\n\r\n\t$(window).on('scroll', function () {\r\n\t\t//var videoEle = document.querySelector('main div.umb-block-list div.single-media');\r\n\t\tif (isInViewport(videoEle)) {\r\n\t\t\tvar ele = document.querySelector(videoEle);\r\n\r\n\t\t\t//console.log('Just hit mid');\r\n\t\t\t// Update css \r\n\t\t\t// if($(ele).css('max-width') && $(ele).css('max-width') === '100%') {\r\n\t\t\t// \t$(ele).css('width', $(ele).css('max-width')).css('max-width', '100%');\r\n\t\t\t// }\r\n\r\n\t\t\t//var maxwidth = document.querySelector('main div.umb-block-list').offsetWidth;\r\n\r\n\t\t\tvar st = window.pageYOffset || document.documentElement.scrollTop;\r\n\t\t\tif (st > lastScrollTop) {\r\n\t\t\t\t//debugger;\r\n\t\t\t\t//console.log('Increase size');\r\n\t\t\t\tvar newwidth = $(ele).width() + 2;\r\n\t\t\t\t$(ele).css('max-width', newwidth + 'px;');\r\n\t\t\t\t//return 'up';\r\n\t\t\t} else if (st < lastScrollTop) {\r\n\t\t\t\t//console.log('Decrease size');\r\n\t\t\t\tvar newwidth = $(ele).width() - 2;\r\n\t\t\t\t$(ele).css('max-width', newwidth + 'px;');\r\n\t\t\t\t//return 'down';\r\n\t\t\t} // else was horizontal scroll\r\n\t\t\tlastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling\r\n\r\n\t\t} else {\r\n\t\t\t//console.log('NOT in VP');\r\n\t\t}\r\n\r\n\t});\r\n\t//scrollDetect();\r\n}\r\n\r\nfunction scrollDetect() {\r\n\tvar lastScrollTop = 0;\r\n\r\n\t// element should be replaced with the actual target element on which you have applied scroll, use window in case of no target element.\r\n\twindow.addEventListener(\"scroll\", function () { // or window.addEventListener(\"scroll\"....\r\n\t\tvar st = window.pageYOffset || document.documentElement.scrollTop; // Credits: \"https://github.com/qeremy/so/blob/master/so.dom.js#L426\"\r\n\t\tif (st > lastScrollTop) {\r\n\t\t\t//console.log('Scroll Up');\r\n\t\t\treturn 'up';\r\n\t\t} else if (st < lastScrollTop) {\r\n\t\t\t//console.log('Scroll Down');\r\n\t\t\t//return 'down';\r\n\t\t} // else was horizontal scroll\r\n\t\tlastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling\r\n\t}, false);\r\n}\r\n\r\nfunction isInViewport(element) {\r\n\t\tvar videoEle = document.querySelector(element);\r\n\t\tconst rect = videoEle.getBoundingClientRect();\r\n\treturn (\r\n\t\trect.top <= window.innerHeight &&\r\n\t\trect.left >= 0 &&\r\n\t\trect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n\t);\r\n}","import {handleImageLoad} from './handleImageLoad';\r\nimport {handleVideoLoad} from './handleVideoLoad';\r\n\r\nexport function observeScroll() {\r\n\r\n\t// Get the target elements\r\n\tconst mainHeader = document.querySelector('header.article-header');\r\n\tconst main = document.querySelector('main');\r\n\tconst psuedoFooter = document.querySelector('main > .psuedo-footer');\r\n\r\n\tconst projectsGrid = document.querySelector('.projects-grid');\r\n\tconst componentsList = document.querySelectorAll('.umb-block-list > div:not(.img-handled)');\r\n\r\n\tconst viewportTop = window.pageYOffset || document.documentElement.scrollTop;\r\n\tconst viewportBottom = viewportTop + window.innerHeight;\r\n\r\n\tfunction performScrollActions(scrollElem) {\r\n\t\t//console.log(\"scrollElem: \", scrollElem);\r\n\t\tconst elementRect = scrollElem.getBoundingClientRect();\r\n\t\tconst elementTop = elementRect.top + viewportTop;\r\n\t\tconst elementBottom = elementRect.bottom + viewportTop;\r\n\r\n\t\t// scrollElem.classList.remove('active'); // Remove active class from all components\r\n\r\n\t\tif (elementTop > viewportBottom) {\r\n\t\t\t// Top of the element is below the bottom of the viewport\r\n\t\t\t// scrollElem.classList.add('s1a', 'etop-below-vbottom');\r\n\t\t\t// scrollElem.classList.remove('s1b', 'etop-above-vbottom');\r\n\r\n\t\t\tscrollElem.classList.remove('in-viewport', '⬆️', '⬇️', '🪟');\r\n\r\n\t\t} else {\r\n\t\t\t// Top of the element is above the bottom of the viewport\r\n\t\t\t// scrollElem.classList.add('s1b', 'etop-above-vbottom');\r\n\t\t\t// scrollElem.classList.remove('s1a', 'etop-below-vbottom');\r\n\r\n\t\t\tscrollElem.classList.add('scroll-entered');\r\n\r\n\t\t\t// Why are just trying to check if the element is in the viewport at all\r\n\t\t\t// So the top of the element is above the bottom of the viewport\r\n\t\t\t// AND the bottom of the element is below the top of the viewport\r\n\t\t\tif (elementBottom > viewportTop) {\r\n\t\t\t\tscrollElem.classList.add('in-viewport');\r\n\t\t\t\t// console.log(\"let's handle images in: \", scrollElem);\r\n\t\t\t\tif (scrollElem.tagName !== \"MAIN\") {\r\n\t\t\t\t\t// console.log(\"It's NOT main. Go ahead\");\r\n\t\t\t\t\thandleImageLoad(scrollElem);\r\n\t\t\t\t\thandleVideoLoad(scrollElem);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tscrollElem.classList.remove('in-viewport', '⬆️', '⬇️', '🪟');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tif (elementTop < viewportTop) {\r\n\t\t\t// Top of the element is above the top of the viewport\r\n\t\t\t// scrollElem.classList.add('s2a', 'etop-above-vtop');\r\n\t\t\t// scrollElem.classList.remove('s2b', 'etop-below-vtop');\r\n\r\n\t\t\tif (scrollElem.classList.contains(\"main\")) {\r\n\t\t\t\tif (mainHeader != null) {\r\n\t\t\t\t\tmainHeader.classList.add('header-hiding');\r\n\t\t\t\t\tmainHeader.classList.remove('header-showing');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tscrollElem.classList.add('etop-above-vtop');\r\n\t\t\tscrollElem.classList.remove('etop-below-vtop');\r\n\t\t} else {\r\n\t\t\t// Top of the element is below the top of the viewport \r\n\t\t\t// scrollElem.classList.add('s2b', 'etop-below-vtop');\r\n\t\t\t// scrollElem.classList.remove('s2a', 'etop-above-vtop');\r\n\r\n\t\t\tif (scrollElem.classList.contains(\"main\")) {\r\n\t\t\t\tif (mainHeader != null) {\r\n\t\t\t\t\tmainHeader.classList.add('header-showing');\r\n\t\t\t\t\tmainHeader.classList.remove('header-hiding');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tscrollElem.classList.add('etop-below-vtop');\r\n\t\t\tscrollElem.classList.remove('etop-above-vtop');\r\n\t\t}\r\n\r\n\t\tif (elementBottom > viewportBottom) {\r\n\t\t\t// Bottom of the element is below the bottom of the viewport\r\n\t\t\t// scrollElem.classList.add('s3a', 'ebottom-below-vbottom');\r\n\t\t\t// scrollElem.classList.remove('s3b', 'ebottom-above-vbottom');\r\n\t\t} else {\r\n\t\t\t// Bottom of the element is above the bottom of the viewport\r\n\t\t\t// scrollElem.classList.add('s3b', 'ebottom-above-vbottom');\r\n\t\t\t// scrollElem.classList.remove('s3a', 'ebottom-below-vbottom');\r\n\t\t}\r\n\r\n\t\tif (elementBottom < viewportTop) {\r\n\t\t\t// Bottom of the element is above the top of the viewport\r\n\t\t\t// scrollElem.classList.add('s4b', 'ebottom-above-vtop');\r\n\t\t\t// scrollElem.classList.remove('s4a', 'ebottom-below-vtop');\r\n\t\t} else {\r\n\t\t\t// Bottom of the element is below the top of the viewport\r\n\t\t\t// scrollElem.classList.add('s4a', 'ebottom-below-vtop');\r\n\t\t\t// scrollElem.classList.remove('s4b', 'ebottom-above-vtop');\r\n\t\t}\r\n\t}\r\n\r\n\t// Function to check and apply actions based on element position\r\n\tfunction checkElementPosition() {\r\n\t\tmain.classList.add('scroll-ready');\r\n\r\n\t\tif (mainHeader != null) {\r\n\t\t\t// console.log(\"mainHeader scroll actions\");\r\n\t\t\tperformScrollActions(mainHeader);\r\n\t\t}\r\n\t\tif (main != null) {\r\n\t\t\t// console.log(\"main scroll actions\");\r\n\t\t\tperformScrollActions(main);\r\n\t\t}\r\n\t\tif (psuedoFooter != null) {\r\n\t\t\t// console.log(\"psuedoFooter scroll actions\");\r\n\t\t\tperformScrollActions(psuedoFooter);\r\n\t\t}\r\n\t\tif (projectsGrid != null) {\r\n\t\t\t// console.log(\"projectsGrid scroll actions\");\r\n\t\t\tperformScrollActions(projectsGrid);\r\n\t\t}\r\n\r\n\t\tfor (var index = 0; index < componentsList.length; index++) {\r\n\t\t\tcomponentsList[index].classList.add('scroll-ready');\r\n\t\t\tperformScrollActions(componentsList[index]);\r\n\t\t}\r\n\t}\r\n\r\n\t// Call the function on scroll event\r\n\twindow.addEventListener('scroll', checkElementPosition);\r\n\r\n}","import {checkVideosInitiated} from './brightcove-videos';\r\n\r\nexport function handleVideoLoad(vidParent) {\r\n\t// console.log(\"handleImageLoad started\");\r\n\r\n\tconst lazyloadVideos = vidParent.querySelectorAll(\".lazyload-video\");\r\n\r\n\tlazyloadVideos.forEach(function (videoWrapper) {\r\n\t\t// console.log(\"vidParent: \", vidParent);\r\n\t\t// console.log(\"lazyloadVideos: \", lazyloadVideos);\r\n\t\t// console.log(\"videoWrapper: \", videoWrapper);\r\n\r\n\r\n\r\n\t\t// Handle the high-res video load event\r\n\t\tfunction handleVideo() {\r\n\t\t\t// console.log(\"This video is loaded\");\r\n\t\t\t\r\n\t\t\tlet shouldWeShowTheImage = false;\r\n\t\t\t\r\n\t\t\t// Double check the space is in the viewport\r\n\t\t\tif(vidParent.classList.contains(\"in-viewport\")) {\r\n\t\t\t\t// console.log(\"It's in the viewport\", vidParent);\r\n\t\t\t\tshouldWeShowTheImage = true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Double check the video has loaded\r\n\t\t\t// console.log(\"highResImage\", videoWrapper);\r\n\t\t\tif (videoWrapper.classList.contains(\"loaded\")) {\r\n\t\t\t\t// console.log(\"It's already loaded\", videoWrapper);\r\n\t\t\t\tshouldWeShowTheImage = false; // It's already done\r\n\t\t\t}\r\n\r\n\t\t\tif (shouldWeShowTheImage) {\r\n\t\t\t\t// console.log(\"videoWrapper: \", videoWrapper);\r\n\t\t\t\t// console.log(\"videoWrapper: \", videoWrapper);\r\n\t\t\t\t// addPlayer(bcVideoId, thisPlayerWrapper);\r\n\r\n\t\t\t\tcheckVideosInitiated(videoWrapper);\r\n\r\n\t\t\t\t// videoWrapper.classList.add(\"loaded\");\r\n\t\t\t\tvidParent.classList.add(\"vid-handled\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Immediately run the above function\r\n\t\thandleVideo();\r\n\r\n\t});\r\n\r\n\t// console.log(\"handleImageLoad done\");\r\n}","export function enableVideoAutoplay() {\r\n\t// Get all the talkie video elements\r\n\tconst talkieVideos = document.querySelectorAll('.single-media video');\r\n\r\n\t// Create an Intersection Observer instance\r\n\tconst observer = new IntersectionObserver((entries) => {\r\n\t\tentries.forEach((entry) => {\r\n\t\t\tif (entry.intersectionRatio > 0) {\r\n\t\t\t\t// Video is in view, play it\r\n\t\t\t\t// entry.target.play();\r\n\t\t\t} else {\r\n\t\t\t\t// Video is out of view, pause it\r\n\t\t\t\tentry.target.pause();\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\r\n\t// Loop through each talkie video and observe it\r\n\ttalkieVideos.forEach((video) => {\r\n\t\tobserver.observe(video);\r\n\t});\r\n}","export function handleSubscribe() {\r\n\tconst subscribeComponent = document.querySelector('.subscribe-component');\r\n\r\n\tfunction switchView(currentViewClass, nextViewClass) {\r\n\t\tsubscribeComponent.classList.remove(currentViewClass);\r\n\t\tsubscribeComponent.classList.add(nextViewClass);\r\n\t}\r\n\r\n\tfunction validateCurrentView(viewClass) {\r\n\t\tlet valid = true;\r\n\t\tconst thisContainer = document.querySelector('.view.' + viewClass);\r\n\t\tconst valMsgArea = thisContainer.querySelector(`.${viewClass} .val-msg`);\r\n\t\tvalMsgArea.innerHTML = '';\r\n\r\n\t\tthisContainer.querySelectorAll(`.${viewClass} .ds-required`).forEach(field => {\r\n\t\t\tif ((field.type === 'checkbox' && !field.checked)) {\r\n\t\t\t\tvalid = false;\r\n\t\t\t\tvalMsgArea.innerHTML += `
\"${field.getAttribute('data-error')}\"
`;\r\n\t\t\t}\r\n\t\t\telse if (!field.value.trim()) {\r\n\t\t\t\tvalid = false;\r\n\t\t\t\tvalMsgArea.innerHTML += `
\"${field.placeholder}\" is required.
`;\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn valid;\r\n\t}\r\n\r\n\tfunction nextStep(currentViewClass, nextViewClass) {\r\n\t\tif (validateCurrentView(currentViewClass)) {\r\n\t\t\tswitchView(currentViewClass, nextViewClass);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction submitForm() {\r\n\t\tif (!validateCurrentView('details-view')) return;\r\n\r\n\t\tconst formData = {\r\n\t\t\t\"FirstName\": document.getElementById('firstName').value,\r\n\t\t\t\"LastName\": document.getElementById('lastName').value,\r\n\t\t\t\"$email\": document.getElementById('email').value,\r\n\t\t\t\"WantToWorkWithUs\": document.getElementById('workWithUs').checked,\r\n\t\t\t\"Industry\": document.getElementById('industry').value,\r\n\t\t\t\"Position\": document.getElementById('position').value,\r\n\t\t\t\"Seniority\": document.getElementById('seniority').value\r\n\t\t};\r\n\r\n\t\tfetch('/Umbraco/Api/SubscriptionApi/SaveNewsletterSubscriptionForm', {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(formData)\r\n\t\t})\r\n\t\t\t.then(response => response.json())\r\n\t\t\t.then(data => {\r\n\t\t\t\t// ! Debugging - Check if the response is JSON\r\n\t\t\t\tconst valMsgArea = document.querySelector('.view.details-view .val-msg'); // Select the validation message area\r\n\t\t\t\tlet debugString = \"\";\r\n\r\n\t\t\t\tif (typeof data === 'object') {\r\n\t\t\t\t\t// * Hide the debug string from users, but leave it in for us to see.\r\n\t\t\t\t\tdebugString += '
';\r\n\r\n\r\n\t\t\t\t\t// * Display the JSON response\r\n\t\t\t\t\tdebugString += '
Response:
';\r\n\t\t\t\t\tdebugString += '(2): ';\r\n\t\t\t\t\tdebugString += JSON.stringify(data);\r\n\t\t\t\t\tdebugString += '
';\r\n\r\n\t\t\t\t\tdebugString += '
Response:
';\r\n\t\t\t\t\tdebugString += '(4): Success? - ';\r\n\t\t\t\t\tdebugString += data.success;\r\n\t\t\t\t\tdebugString += '
';\r\n\r\n\r\n\t\t\t\t\t// * Hide the debug string from users, this ENDs the wrapper.\r\n\t\t\t\t\tdebugString += '
';\r\n\r\n\t\t\t\t\t// valMsgArea.innerHTML = debugString;\r\n\r\n\t\t\t\t\t// ! Hack for testing\r\n\t\t\t\t\t// data.success = true;\r\n\r\n\t\t\t\t\tconsole.log(\"data.success: \", data.success);\r\n\t\t\t\t\tif (data.success) {\r\n\t\t\t\t\t\tvalMsgArea.innerHTML = `
Submission successful:
${debugString}
`;\r\n\t\t\t\t\t\tswitchView('details-view', 'thanks-view'); // Switch to thank-you view on success\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvalMsgArea.innerHTML = `
Submission failed: ${data.message}
${debugString}`;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Display the plain text response\r\n\t\t\t\t\t// console.log(\"Response was HTML 👎\");\r\n\t\t\t\t\tvalMsgArea.innerHTML = `
Invalid response format received.
${debugString}`;\r\n\t\t\t\t\t// valMsgArea.innerHTML = `
Invalid response format received. Please try again
`;\r\n\t\t\t\t}\r\n\r\n\t\t\t})\r\n\t\t\t.catch(error => {\r\n\t\t\t\tdocument.querySelector('.details-view .val-msg').innerHTML = '
Submission failed. Please try again.
' + debugString; // Show error message\r\n\t\t\t});\r\n\t}\r\n\r\n\tdocument.querySelector('#nextBtn').addEventListener('click', () => nextStep('contact-view', 'details-view'));\r\n\tdocument.querySelector('#submitBtn').addEventListener('click', submitForm);\r\n}\r\n","export function mediaCarousel() {\r\n var title = \"\";\r\n $(document).mousemove(function (e) {\r\n $(\".media-carousel\").each(function (i, v) {\r\n\r\n var container = v;\r\n var img = $(this).children()[0];\r\n\r\n if ((e.pageY < $(img).offset().top ||\r\n e.pageY > $(img).offset().top + $(img).height() ||\r\n e.pageX < $(img).offset().left ||\r\n e.pageX > $(img).offset().left + $(img).width())) {\r\n\r\n if ($(container).children().length == 2) {\r\n $(container).children()[0].title = $($(container).children()[1]).html();\r\n container.removeChild($(container).children()[1]);\r\n }\r\n }\r\n else {\r\n if ($(container).children().length == 1) {\r\n title = $(\"
DRAG
\");\r\n $(container).children()[0].title = \"\";\r\n $(container).append(title);\r\n }\r\n title.offset({\r\n top: (e.pageY ? e.pageY + 5 : e.clientX + 5),\r\n left: (e.pageX ? e.pageX + 5 : e.clientY + 5)\r\n });\r\n }\r\n });\r\n\r\n });\r\n}","import { Splide } from '@splidejs/splide';\r\nimport { AutoScroll } from '@splidejs/splide-extension-auto-scroll';\r\nimport { Video } from '@splidejs/splide-extension-video';\r\nimport '@splidejs/splide-extension-video/dist/css/splide-extension-video.min.css';\r\nimport {handleImageLoad} from './handleImageLoad';\r\nimport {checkVideosInitiated} from './brightcove-videos';\r\n\r\nexport function projectsGrid() {\r\n\tconst projSliders = document.getElementsByClassName('splide projects-splide');\r\n\r\n\tvar ele = 'div.projects-grid div.grid-filter-options input[type=\"radio\"]';\t\r\n\r\n\t$(ele).on('change', e => {\r\n\t\t$('div.project-slides > div').removeClass(\"ready\");\r\n\t\t$('div.project-slides .splide').remove();\r\n\t\t// var selectedCategories = [];\r\n\t\t// var checkboxes = $('div.projects-grid div.grid-filter-options input[type=\"radio\"]:checked');\r\n\t\t// $('div.projects-grid div.grid-filter-options input[type=\"checkbox\"]:radio').each(function (c) {\r\n\t\t// \tselectedCategories.push($(checkboxes[c]).attr('data-val'));\r\n\t\t// });\r\n\r\n\t\tvar postData = { \r\n\t\t\tcategories: $('div.projects-grid div.grid-filter-options input[type=\"radio\"]:checked').attr('data-val') + \"\", \r\n\t\t\trows: $('div.projects-grid div.project-slides').attr('data-rows') \r\n\t\t};\r\n\t\t//console.log(\"projectsGrid categories: \", selectedCategories);\r\n\t\tconsole.log(\"postdata rows: \", postData);\r\n\r\n\t\tvar _url = '/umbraco/surface/Projects/LoadProjectSlider';\r\n\t\t$.ajax({\r\n\t\t\ttype: \"get\",\r\n\t\t\turl: _url,\r\n\t\t\tdata: postData,\r\n\t\t\tsuccess: function (result) {\r\n\t\t\t\tconst sliderSpeed = 0.4;\r\n\t\t\t\t$.when($('div.project-slides').append(result))\r\n\t\t\t\t.then(function () { InitProjectSlider(sliderSpeed); })\r\n\t\t\t\t\t.then(function () {\r\n\r\n\t\t\t\t\t\t//console.log(\"Moment 1\");\r\n\t\t\t\t\t\tvar players = videojs.getAllPlayers();\r\n\t\t\t\t\t\tvar keys = Object.keys(players);\r\n\t\t\t\t\t\tfor (let i = 0; i < keys.length; i++) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t//console.log(\"Moment 2\");\r\n\t\t\t\t\t\t\tplayers[keys[i]].play();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.then(function () {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t//console.log(\"Moment 3\");\r\n\r\n\t\t\t\t\t\t$('div.project-slides > div').addClass(\"ready\");\r\n\t\t\t\t\t\tconst projectSlides = document.querySelector(\".projects-grid\");\r\n\t\t\t\t\t\tcheckVideosInitiated(projectSlides);\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.then(function () {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t//console.log(\"Moment 3a\");\r\n\r\n\t\t\t\t\t\tconst projectSlides = document.querySelector(\".projects-grid\");\r\n\t\t\t\t\t\thandleImageLoad(projectSlides);\r\n\t\t\t\t\t});\r\n\t\t\t},\r\n\t\t});\r\n\t});\r\n\r\n\tfunction InitProjectSlider(speed) {\r\n\t\t\r\n\t\t//console.log(\"Moment 4\");\r\n\r\n\t\tfor (var i = 0; i < projSliders.length; i++) {\r\n\t\t\tvar splide = new Splide(projSliders[i], {\r\n\t\t\t\ttype: 'loop',\r\n\t\t\t\tperPage: 4,\r\n\t\t\t\tpadding: '5rem',\r\n\t\t\t\tfocus: 'center',\r\n\t\t\t\tdirection: ($(projSliders[i]).attr('dir') === 'rtl' ? 'rtl' : 'ltr'),\r\n\t\t\t\tlazyLoad: 'nearby',\r\n\t\t\t\tdrag: 'free',\r\n\t\t\t\tautoWidth: false,\r\n\t\t\t\tautoScroll: {\r\n\t\t\t\t\tspeed: speed,\r\n\t\t\t\t},\r\n\t\t\t\tautoHeight: true,\r\n\t\t\t\tvideo: {\r\n\t\t\t\t\tautoplay: true,\r\n\t\t\t\t\tloop: true,\r\n\t\t\t\t\tmute: true,\r\n\t\t\t\t},\r\n\t\t\t\tbreakpoints: {\r\n\t\t\t\t\t1000: {\r\n\t\t\t\t\t\tperPage: 2,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t640: {\r\n\t\t\t\t\t\tperPage: 1,\r\n\t\t\t\t\t\tpadding: '2rem',\r\n\t\t\t\t\t},\r\n\t\t\t\t\t480: {\r\n\t\t\t\t\t\tperPage: 1,\r\n\t\t\t\t\t\tpadding: '1rem',\r\n\t\t\t\t\t},\r\n\t\t\t\t},\r\n\t\t\t});\r\n\r\n\t\t\tsplide.mount({ Video, AutoScroll });\r\n\r\n\t\t\tsplide.on( 'visible', function (event, target) {\r\n\t\t\t\t//console.log(\"SPLIDE visible\");\r\n\t\t\t\t// console.log(\"event: \", event);\r\n\t\t\t\t// console.log(\"target: \", target);\r\n\t\t\t\t// do something\r\n\t\t\t});\r\n\r\n\t\t\tsplide.on( 'ready', function () {\r\n\t\t\t\t//console.log(\"SPLIDE READY\");\r\n\t\t\t\t// do something\r\n\t\t\t});\r\n\r\n\t\t\tsplide.on( 'refresh', function () {\r\n\t\t\t\t//console.log(\"SPLIDE refresh\");\r\n\t\t\t\t// do something\r\n\t\t\t});\r\n\r\n\t\t\tsplide.on( 'refresh', function () {\r\n\t\t\t\t//console.log(\"SPLIDE refresh\");\r\n\t\t\t\t// do something\r\n\t\t\t});\r\n\r\n\r\n\t\t\t\r\n\r\n\r\n\t\t}\r\n\t}\r\n}","export function reportDownloadFormHandler() {\r\n if (document.forms[\"report-form\"] === undefined && document.forms[\"report-purchase-form\"] === undefined) { return; }\r\n else if (document.forms[\"report-form\"] != undefined) {\r\n Array.from(document.forms[\"report-form\"].elements).forEach((input) => {\r\n input.addEventListener('change', function () { if (this.value.length > 0) { $(this).removeClass('error'); $(this).parent().removeClass('error'); } });\r\n });\r\n } else if (document.forms[\"report-purchase-form\"] != undefined) {\r\n Array.from(document.forms[\"report-purchase-form\"].elements).forEach((input) => {\r\n input.addEventListener('change', function () { if (this.value.length > 0) { $(this).removeClass('error'); $(this).parent().removeClass('error'); } });\r\n });\r\n }\r\n\r\n $('div.form-row').removeClass('error');\r\n\r\n $('#report-form').on('submit', function (e) {\r\n e.preventDefault();\r\n if (ValidateForm('report-form')) {\r\n var source = \"\";\r\n var data = JSON.stringify({ __RequestVerificationToken: $(\"[name='__RequestVerificationToken']\").val(), EmailAddress: $('#report-form #EmailAddress').val(), FullName: $('#report-form #FullName').val(), Company: $('#report-form #Company').val(), Position: $('#report-form #Position').val(), ReportPage: window.location.href, PageId: $('#report-form #PageId').val() });\r\n\r\n $.ajax({\r\n url: \"/umbraco/surface/Reports/SaveKlaviyoForm\",\r\n type: \"POST\",\r\n data: data,\r\n contentType: \"application/json\",\r\n success: function (reportLink) {\r\n document.forms[\"report-form\"].reset();\r\n $('div#report-form > div').slideToggle();\r\n var a = document.createElement(\"a\");\r\n a.href = reportLink;\r\n var evt = document.createEvent(\"MouseEvents\");\r\n a.setAttribute('download', '');\r\n\r\n //the tenth parameter of initMouseEvent sets ctrl key\r\n evt.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null);\r\n a.dispatchEvent(evt);\r\n }\r\n });\r\n }\r\n });\r\n\r\n $('#report-purchase-form').on('submit', function (e) {\r\n var valid = false;\r\n if (!ValidateForm('report-purchase-form')) {\r\n e.preventDefault();\r\n var data = JSON.stringify({ __RequestVerificationToken: $(\"[name='__RequestVerificationToken']\").val(), EmailAddress: $('#report-purchase-form #EmailAddress').val(), FullName: $('#report-purchase-form #FullName').val(), Company: $('#report-purchase-form #Company').val(), Position: $('#report-purchase-form #Position').val(), ReportPage: window.location.href, PageId: $('#report-purchase-form #PageId').val(), ReportType: 'Paid', PageId: $('#report-purchase-form #Price').val() });\r\n valid = true;\r\n // /umbraco/surface/reports/CreateCheckoutSession\r\n // $(this).unbind('submit').submit();\r\n // $.ajax({\r\n // url: \"/umbraco/surface/Reports/SaveKlaviyoForm\",\r\n // type: \"POST\",\r\n // data: data,\r\n // contentType: \"application/json\",\r\n // success: function(reportLink) {\r\n // document.forms[\"report-form\"].reset();\r\n // $('div#report-form > div').slideToggle();\r\n // var a = document.createElement(\"a\");\r\n // a.href = reportLink;\r\n // var evt = document.createEvent(\"MouseEvents\");\r\n // a.setAttribute('download', '');\r\n\r\n // //the tenth parameter of initMouseEvent sets ctrl key\r\n // evt.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0,true, false, false, false, 0, null);\r\n // a.dispatchEvent(evt);\r\n // }\r\n // });\r\n }\r\n });\r\n\r\n function ValidateForm(frm) {\r\n var isvalid = true;\r\n try {\r\n Array.from(document.forms[frm].elements).forEach((input) => {\r\n if (input.hasAttribute('required') && input.value === '') {\r\n $(input).parent().removeClass('error').addClass('error');\r\n $(input).removeClass('error').addClass('error');\r\n isvalid = false;\r\n }\r\n });\r\n } catch { }\r\n if (!$('#' + frm + ' #frmterms').is(':checked')) {\r\n $('#' + frm + ' #frmterms').parent().removeClass('error').addClass('error');\r\n $('#' + frm + ' #frmterms').removeClass('error').addClass('error');\r\n isvalid = false;\r\n }\r\n\r\n return isvalid;\r\n }\r\n\r\n // Download file if payment made\r\n setTimeout(function() {\r\n if($('a#downloadfile').length > 0) {\r\n var a = document.createElement(\"a\");\r\n a.href = $('a#downloadfile').attr('href');\r\n var evt = document.createEvent(\"MouseEvents\");\r\n a.setAttribute('download', '');\r\n\r\n //the tenth parameter of initMouseEvent sets ctrl key\r\n evt.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null);\r\n a.dispatchEvent(evt);\r\n} \r\n }, 3000);\r\n}\r\n","export function newsletterForm() {\r\n var frm = 'subscribeform';\r\n var frmInp = 'emailaddress';\r\n console.log('Newsletter Loaded');\r\n\r\n var isvalid = true;\r\n $('form.subscribe').on('submit', function (ev) {\r\n ev.preventDefault();\r\n $(frm).html('').css('opacity', 0);\r\n var frm = this;\r\n var emailInput = $(this).find('#emailaddress')[0];\r\n if (ValidateField($(emailInput))) {\r\n $.when(\r\n $.ajax({\r\n url: \"/umbraco/surface/Home/SaveNewsletterSubscription\",\r\n type: \"POST\",\r\n data: { emailaddress: $(emailInput).val() },\r\n //contentType: \"application/json; charset=utf-8\",\r\n success: function (response) {\r\n $('div.cta > form').html(response);\r\n }\r\n })\r\n )\r\n .then(function () {\r\n setTimeout(() => {\r\n $(frm).css('opacity', 1);\r\n }, 500);\r\n });\r\n return;\r\n} else {\r\n $(emailInput).addClass('error');\r\n}\r\n });\r\n\r\n//$('#' + frmInp).on('focus', function () { $(this).val(''); });\r\n\r\nfunction ValidateField(ele) {\r\n if ($(ele).val() === '') {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n}\r\n}\r\n","import { gsap } from \"gsap\";\r\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\r\n\r\nexport function scrollTrigger() {\r\n const triggerSelector = \"body.contentPage .single-media\";\r\n\r\n // * Before we begin, lets check if the target exists\r\n const pageTriggerExists = !!document.querySelector(triggerSelector);\r\n console.log(\"pageTriggerExists: \", pageTriggerExists);\r\n if (!pageTriggerExists) {\r\n // * Break clause *\r\n // No trigger on the page. Exit function.\r\n console.log(\"No trigger on the page. Exit function.\");\r\n\r\n return false;\r\n } else {\r\n console.log(\"Continue with function\");\r\n }\r\n\r\n console.log(\"Animation logic kicks in from here...\");\r\n\r\n\r\n gsap.registerPlugin(ScrollTrigger);\r\n\r\n const tl = gsap.timeline({\r\n scrollTrigger: {\r\n trigger: triggerSelector,\r\n scrub: true,\r\n pin: true,\r\n start: \"50% 50%\",\r\n end: \"+=200%\"\r\n }\r\n })\r\n\r\n .from(\"body.contentPage .single-media > video-js\", {\r\n scale: .5,\r\n ease: \"none\"\r\n })\r\n\r\n .to(\".single-media > video-js\", {\r\n scale: 1,\r\n ease: \"none\"\r\n })\r\n}","export function viewportCheck(element, targetElement) {\r\n\tconst classNameToAdd = \"exceeds-viewport\";\r\n\tlet viewportHeight = window.innerHeight;\r\n\tconst classList = targetElement ? targetElement.classList : element.classList;\r\n\r\n\tfunction checkElementHeight() {\r\n\t\tconst elementHeight = element.offsetHeight;\r\n\t\tconst elName = element.id || element.tagName.toLowerCase();\r\n\t\t//console.log(\"elName\", elName);\r\n\r\n\t\t// When the element is taller than the viewport,\r\n\t\t// It adds the classname to the element passed in\r\n\t\t// Unless two were passed in, in which case it\r\n\t\t// adds a more consise classname to the optional\r\n\t\t// target element\r\n\t\tif (elementHeight > viewportHeight) {\r\n\t\t\tif (targetElement) {\r\n\t\t\t\tclassList.add(`${elName}-${classNameToAdd}`);\r\n\t\t\t} else {\r\n\t\t\t\tclassList.add(classNameToAdd);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (targetElement) {\r\n\t\t\t\tclassList.remove(`${classNameToAdd}-${elName}`);\r\n\t\t\t} else {\r\n\t\t\t\tclassList.remove(classNameToAdd);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// Initial check when the page loads\r\n\tcheckElementHeight();\r\n\r\n\t// Recalculate on window resize\r\n\twindow.addEventListener('resize', function () {\r\n\t\tviewportHeight = window.innerHeight;\r\n\t\tcheckElementHeight();\r\n\t});\r\n}\r\n"],"names":["__webpack_require__","handleImageLoad","imgParent","querySelectorAll","forEach","imageWrapper","querySelector","highResImage","handleHighResImage","shouldWeShowTheImage","classList","contains","add","setTimeout","remove","complete","addEventListener","g","globalThis","this","Function","e","window","idPrefix","playerData","addPlayer","bcVideoId","thisPlayerWrapper","elemId","setAttribute","playerHTML","accountId","playerId","innerHTML","bc","checkVideosInitiated","videoParent","videos","document","index","length","thisVid","thisVidId","getAttribute","thisVidPaused","children","play","mouse","x","y","backdrops","getElementsByClassName","followersInitialPos","followersCurrentPos","startPos","followersDistance","browserHasResized","Array","from","elem","push","thisFollower","thisWrapper","thisWrapperWidth","getBoundingClientRect","width","thisWrapperHeight","height","thisFollowerRelativePosX","thisFollowerRelativePosY","style","left","top","getPos","el","lx","ly","offsetLeft","offsetTop","offsetParent","getMouse","item","itemInner","backdropPos","matches","pageX","pageY","followMouse","inertia","inertiaOnHover","follower","followerWidth","followerHeight","wrapperWidth","wrapperHeight","cursorsCenteredPos","_defineProperties","target","props","i","descriptor","enumerable","configurable","writable","Object","defineProperty","key","MEDIA_PREFERS_REDUCED_MOTION","STATES","CREATED","MOUNTED","IDLE","MOVING","SCROLLING","DRAGGING","DESTROYED","empty","array","slice","arrayLike","start","end","prototype","call","apply","func","bind","concat","arguments","nextTick","noop","raf","requestAnimationFrame","typeOf","type","subject","isObject","isNull","isArray","isFunction","isString","isUndefined","isHTMLElement","ownerDocument","defaultView","HTMLElement","toArray","value","values","iteratee","includes","indexOf","items","toggleClass","elm","classes","name","addClass","split","append","parent","appendChild","before","nodes","ref","node","parentNode","insertBefore","selector","children2","filter","child","firstElementChild","ownKeys","keys","forOwn","object","right","reverse","source","merge","omit","removeAttribute","elms","attrs","attr","value2","String","create","tag","createElement","prop","getComputedStyle","display","display2","focus","preventScroll","hasClass","className","rect","removeChild","parseHtml","html","DOMParser","parseFromString","body","prevent","stopPropagation","preventDefault","stopImmediatePropagation","query","queryAll","removeClass","timeOf","timeStamp","unit","PROJECT_CODE","DATA_ATTRIBUTE","assert","condition","message","Error","min","Math","max","floor","ceil","abs","approximatelyEqual","epsilon","between","number","exclusive","minimum","maximum","clamp","sign","format","string","replacements","replacement","replace","pad","ids","EventBinder","listeners","forEachEvent","targets","events","events2","eventNS","fragment","callback","options","event","namespace","isEventTarget","remover","removeEventListener","unbind","listener","dispatch","detail","bubbles","CustomEvent","createEvent","initCustomEvent","dispatchEvent","destroy","data","EVENT_MOUNTED","EVENT_READY","EVENT_MOVE","EVENT_MOVED","EVENT_CLICK","EVENT_REFRESH","EVENT_UPDATED","EVENT_RESIZE","EVENT_RESIZED","EVENT_SCROLL","EVENT_SCROLLED","EVENT_DESTROY","EVENT_NAVIGATION_MOUNTED","EVENT_AUTOPLAY_PLAY","EVENT_AUTOPLAY_PAUSE","EVENT_LAZYLOAD_LOADED","EVENT_END_INDEX_CHANGED","EventInterface","Splide2","bus","createDocumentFragment","binder","on","join","off","emit","RequestInterval","interval","onInterval","onUpdate","limit","startTime","id","now","Date","rate","paused","count","update","pause","cancel","cancelAnimationFrame","resume","rewind","set","time","isPaused","ARROW","ARROW_LEFT","ARROW_RIGHT","ARROW_UP","ARROW_DOWN","TTB","ORIENTATION_MAP","X","Y","ArrowLeft","ArrowRight","ROLE","TAB_INDEX","ARIA_PREFIX","ARIA_CONTROLS","ARIA_CURRENT","ARIA_SELECTED","ARIA_LABEL","ARIA_LABELLEDBY","ARIA_HIDDEN","ARIA_ORIENTATION","ARIA_ROLEDESCRIPTION","ARIA_LIVE","ARIA_BUSY","ARIA_ATOMIC","ALL_ATTRIBUTES","CLASS_PREFIX","STATUS_CLASS_PREFIX","CLASS_ROOT","CLASS_TRACK","CLASS_LIST","CLASS_SLIDE","CLASS_CLONE","CLASS_CONTAINER","CLASS_ARROWS","CLASS_ARROW","CLASS_ARROW_PREV","CLASS_ARROW_NEXT","CLASS_PAGINATION","CLASS_PAGINATION_PAGE","CLASS_PROGRESS_BAR","CLASS_PROGRESS","CLASS_TOGGLE","CLASS_SR","CLASS_INITIALIZED","CLASS_ACTIVE","CLASS_PREV","CLASS_NEXT","CLASS_VISIBLE","CLASS_LOADING","CLASS_FOCUS_IN","CLASS_OVERFLOW","STATUS_CLASSES","CLASSES","slide","clone","arrows","arrow","prev","next","pagination","page","spinner","POINTER_DOWN_EVENTS","POINTER_MOVE_EVENTS","POINTER_UP_EVENTS","SLIDE","LOOP","FADE","INTERVAL_DATA_ATTRIBUTE","SCROLL_LISTENER_OPTIONS","passive","capture","NORMALIZATION_MAP","Spacebar","Right","Left","Up","Down","normalizeKey","KEYBOARD_EVENT","SRC_DATA_ATTRIBUTE","SRCSET_DATA_ATTRIBUTE","IMAGE_SELECTOR","TRIGGER_KEYS","ComponentConstructors","freeze","__proto__","Media","Components2","state","breakpoints","reducedMotion","queries","completely","register","options2","queryList","matchMedia","destroyed","is","direction","merged","reduce","merged2","entry","mount","refresh","opts","base","notify","getPrototypeOf","setup","isMin","mediaQuery","sort","n","m","enable","Direction","resolve","axisOnly","match","offset","toLowerCase","charAt","toUpperCase","orient","Elements","track","list","isUsingKey","_EventInterface","root","i18n","elements","slides","rootClasses","trackClasses","prefix","role","find","bar","toggle","tagName","carousel","getClasses","label","labelledby","closest","nodeType","parentElement","drag","isNavigation","Slides","_EventInterface2","_Components2$Elements","Slides2","init","forEach$1","Slide2","slideIndex","Components","updateOnMove","slideFocus","styles","isClone","container","initNavigation","controls","splides","map","splide","getAt","slideX","onMove","curr","active","isActive","self","visible","trackRect","slideRect","isVisible","hidden","focusableNodes","activeElement","updateVisibility","cloneStatus","slideLabel","useContainer","isWithin","distance","diff","Slide$1","Slide1","get","excludeClones","matcher","getIn","Controller","toIndex","hasFocus","perPage","images","img","getLength","isEnough","Layout","vertical","rootRect","overflow","_EventInterface3","_Components2$Elements2","styleSlides","cssPadding","resize","force","newRect","cssHeight","gap","autoWidth","fixedWidth","cssSlideSize","fixedHeight","autoHeight","isOverflow","padding","heightRatio","listSize","slideSize","withoutGap","Slide","getGap","totalSize","sliderSize","parseFloat","getPadding","Clones","cloneCount","clones","remount","observe","computeCloneCount","isHead","cloneNode","cloneDeep","generate","clones2","fixedSize","Move","Transition","_EventInterface4","_Components2$Layout","_Components2$Directio","_Components2$Elements3","reposition","isBusy","Scroll","jump","translate","toPosition","position","preventLoop","destination","exceededMax","getEnd","shift","loop","backwards","excess","getLimit","size","getPosition","minDistance","Infinity","trimming","trimSpace","trim","move","dest","shifted","exceededLimit","exceededMin","endIndex","slideCount","perMove","_EventInterface5","_Components2$Slides","omitEnd","isLoop","isSlide","getNext","getAdjacent","getPrev","currIndex","prevIndex","onResized","computeDestIndex","snapPage","computeMovableDestIndex","toPage","setIndex","waitForTransition","go","control","allowSameIndex","_ref","indicator","parse","scroll","duration","snap","getIndex","toDest","Arrows","created","wrapperClasses","placeholder","wrapper","enabled","createArrow","prev2","arrowPath","nextIndex","prevLabel","last","nextLabel","first","disabled","Autoplay","hovered","focused","_EventInterface6","_Components2$Elements4","autoplay","stopped","resetProgress","stop","autoToggle","pauseOnHover","pauseOnFocus","Cover","cover","cover2","src","_EventInterface8","friction","onScrolled","noConstrain","clear","noDistance","onEnd","to","t","easingFunc","pow","Drag","basePosition","baseEvent","prevBaseEvent","isFree","dragging","clickPrevented","_EventInterface9","_Components2$Directio2","exceeded","disable","onPointerDown","isTouch","isTouchEvent","target2","noDrag","button","onPointerMove","onPointerUp","save","cancelable","diffCoord","expired","diffTime","hasExceeded","isSliderDirection","thresholds","dragMinThreshold","isObj","touch","shouldStart","velocity","computeVelocity","flickPower","flickMaxPages","computeDestination","rewindByDrag","onClick","orthogonal","coordOf","getBaseEvent","changedTouches","TouchEvent","isDragging","Keyboard","_EventInterface10","keyboard","onKeydown","_disabled","LazyLoad","_EventInterface11","isSequential","lazyLoad","entries","srcset","loadNext","check","preloadPages","load","onLoad","Pagination","paginationClasses","dir","getDirection","nextPage","paginationDirection","_button","select","li","class","text","paginationKeyboard","createPagination","Sync","isParent","sync","Wheel","lastTime","onWheel","deltaY","_min","wheelMinThreshold","sleep","wheelSleep","releaseWheel","shouldPrevent","wheel","Live","live","sr","textContent","DEFAULTS","speed","easing","rewindSpeed","Fade","done","endCallback","transition","getSpeed","useScroll","_Splide","states","_o","_E","defaults","JSON","Constructor","protoProps","_proto","Extensions","_this","_C","_T","Component","component","_this$event","Splide","slice$1","apply$1","typeOf$1","isArray$1","toArray$1","ownKeys$1","min$1","forOwn$1","assign$1","autoStart","startScroll","pauseScroll","AutoScroll","throttledUpdateArrows","busy","currPosition","autoScrollOptions","autoScroll","useToggleButton","readyState","updateButton","updateIndex","PROJECT_CODE$1","CLASS_VIDEO","CLASS_VIDEO_WRAPPER","CLASS_VIDEO_PLAY_BUTTON","MODIFIER_HAS_VIDEO","hideControls","mute","volume","EVENT_VIDEO_CLICK","AbstractVideoPlayer","constructor","videoId","onPlay","onPause","onEnded","onPlayerReady","onError","console","error","player","createPlayer","playVideo","pauseVideo","isPending","aborted","isNode","toString","getMethodName","substr","isVimeoUrl","url","test","getVimeoUrl","oEmbedParameters","undefined","idOrUrl","isNaN","isFinite","TypeError","arrayIndexOfSupport","postMessageSupport","postMessage","commonjsGlobal","WeakMap","hasOwnProperty","hasDefine","rand","checkInstance","methodName","random","substring","_id","fn","module","npo_src","context","definition","builtInProp","cycle","scheduling_queue","ToString","timer","setImmediate","obj","val","config","err","schedule","drain","isThenable","o","_then","o_type","then","chain","notifyIsolated","success","failure","cb","ret","reject","msg","promise","triggered","def","def_wrapper","MakeDefWrapper","iteratePromises","arr","resolver","rejecter","idx","MakeDef","Promise","executor","__NPO__","Item","f","PromisePrototype","len","msgs","exports","callbackMap","storeCallback","playerCallbacks","element","getCallbacks","removeCallback","splice","parseMessageData","warn","method","params","contentWindow","ieVersion","navigator","userAgent","stringify","origin","getOEmbedParameters","param","createEmbed","div","firstChild","getOEmbedData","videoUrl","encodeURIComponent","xhr","XDomainRequest","XMLHttpRequest","open","onload","status","json","responseText","domain_status_code","onerror","send","playerMap","readyMap","screenfull","Player$1","Player","instance","_classCallCheck","jQuery","getElementById","Boolean","isDomElement","nodeName","iframe","has","_window","readyPromise","_onMessage","isReadyEvent","isPingResponse","callbacks","shiftCallbacks","processData","oldElement","newElement","_originalElement","delete","catch","isEnabled","exitFullscreen","exit","fullscreenchangeHandler","isFullscreen","ready","_this2","args","_this3","_this4","eventName","callMethod","language","kind","request","_this5","autopause","camera","color","currentTime","muted","playbackRate","quality","fnMap","l","eventNameMap","fullscreenchange","fullscreenerror","onFullScreenEntered","returnPromise","documentElement","requestFullscreen","onFullScreenExit","defineProperties","fullscreenElement","fullscreenEnabled","initializeScreenfull","handleError","initializeEmbeds","VimeoPlayerResizeEmbeds_","iframes","paddingBottom","bottom","resizeEmbeds","VimeoSeoMetadataAppended","isValidMessageSource","location","href","initAppendVideoMetadata","YOUTUBE_API_SRC","YouTubeIframeAPILoader","YT","attachCallback","shouldLoad","protocol","head","some","script","oldCallback","onYouTubeIframeAPIReady","PlayerUI","show","listen","video","playButton","toggleButton","toggleWrapper","getPlaceholder","hide","VIDEO_PLAYER_MAP","super","parseVideoId","onAPIReady","playerOptions","host","playerVars","iv_load_policy","playlist","rel","youtube","onReady","onStateChange","onPlayerStateChange","setVolume","PLAYING","PAUSED","ENDED","PlayerState","parseUrl","search","predicate","query2","vimeoOptions","vimeo","getMuted","htmlVideo","ui","disableOverlayUI","onPlayed","onPaused","onVideoClick","onAutoplayRequested","togglePlaying","Video","players","cloneSplides","thisMarquee","viewportWidth","innerWidth","thisTrack","thisTrackWidth","originalChildren","cloneIndex","origChildIndex","slideVisible","LoadReports","firsttime","$","ajax","tags","skipItems","takeItems","reports","GetParameters","urlParams","onpopstate","pl","decode","s","decodeURIComponent","exec","_assertThisInitialized","ReferenceError","_inheritsLoose","subClass","superClass","_suppressOverwrites","_reverting","_context","_globalTimeline","_win","_coreInitted","_doc","_coreReady","_lastRenderedFrame","_quickTween","_tickerActive","c","n1","n2","n3","easeOut","_config","autoSleep","force3D","nullTargetWarn","units","lineHeight","_defaults","overwrite","delay","_bigNum","_tinyNum","_2PI","PI","_HALF_PI","_gsID","_sqrt","sqrt","_cos","cos","_sin","sin","_isString","_isFunction","_isNumber","_isUndefined","_isObject","_isNotFalse","_windowExists","_isFuncOrString","_isTypedArray","ArrayBuffer","isView","_isArray","_strictNumExp","_numExp","_numWithUnitExp","_complexStringNumExp","_relExp","_delimitedValueExp","_unitExp","_globals","_installScope","_install","scope","_merge","gsap","_missingPlugin","property","_warn","suppress","_addGlobal","_emptyFunc","_startAtRevertConfig","suppressEvents","isStart","kill","_revertConfigNoKill","_revertConfig","_reservedProps","_lazyTweens","_lazyLookup","_plugins","_effects","_nextGCFrame","_harnessPlugins","_callbackNames","_harness","harnessPlugin","_gsap","harness","targetTest","GSCache","_getCache","_getProperty","v","_forEachName","names","_round","round","_roundPrecise","_parseRelative","operator","_arrayContainsAny","toSearch","toFind","_lazyRender","tween","a","_lazy","render","_lazySafeRender","animation","_initted","_startAt","_numericIfPossible","_passThrough","p","_setDefaults","toMerge","_mergeDeep","_copyExcluding","excluding","copy","_inheritDefaults","vars","excludeDuration","keyframes","inherit","_dp","_addLinkedListItem","firstProp","lastProp","sortBy","_prev","_next","_removeLinkedListItem","_removeFromParent","onlyIfParentHasAutoRemove","autoRemoveChildren","_act","_uncache","_end","_dur","_start","_dirty","_rewindStartAt","totalTime","revert","immediateRender","autoRevert","_hasNoPausedAncestors","_ts","_elapsedCycleDuration","_repeat","_animationCycle","_tTime","_rDelay","tTime","cycleDuration","whole","_parentToChildTotalTime","parentTime","totalDuration","_tDur","_setEnd","_rts","_alignPlayhead","smoothChildTiming","_time","_postAddChecks","timeline","rawTime","_clamp","_zTime","_addToTimeline","skipChecks","_parsePosition","_delay","timeScale","_sort","_isFromOrFromStart","_recent","_scrollTrigger","trigger","ScrollTrigger","_attemptInitTween","_initTween","_pt","lazy","_ticker","frame","_parentPlayheadIsBeforeStart","_lock","_ref2","_setDuration","skipUncache","leavePlayhead","repeat","dur","totalProgress","_onUpdateTotalDuration","Timeline","_zeroPosition","endTime","percentAnimation","isPercent","labels","recent","clippedDuration","_createTweenType","irVars","isLegacy","varsIndex","runBackwards","startAt","Tween","_conditionalReturn","getUnit","_slice","_isArrayLike","nonEmpty","leaveStrings","_wake","ar","accumulator","_accumulator","_flatten","current","nativeElement","shuffle","distribute","each","ease","_parseEase","cache","isDecimal","ratios","axis","ratioX","ratioY","center","edges","originX","originY","d","j","wrapAt","distances","grid","amount","b","u","_invertEase","_roundModifier","raw","snapTo","radius","is2D","increment","dx","dy","roundingIncrement","returnFunction","_wrapArray","_replaceRandom","nums","mapRange","inMin","inMax","outMin","outMax","inRange","outRange","_getLabelInDirection","fromTime","backward","_callback","executeLazyFirst","result","prevContext","_ctx","callbackScope","_interrupt","scrollTrigger","progress","_registerPluginQueue","_createPlugin","isFunc","Plugin","_props","instanceDefaults","_renderPropTweens","_addPropTween","_killPropTweensOf","modifier","_addPluginModifier","rawVars","statics","getSetter","_getSetter","aliases","PropTween","_255","_colorLookup","aqua","lime","silver","black","maroon","teal","blue","navy","white","olive","yellow","orange","gray","purple","green","red","pink","cyan","transparent","_hue","h","m1","m2","splitColor","toHSL","forceAlpha","r","wasHSL","parseInt","Number","_colorOrderData","_colorExp","_formatColors","orderMatchData","shell","colors","RegExp","_hslExp","_colorStringFilter","combined","lastIndex","_req","_raf","_self","_delta","_i","_getTime","_lagThreshold","_adjustedLag","_startTime","_lastUpdate","_gap","_nextTime","_listeners","_tick","overlap","elapsed","manual","tick","deltaRatio","fps","wake","gsapVersions","version","GreenSockGlobals","clearTimeout","lagSmoothing","threshold","adjustedLag","_fps","once","prioritize","_easeMap","_customEaseExp","_quotesExp","_parseObjectInString","parsedVal","lastIndexOf","_propagateYoyoEase","isYoyo","_first","yoyoEase","_yoyo","_ease","_yEase","defaultEase","close","nested","_CE","_configEaseFromString","_insertEase","easeIn","easeInOut","lowercaseName","_easeInOutFromOut","_configElastic","amplitude","period","p1","p2","p3","asin","_configBack","overshoot","power","Linear","easeNone","none","SteppedEase","steps","immediateStart","Animation","repeatDelay","yoyo","_totalTime","_ptLookup","_pTime","ratio","iteration","_ps","_recacheAncestors","includeRepeats","wrapRepeats","prevIsReverting","globalTime","_sat","seek","restart","includeDelay","reversed","atTime","invalidate","eventCallback","_onUpdate","onFulfilled","_resolve","_prom","_Animation","sortChildren","_proto2","fromTo","fromVars","toVars","delayedCall","staggerTo","stagger","onCompleteAll","onCompleteAllParams","onComplete","onCompleteParams","staggerFrom","staggerFromTo","prevPaused","pauseTween","prevStart","prevIteration","prevTime","tDur","crossingStart","rewinding","doesWrap","repeatRefresh","onRepeat","_hasPause","_forcing","_last","_findNextPauseTween","adjustedTime","addLabel","getChildren","tweens","timelines","ignoreBeforeTime","getById","animations","removeLabel","killTweensOf","_totalTime2","addPause","removePause","onlyActive","getTweensOf","_overwritingTween","parsedTargets","isGlobalTime","_targets","tweenTo","initted","tl","_vars","_onStart","onStart","onStartParams","tweenFromTo","fromPosition","afterTime","previousLabel","beforeTime","currentLabel","shiftChildren","adjustLabels","soft","includeLabels","updateRoot","_forceAllPropTweens","_addComplexStringPropTween","setter","stringFilter","funcParam","startNums","endNum","chunk","startNum","hasRandom","pt","_renderComplexString","matchIndex","fp","optional","currentValue","parsedStart","_setterFuncWithParam","_setterFunc","_setterPlain","_renderBoolean","_renderPlain","_checkPlugin","plugin","ptLookup","_parseFuncOrString","_processVars","priority","cleanVars","hasPriority","gsData","harnessVars","overwritten","onUpdateParams","prevStartAt","fullTargets","autoOverwrite","_overwrite","_from","_ptCache","_op","_sortPropTweensByPriority","_onInit","_parseKeyframe","allProps","easeEach","_staggerTweenProps","_staggerPropsToSkip","_Animation2","skipInherit","curTarget","staggerFunc","staggerVarsToMerge","_this3$vars","kf","_proto3","isNegative","prevRatio","_renderZeroDurationTween","resetTo","startIsRelative","rootPT","lookup","ptCache","_updatePropTweens","overwrittenProps","curLookup","curOverwriteProps","killingTargets","propTweenLookup","firstPT","a1","a2","_arraysMatch","propertyAliases","_addAliasesToVars","onReverseComplete","onReverseCompleteParams","_setterAttribute","hasNonDependentRemaining","op","dep","_setterWithModifier","mSet","mt","pt2","pr","change","renderer","TweenMax","TweenLite","TimelineLite","TimelineMax","_media","_emptyArray","_lastMediaTime","_contextID","_dispatch","_onMediaChange","anyMatch","toggled","conditions","onMatch","Context","_r","isReverted","_proto5","prevSelector","ignore","getTweens","MatchMedia","contexts","_proto6","mq","cond","addListener","registerPlugin","_len2","_key2","getProperty","uncache","getter","quickSetter","setters","quickTo","_merge2","isTweening","registerEffect","_ref3","effect","plugins","extendTimeline","pluginName","registerEase","parseEase","exportRoot","includeDelayedCalls","matchMediaRefresh","found","utils","wrap","range","wrapYoyo","total","normalize","pipe","_len","functions","_key","unitize","interpolate","mutate","interpolators","il","master","install","effects","ticker","globalTimeline","core","globals","getCache","reverting","toAdd","suppressOverwrites","_getPluginPropTween","_buildModifierPlugin","temp","modifiers","_addModifiers","Power0","Power1","Power2","Power3","Power4","Quad","Cubic","Quart","Quint","Strong","Elastic","Back","Bounce","Sine","Expo","Circ","_docElement","_pluginInitted","_tempDiv","_recentSetterPlugin","_supports3D","_transformProps","_RAD2DEG","_DEG2RAD","_atan2","atan2","_capsExp","_horizontalExp","_complexExp","_propertyAliases","autoAlpha","scale","alpha","_renderCSSProp","_renderPropWithEnd","_renderCSSPropWithBeginning","_renderRoundedCSSProp","_renderNonTweeningValue","_renderNonTweeningValueOnlyAtEnd","_setterCSSStyle","_setterCSSProp","setProperty","_setterTransform","_setterScale","scaleX","scaleY","_setterScaleWithRender","renderTransform","_setterTransformWithRender","_transformProp","_transformOriginProp","_saveStyle","isNotCSS","tfm","transform","_get","svg","svgo","_removeIndependentTransforms","removeProperty","_revertStyle","_getStyleSaver","properties","saver","_createElement","ns","createElementNS","_getComputedProperty","skipPrefixFallback","cs","getPropertyValue","_checkPropPrefix","_prefixes","preferPrefix","_initCore","cssText","_getBBoxHack","swapIfPossible","bbox","ownerSVGElement","oldParent","oldSibling","nextSibling","oldCSS","getBBox","_gsapBBox","_getAttributeFallbacks","attributesArray","hasAttribute","_getBBox","bounds","_isSVG","getCTM","_removeProperty","_addNonTweeningPT","beginning","onlySetAtEnd","_nonConvertibleUnits","deg","rad","turn","_nonStandardLayouts","flex","_convertToUnit","px","isSVG","curValue","curUnit","horizontal","isRootSVG","measureProperty","toPixels","toPercent","_parseTransform","_firstTwoOnly","zOrigin","_specialProps","_tweenComplexCSSString","startValues","startValue","endValue","endUnit","startUnit","_keywordToPercent","_renderClearProps","clearTransforms","clearProps","_identity2DMatrix","_rotationalProperties","_isNullTransform","_getComputedTransformMatrixAsArray","matrixString","_getMatrix","force2D","addedToDOM","matrix","baseVal","consolidate","nextElementSibling","_applySVGOrigin","originIsAbsolute","smooth","matrixArray","pluginToAddPropTweensTo","determinant","xOriginOld","xOrigin","yOriginOld","yOrigin","xOffsetOld","xOffset","yOffsetOld","yOffset","tx","ty","originSplit","z","rotation","rotationX","rotationY","skewX","skewY","perspective","angle","a12","a22","t1","t2","t3","a13","a23","a33","a42","a43","a32","invertedScaleX","rotate","forceCSS","xPercent","offsetWidth","yPercent","offsetHeight","transformPerspective","_renderSVGTransforms","_renderCSSTransforms","_renderNon3DTransforms","_addPxTranslate","_zeroDeg","_zeroPx","_endParenthesis","transforms","use3D","a11","a21","tan","_addRotationalPropTween","cap","finalValue","_assign","_addRawTransformPTs","endCache","startCache","side","all","CSSPlugin","specialProp","relative","isTransformRelated","transformPropTween","inlineProps","visibility","parseTransform","smoothOrigin","autoRound","checkPrefix","getStyleSaver","positionAndScale","gsapWithCSS","_docEl","_body","_isTouch","_pointerType","_root","_normalizer","_eventTypes","_getGSAP","_startup","_observers","_scrollers","_proxies","_bridge","_getProxyProp","_isViewport","_addListener","nonPassive","_removeListener","_scrollLeft","_scrollTop","_onScroll","isPressed","_scrollCacheFunc","doNotCache","cachingFunc","history","scrollRestoration","isNormalizing","iOS","cacheID","_horizontal","os","os2","d2","sc","scrollTo","_vertical","pageXOffset","pageYOffset","_getTarget","_getScrollFunc","scrollingElement","_getVelocityProp","minTimeRefresh","useDelta","v1","v2","dropToZeroTime","reset","getVelocity","latestValue","tOld","vOld","_getEvent","_gsapAllow","_getAbsoluteMax","_setScrollTrigger","scrollers","proxies","bridge","Observer","maxTouchPoints","msMaxTouchPoints","eventTypes","tolerance","dragMinimum","debounce","onStop","onStopDelay","wheelSpeed","onDragStart","onDragEnd","onDrag","onPress","onRelease","onRight","onLeft","onUp","onDown","onChangeX","onChangeY","onChange","onToggleX","onToggleY","onHover","onHoverEnd","ignoreCheck","isNormalizer","onGestureStart","onGestureEnd","onEnable","onDisable","scrollSpeed","allowClicks","lockAxis","onLockAxis","onStopDelayedCall","dragged","moved","wheeled","locked","prevDeltaX","prevDeltaY","scrollFuncX","scrollFuncY","scrollX","scrollY","limitToTouch","isViewport","ownerDoc","deltaX","onClickTime","clickCapture","_ignoreCheck","isPointerOrTouch","pointerType","changedX","changedY","onDelta","_vx","_vy","onTouchOrPointerDelta","_onDrag","clientX","clientY","startX","startY","_onPress","_onRelease","isTrackingDrag","wasDragging","eventData","defaultPrevented","click","syntheticEvent","initMouseEvent","screenX","screenY","isGesturing","_onGestureStart","touches","_onGestureEnd","onScroll","_onWheel","multiplier","deltaMode","innerHeight","_onMove","_onHover","_onHoverEnd","_onClick","_dc","getAll","_resizeDelay","_toArray","_time2","_syncInterval","_refreshing","_pointerIsDown","_prevWidth","_prevHeight","_autoRefresh","_ignoreResize","_ignoreMobileResize","_baseScreenHeight","_baseScreenWidth","_fixIOSBug","_scrollRestoration","_div100vh","_100vh","_limitCallbacks","_rafID","_refreshingAll","_queueRefreshID","_primary","_time1","_lastScrollTime","_enabled","_parseClamp","_keepClamp","_rafBugFix","_pointerDownHandler","_pointerUpHandler","_getViewportDimension","dimensionProperty","_getBoundsFunc","_winOffsets","_getBounds","_maxScroll","_iterateAutoRefresh","_endAnimation","callbackAnimation","_abs","_left","_right","_bottom","_width","_height","_Right","_Left","_Top","_Bottom","_padding","_margin","_Width","_Height","_px","_getComputedStyle","withoutTransforms","_getSize","_getLabelRatioArray","_snapDirectional","snapIncrementOrArray","snapped","_multiListener","types","_wheelListener","scrollFunc","wheelHandler","_markerDefaults","startColor","endColor","indent","fontSize","fontWeight","toggleActions","anticipatePin","_keywords","_offsetToPx","eqIndex","_createMarker","_ref4","matchWidthEl","containerAnimation","useFixedPosition","isScroller","css","_isStart","innerText","_offset","_positionMarker","marker","flipped","oppositeSide","_isFlipped","_triggers","_ids","_sync","_updateAll","clientWidth","_setBaseDimensions","_onResize","webkitFullscreenElement","_softRefresh","_refreshAll","_savedStyles","_revertRecorded","media","_revertAll","_clearScrollMemory","rec","_refreshID","_refresh100vh","skipRevert","isRefreshing","refreshInits","scrollBehavior","_subPinOffset","pin","original","adjustPinSpacing","scroller","_dir","_endClamp","setPositions","onRefresh","_lastScroll","_direction","isUpdating","recordVelocity","_propNamesToCopy","_stateProps","_swapPinIn","spacer","spacerState","swappedIn","spacerStyle","pinStyle","flexBasis","boxSizing","_setState","_getState","scrollerSize","markerScroller","scrollerBounds","borderWidth","scrollerMax","clampZeroProp","localOffset","globalOffset","offsets","_caScrollDist","_prefixExp","_reparent","_stOrig","_interruptionTracker","getValueFunc","initialValue","onInterrupt","last1","last2","_shiftMarker","_getTweenCreator","getScroll","getTween","change1","change2","checkForInterruption","pinCache","snapFunc","scroll1","scroll2","markerStart","markerEnd","markerStartTrigger","markerEndTrigger","markerVars","executingOnRefresh","pinOriginalState","pinActiveState","pinState","pinGetter","pinSetter","pinStart","pinChange","spacingStart","markerStartSetter","pinMoves","markerEndSetter","snap1","snap2","scrubTween","scrubSmooth","snapDurClamp","snapDelayedCall","prevScroll","prevAnimProgress","caMarkerSetter","customRevertReturn","onToggle","scrub","pinSpacing","invalidateOnRefresh","onScrubComplete","onSnapComplete","pinReparent","pinSpacer","fastScrollEnd","preventOverlaps","isToggle","scrollerCache","pinType","onEnter","onLeave","onEnterBack","onLeaveBack","markers","onRefreshInit","getScrollerSize","_getSizeFunc","getScrollerOffsets","_getOffsetsFunc","lastSnap","lastRefresh","prevProgress","_startClamp","refreshPriority","tweenScroll","scrubDuration","_getClosestLabel","st","directional","refreshedRecently","naturalEnd","endScroll","_snap","_onInterrupt","_onComplete","stRevert","spacerIsNative","content","oldOnUpdate","oldParams","previous","prevRefreshing","_swapPinOut","pinOffset","isVertical","override","curTrigger","curPin","oppositeScroll","revertedPins","forcedOverflow","markerStartOffset","markerEndOffset","isFirstRefresh","otherPinOffset","parsedEnd","parsedEndTrigger","endTrigger","pinnedContainer","triggerIndex","unshift","_pinPush","omitOffsets","_copyState","_pinOffset","endAnimation","labelToScroll","getTrailing","forceFake","toggleState","action","stateChanged","isAtMax","isTakingAction","clipped","newStart","newEnd","keepClamp","_change","allowAnimation","onKill","updateFunc","_queueRefreshAll","clearInterval","mm","bodyStyle","border","borderTopStyle","AnimationProto","setInterval","w","limitCallbacks","ms","syncInterval","ignoreMobileResize","autoRefreshEvents","scrollerProxy","clearMatchMedia","isInViewport","positionInViewport","referencePoint","killAll","allowListeners","saveStyles","safe","clearScrollMemory","maxScroll","getScrollFunc","isScrolling","snapDirectional","batch","varsCopy","batchMax","proxyCallback","triggers","_inputIsFocused","_clampScrollAndGetDurationMultiplier","_allowNativePanning","touchAction","_overflow","auto","_nestedScroll","_ref5","_isScrollT","scrollHeight","clientHeight","scrollWidth","overflowY","overflowX","_isScroll","_inputObserver","inputs","_captureInputs","_inputExp","isInput","normalizeScroll","normalizer","maxY","lastRefreshID","skipTouchMove","startScrollX","startScrollY","_vars2","normalizeScrollX","momentum","allowNestedScroll","smoother","ScrollSmoother","smootherInstance","initialScale","visualViewport","outerWidth","wheelRefresh","resolveMomentumDuration","inputObserver","resumeTouchMove","scrollClampX","scrollClampY","updateClamps","removeContentOffset","onResize","ignoreDrag","prevScale","currentScroll","velocityX","velocityY","xArray","yArray","yClamped","_getScrollNormalizer","ss","mainHeader","main","psuedoFooter","projectsGrid","componentsList","viewportTop","scrollTop","viewportBottom","performScrollActions","scrollElem","elementRect","elementTop","elementBottom","vidParent","videoWrapper","handleVideo","observeScroll","talkieVideos","observer","IntersectionObserver","intersectionRatio","enableVideoAutoplay","subscribeComponent","switchView","currentViewClass","nextViewClass","validateCurrentView","viewClass","valid","thisContainer","valMsgArea","field","checked","formData","fetch","headers","response","debugString","log","handleSubscribe","title","when","marquees","projSliders","roundabouts","initSliders","postData","categories","rows","InitProjectSlider","videojs","getAllPlayers","ele","newqsParam","chkBx","pushState","pathname","reportsPage","ValidateForm","frm","isvalid","forms","input","__RequestVerificationToken","EmailAddress","FullName","Company","Position","ReportPage","PageId","contentType","reportLink","slideToggle","evt","ReportType","reportDownloadFormHandler","ev","emailInput","emailaddress","mousemove","triggerSelector","pageTriggerExists","targetElement","classNameToAdd","viewportHeight","checkElementHeight","elementHeight","elName","viewportCheck"],"sourceRoot":""}