{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./utils/isMobile.js","webpack:///./utils/debounce.js","webpack:///./utils/wrapInner.js","webpack:///./utils/wrap.js","webpack:///./utils/slide.js","webpack:///./utils/isTablet.js","webpack:///./utils/isTouchDevice.js","webpack:///./utils/addActiveLinkClass.js","webpack:///./utils/isSafari.js","webpack:///../node_modules/@uvocore-front/utils/dist/index.js","webpack:///./utils/customEvent.js","webpack:///./components/Header/main/hoverNavigation.js","webpack:///./components/Header/main/index.js","webpack:///./components/ImageListWithSlider/index.js","webpack:///./components/PerfomanceSlider/index.js","webpack:///./components/Footer/index.js","webpack:///./components/Calculator/short/CalculatorShort.js","webpack:///./components/Slider/index.js","webpack:///../node_modules/hammerjs/hammer.js","webpack:///./components/Calculator/default/Calculator.js","webpack:///./components/CustomCarousel/index.js","webpack:///./sections/sample-section/index.js","webpack:///./sections/testimonials-section/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","isMobile","window","innerWidth","debounce","func","wait","immediate","args","timeout","callNow","clearTimeout","setTimeout","apply","wrapInner","parent","wrapper","document","createElement","appendChild","firstChild","wrap","el","parentNode","insertBefore","slideUp","block","style","height","slideDown","children","offsetHeight","query","prefixes","isTablet","addActiveLinkClass","anchorSelector","activeClass","itemsClass","anchors","querySelectorAll","current","location","pathname","length","getAttribute","classList","add","isSafari","navigator","vendor","indexOf","userAgent","isTouchDevice","split","DocumentTouch","join","matchMedia","matches","e","default","iterator","constructor","deployHash","arguments","getElementsByTagName","Promise","u","concat","querySelector","f","async","defer","a","readyState","test","onload","onreadystatechange","src","innerHTML","element","marginValue","thresholdValue","callback","rootMargin","threshold","IntersectionObserver","forEach","isIntersecting","unobserve","target","slice","observe","widgetLink","loader","customLoader","insertLoaderTo","loaderPosition","fn","then","catch","Error","__WMS__","utils","loadScripts","addLoader","observeElement","getWidget","CustomEvent","event","params","bubbles","cancelable","detail","undefined","evt","createEvent","initCustomEvent","Event","hoverNavigationLinks","navigationCursor","nav","isVisible","link","contains","remove","left","getBoundingClientRect","top","opacity","transform","addEventListener","Array","this","ToggleNav","header","button","userProfileBtn","state","isOpen","sel","showEvent","show","dispatchEvent","hide","imagesColumnsItems","item","selector","Carousel","itemWidth","margin","isSetNavButtonsPosition","responsive","1024","inactive","PerfomanceSlider","getResponsiveProps","initialized","preInit","generateNav","attachSwipeHandlers","generateDots","setStageWidth","changeSlide","setStageHeight","init","getWindowWidth","prevBtn","offsetWidth","nextBtn","right","maxHeight","slideItems","hiddenBlock","stage","index","pageHiddenBlock","setAttribute","display","findSlide","prevPrevSlide","prevSlide","nextSlide","nextNextSlide","Slider","isPageConfig","pageConfig","keys","pagePaperType","calculator","calcOptions","ID","calculatorType","format","options","deafault","academicLevelDefault","paperTypesDefault","Calc","activeSlide","isSetStageWidth","isHideNav","viewport","run","refresh","stageWrapper","slideItemWrapper","direction","dots","move","hideNav","prev","next","setNavButtonsPosition","template","repeat","dotItems","hammer","Hammer","on","deltaX","swipeFunc","setItemsWidth","deactivate","onRefresh","destroy","width","marginRight","calculateStageWidth","breakPoints","breakPoint","parseInt","push","setDefaultState","prop","exportName","assign","VENDOR_PREFIXES","TEST_ELEMENT","round","Math","abs","now","Date","setTimeoutContext","context","bindFn","invokeArrayArg","arg","isArray","each","obj","deprecate","method","message","deprecationMessage","stack","replace","log","console","warn","TypeError","output","source","nextKey","extend","dest","merge","inherit","child","base","properties","childP","baseP","_super","boolOrFn","val","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","type","removeEventListeners","removeEventListener","hasParent","node","inStr","str","find","trim","inArray","findByKey","toArray","uniqueArray","sort","results","values","b","prefixed","prefix","camelProp","toUpperCase","_uniqueId","getWindowForElement","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","PROPS_XY","PROPS_CLIENT_XY","Input","manager","self","inputTarget","domHandler","ev","enable","inputHandler","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","x","y","deltaY","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","start","end","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","last","lastInterval","v","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","clientY","p1","p2","props","sqrt","atan2","PI","evEl","evTarget","evWin","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","pressed","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","TOUCH_INPUT_MAP","TouchInput","targetIds","getTouches","allTouches","identifier","targetTouches","changedTargetTouches","filter","touch","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","set","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","DIRECTION_LEFT","DIRECTION_UP","preventSrc","Recognizer","defaults","id","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","preset","Manager","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","DIRECTION_HORIZONTAL","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","toggleCssProps","stop","force","stopped","curRecognizer","existing","events","off","data","gestureEvent","initEvent","gesture","triggerDomEvent","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","deadlinesDefault","delta","calcPaddingToCenter","webkitTransform","hasAttribute","removeAttribute","initSamplesSlider","testimonialsSlider"],"mappings":"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","file":"js/seo.min.js","sourcesContent":[" \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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 168);\n","/**\n *\n * @returns {boolean}\n */\nconst isMobile = () => window.innerWidth < 1024;\n\nexport default isMobile();\n","const debounce = (func, wait, immediate, ...args) => {\n let timeout;\n return () => {\n const context = this;\n const later = () => {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n};\n\nexport default debounce;\n","/* eslint-disable no-param-reassign */\nconst wrapInner = (parent, wrapper) => {\n if (typeof wrapper === 'string') wrapper = document.createElement(wrapper);\n\n parent.appendChild(wrapper);\n\n while (parent.firstChild !== wrapper) wrapper.appendChild(parent.firstChild);\n};\n\nexport default wrapInner;\n","const wrap = (el, wrapper) => {\n el.parentNode.insertBefore(wrapper, el);\n wrapper.appendChild(el);\n};\n\nexport default wrap;\n","/* eslint-disable no-param-reassign */\n\nexport function slideUp(block) {\n block.style.height = '0';\n}\nexport function slideDown(block) {\n block.style.height = `${block.children[0].offsetHeight}px`;\n}\n","/**\n *\n * @returns {boolean}\n */\nconst isTablet = () => window.innerWidth >= 768;\n\nexport default isTablet();\n","const isTouchDevice = () => {\n const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\n const mq = (query) => window.matchMedia(query).matches;\n\n if (('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) { /* eslint-disable-line */\n return true;\n }\n\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\n // https://git.io/vznFH\n const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\n return mq(query);\n};\n\nexport default isTouchDevice();\n","/**\n *\n * @param anchorSelector\n * @param activeClass\n * @param itemClass - items witch potentially could have activeClass\n */\nconst addActiveLinkClass = ({\n anchorSelector = 'a',\n activeClass = 'active',\n itemsClass,\n}) => {\n const anchors = document.querySelectorAll(anchorSelector);\n if (!anchors) return;\n\n const current = window.location.pathname;\n\n for (let i = 0; i < anchors.length; i += 1) {\n if (anchors[i].getAttribute('href') === current) {\n if (itemsClass) {\n const items = document.querySelectorAll(itemsClass);\n items[i].classList.add(activeClass);\n } else {\n anchors[i].classList.add(activeClass);\n }\n }\n }\n};\n\nexport default addActiveLinkClass;\n","/**\n *\n * @returns {boolean}\n */\nconst isSafari = () => navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && navigator.userAgent.indexOf('CriOS') === -1 && navigator.userAgent.indexOf('FxiOS') === -1;\n\nexport default isSafari();\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.utils=t():e.utils=t()}(window,(function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=1)}([function(e,t){function n(e){return(n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function o(t){return\"function\"==typeof Symbol&&\"symbol\"===n(Symbol.iterator)?e.exports=o=function(e){return n(e)}:e.exports=o=function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":n(e)},o(t)}e.exports=o},function(e,t,n){e.exports=n(3)},function(e,t,n){},function(e,t,n){\"use strict\";n.r(t);var o=n(0),r=n.n(o),i=window.deployHash&&\"string\"==typeof window.deployHash&&\"\"!==window.deployHash?window.deployHash:\"\",c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document.getElementsByTagName(\"head\")[0],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];return new Promise((function(r,c){if(e&&\"string\"==typeof e){var u=i?\"?v=\".concat(i):\"\",d=e+u;if(document.querySelector('script[src=\"'.concat(d,'\"]')))r();else{var f=document.createElement(\"script\");f.async=n,f.defer=o;var a=function(e,t){(t||!f.readyState||/loaded|complete/.test(f.readyState))&&(f.onload=null,f.onreadystatechange=null,f=void 0,t?c():r())};f.onload=a,f.onreadystatechange=a,f.src=d,t.appendChild(f)}}}))},u=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"center\";e&&\"string\"==typeof e&&(document.querySelector(\"\".concat(e)).innerHTML='\\n
\\n
\\n
\\n '))},d=(n(2),u),f=function(e){var t=e.element,n=e.marginValue,o=void 0===n?400:n,r=e.thresholdValue,i=void 0===r?0:r,c=e.callback,u=void 0===c?function(){}:c;if(t&&\"string\"==typeof t){var d=document.querySelectorAll(t),f={rootMargin:\"\".concat(o,\"px 0px \").concat(o,\"px 0px\"),threshold:i},a=new IntersectionObserver((function(e,t){e.forEach((function(e){e.isIntersecting&&(t.unobserve(e.target),u(e.target))}))}),f);d&&[].slice.call(d).forEach((function(e){a.observe(e)}))}},a=function(e){var t=e.widgetLink,n=e.loader,o=void 0===n||n,r=e.customLoader,i=void 0===r?void 0:r,u=e.insertLoaderTo,f=void 0===u?void 0:u,a=e.loaderPosition,l=void 0===a?\"center\":a,s=e.fn,p=void 0===s?function(){}:s;t&&\"string\"==typeof t&&c(t).then((function(){o&&i&&\"function\"==typeof i?i(f,l):o&&d(f,l),p()})).catch((function(e){throw new Error(e)}))};n.d(t,\"loadScripts\",(function(){return c})),n.d(t,\"addLoader\",(function(){return d})),n.d(t,\"observeElement\",(function(){return f})),n.d(t,\"getWidget\",(function(){return a})),window.__WMS__=\"object\"===(\"undefined\"==typeof __WMS__?\"undefined\":r()(__WMS__))?__WMS__:{},window.__WMS__.utils={loadScripts:c,addLoader:d,observeElement:f,getWidget:a}}])}));\n//# sourceMappingURL=index.js.map","// eslint-disable-next-line consistent-return\n(() => {\n // If not IE\n if (typeof window.CustomEvent === 'function') return false;\n const CustomEvent = (event, params) => {\n // eslint-disable-next-line no-param-reassign\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n const evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent;\n})();\n","/* eslint-disable no-param-reassign, func-names */\n\nimport { isMobile } from '../../../utils';\n\nfunction hoverNavigationLinks(navigationCursor, nav, el, isVisible) {\n nav.forEach((link) => {\n if (link.parentNode.classList.contains('is-hovered')) {\n link.parentNode.classList.remove('is-hovered');\n }\n });\n el.parentNode.classList.add('is-hovered');\n const { left } = el.getBoundingClientRect();\n navigationCursor.style.left = `${left}px`;\n navigationCursor.style.top = '38px';\n navigationCursor.style.opacity = isVisible ? 1 : 0;\n navigationCursor.style.transform = 'translate(-22px, 0)';\n}\n\nwindow.addEventListener('load', () => {\n const navigationCursor = document.querySelector('.header__menu__arrow');\n const nav = Array.prototype.slice.call(document.querySelectorAll('.menu-list__item__link'));\n\n if (document.querySelector('.header .header__menu') && !isMobile) {\n nav.forEach((link) => {\n link.addEventListener('mouseenter', function () {\n hoverNavigationLinks(navigationCursor, nav, this, true);\n });\n\n link.addEventListener('mouseleave', function () {\n hoverNavigationLinks(navigationCursor, nav, this, false);\n });\n });\n\n hoverNavigationLinks(navigationCursor, nav, nav[0], false);\n }\n});\n","import './hoverNavigation';\nimport '../../../utils/customEvent';\n\nimport './style.scss';\n\nfunction ToggleNav() {\n const header = document.querySelector('header');\n const button = header.querySelector('.header__burger');\n const nav = header.querySelector('.header__menu');\n const userProfileBtn = document.querySelector('.menu-list__btn--user');\n\n if (!header || !button || !nav) return;\n\n this.state = {\n isOpen: false,\n };\n this.sel = nav;\n const showEvent = new CustomEvent('show');\n\n this.show = () => {\n if (this.state.isOpen) return;\n\n this.state.isOpen = true;\n header.classList.add('header--open');\n this.sel.dispatchEvent(showEvent);\n\n setTimeout(() => {\n userProfileBtn.classList.add('menu-list__btn--visible');\n nav.classList.add('header__menu--visible');\n }, 1000);\n };\n\n this.hide = () => {\n if (!this.state.isOpen) return;\n\n this.state.isOpen = false;\n userProfileBtn.classList.remove('menu-list__btn--visible');\n nav.classList.remove('header__menu--visible');\n header.classList.remove('header--open');\n\n nav.style.height = '';\n };\n\n button.addEventListener(\n 'click',\n () => {\n if (this.state.isOpen) {\n this.hide();\n } else {\n this.show();\n }\n },\n false,\n );\n\n window.addEventListener('orientationchange', this.hide);\n}\n\nwindow.addEventListener('DOMContentLoaded', () => {\n const toggleNav = new ToggleNav();\n\n toggleNav.sel.addEventListener('show', () => {});\n});\n","import { observeElement } from '@uvocore-front/utils';\n/* eslint-disable no-new */\nimport Carousel from '../CustomCarousel';\nimport './style.scss';\n\nconst imagesColumnsSelector = '.imageList-withSlider__content';\nconst imagesColumnsItems = document.querySelectorAll(imagesColumnsSelector);\n\nif (imagesColumnsItems) {\n const initCarousel = (selector) => {\n new Carousel({\n selector,\n itemWidth: 200,\n margin: 40,\n isSetNavButtonsPosition: false,\n responsive: {\n 1024: {\n inactive: true,\n },\n },\n });\n };\n\n observeElement({\n element: imagesColumnsSelector,\n callback: () => {\n [].slice.call(imagesColumnsItems).forEach((item) => initCarousel(item));\n },\n });\n}\n","/* eslint-disable consistent-return, no-param-reassign */\nimport Slider from '../Slider';\nimport { slideUp, slideDown } from '../../utils/index';\nimport './style.scss';\n\nclass PerfomanceSlider extends Slider {\n calculateStageWidth() {\n return (3 * this.itemWidth + this.margin * 2) - 40;\n }\n\n run() {\n this.getResponsiveProps();\n\n if (this.state.inactive) return false;\n\n if (!this.state.initialized) {\n this.preInit();\n this.generateNav();\n this.attachSwipeHandlers();\n this.generateDots();\n this.state.current = 0;\n }\n\n this.setStageWidth();\n\n if (!this.state.initialized) {\n this.changeSlide(this.state.current);\n }\n\n this.setStageHeight();\n\n if (!this.state.initialized) {\n this.init();\n }\n }\n\n setNavButtonsPosition() {\n if (this.getWindowWidth() < 1024 && this.isSetNavButtonsPosition) {\n this.prevBtn.style.left = `${(this.selector.offsetWidth / 2) - this.prevBtn.offsetWidth - this.itemWidth / 2 + this.prevBtn.offsetWidth / 2}px`;\n\n this.nextBtn.style.right = `${(this.selector.offsetWidth / 2) - this.nextBtn.offsetWidth - this.itemWidth / 2 + this.nextBtn.offsetWidth / 2}px`;\n } else {\n this.prevBtn.style.left = '';\n this.nextBtn.style.right = '';\n }\n }\n\n onRefresh() {\n this.setStageHeight();\n }\n\n setStageHeight() {\n let maxHeight = 0;\n\n Array.prototype.slice.call(this.slideItems).forEach((item) => {\n let height;\n const hiddenBlock = item.querySelector('[data-toggled-block]');\n\n if (hiddenBlock && !hiddenBlock.offsetHeight) {\n height = item.offsetHeight + hiddenBlock.children[0].offsetHeight;\n } else {\n height = item.offsetHeight;\n }\n\n if (height > maxHeight) maxHeight = height;\n });\n\n this.stage.style.height = `${maxHeight}px`;\n }\n\n findSlide(index) {\n if (index > this.slideItems.length) {\n index -= this.slideItems.length;\n }\n\n if (index === this.slideItems.length) return this.slideItems[index - this.slideItems.length];\n\n if (!this.slideItems[index]) {\n return this.slideItems[this.slideItems.length + index];\n }\n return this.slideItems[index];\n }\n\n move(index) {\n const pageHiddenBlock = this.selector.querySelector('[data-toggled-block]');\n\n if (index - this.state.current > 0) {\n this.stage.setAttribute('data-direction', 'forward');\n } else {\n this.stage.setAttribute('data-direction', 'backward');\n }\n\n if (this.selector.querySelector('.slider__item--current') && pageHiddenBlock) {\n slideUp(this.selector.querySelector('.slider__item--current [data-toggled-block]'));\n }\n\n this.slideItems[this.state.current].classList.remove('slider__item--current');\n this.slideItems[this.state.current].style.display = '';\n\n this.findSlide(this.state.current - 2).classList.remove('slider__item--before-prev');\n this.findSlide(this.state.current - 2).style.display = '';\n\n this.findSlide(this.state.current - 1).classList.remove('slider__item--prev');\n this.findSlide(this.state.current - 1).style.display = '';\n\n this.findSlide(this.state.current + 1).classList.remove('slider__item--next');\n this.findSlide(this.state.current + 1).style.display = '';\n\n this.findSlide(this.state.current + 2).classList.remove('slider__item--after-next');\n this.findSlide(this.state.current + 2).style.display = '';\n\n this.state.current = Array.prototype.slice.call(this.slideItems).indexOf(this.findSlide(index));\n\n this.slideItems[this.state.current].style.display = 'block';\n this.slideItems[this.state.current].classList.add('slider__item--current');\n\n pageHiddenBlock ? slideDown(this.selector.querySelector('.slider__item--current [data-toggled-block]')) : null; /* eslint-disable-line */\n\n const prevPrevSlide = this.findSlide(this.state.current - 2);\n const prevSlide = this.findSlide(this.state.current - 1);\n const nextSlide = this.findSlide(this.state.current + 1);\n const nextNextSlide = this.findSlide(this.state.current + 2);\n\n prevPrevSlide.style.display = 'block';\n prevPrevSlide.classList.add('slider__item--before-prev');\n\n prevSlide.style.display = 'block';\n prevSlide.classList.add('slider__item--prev');\n\n pageHiddenBlock ? slideUp(this.selector.querySelector('.slider__item--prev [data-toggled-block]')) : null; /* eslint-disable-line */\n\n nextSlide.style.display = 'block';\n nextSlide.classList.add('slider__item--next');\n\n nextNextSlide.style.display = 'block';\n nextNextSlide.classList.add('slider__item--after-next');\n }\n}\n\nexport default PerfomanceSlider;\n","import { addActiveLinkClass } from '../../utils';\n\nwindow.addEventListener('DOMContentLoaded', () => {\n addActiveLinkClass({\n anchorSelector: '.footer__menu__link',\n });\n});\n","import { observeElement, getWidget } from '@uvocore-front/utils';\n/**\n * Calculator\n */\nconst isPageConfig = window.pageConfig\n && Object.keys(window.pageConfig).length > 0\n && window.pageConfig.constructor === Object;\n\n// Calculator Observer\nif (document.querySelector('[data-calc-short]')) {\n observeElement({\n element: '[data-calc-short]',\n marginValue: 400,\n callback: () => {\n getWidget({\n widgetLink: '/assets/js/calc.js',\n loader: false,\n insertLoaderTo: '[data-calc-short]',\n loaderPosition: 'center',\n fn: () => {\n const pagePaperType = isPageConfig && (window.pageConfig.calculator !== undefined && window.pageConfig.calculator.hasOwnProperty('pagePaperType')) /* eslint-disable-line */\n ? window.pageConfig.calculator.pagePaperType\n : undefined;\n\n const calcOptions = {\n ID: '198',\n calculatorType: 'DefaultCalculator',\n format: 'json',\n parent: '[data-calc-short]',\n options: {\n deafault: {\n academicLevelDefault: 2,\n },\n },\n };\n\n if (pagePaperType !== undefined) {\n calcOptions.options.deafault.paperTypesDefault = pagePaperType;\n }\n\n if (window.Calc) {\n const calc = new Calc(calcOptions);/* eslint-disable-line */\n }\n },\n });\n },\n });\n}\n","/* eslint-disable */\nimport * as Hammer from 'hammerjs';\nimport { debounce, wrapInner, wrap, isSafari, isMobile } from '../../utils';\n\nimport './style.scss';\n\nclass Slider {\n constructor({\n selector,\n itemWidth,\n margin = 0,\n inactive = false,\n responsive,\n activeSlide = 0,\n isSetNavButtonsPosition = true,\n isSetStageWidth = true,\n isHideNav = false\n }) {\n this.selector = selector;\n this.options = arguments[0];\n this.itemWidth = itemWidth;\n this.margin = margin;\n this.responsive = responsive;\n this.activeSlide = activeSlide;\n this.isSetNavButtonsPosition = isSetNavButtonsPosition;\n this.isSetStageWidth = isSetStageWidth;\n this.isHideNav = isHideNav;\n\n this.wrapper = null;\n this.viewport = null;\n this.stage = null;\n this.slideItems = null;\n this.nav = null;\n this.prevBtn = null;\n this.nextBtn = null;\n\n this.state = {\n initialized: false,\n current: null,\n inactive,\n };\n\n this.run();\n\n window.addEventListener('resize', debounce(this.refresh.bind(this), 250));\n }\n\n setDefaultState() {\n this.itemWidth = this.options.itemWidth;\n this.margin = this.options.margin;\n this.state.inactive = this.options.inactive;\n }\n\n preInit() {\n const wrapper = document.createElement('div');\n wrapper.classList.add('slider__wrapper');\n\n isSafari ? wrapper.classList.add('slider__wrapper--safari') : null;\n\n const viewport = document.createElement('div');\n viewport.classList.add('slider__viewport');\n\n const stageWrapper = document.createElement('div');\n stageWrapper.classList.add('slider__stage-wrapper');\n\n const stage = document.createElement('div');\n stage.classList.add('slider__stage');\n\n this.wrapper = wrapper;\n this.viewport = viewport;\n this.stage = stage;\n\n this.selector.classList.add('slider--preinited');\n\n wrapInner(this.selector, this.stage);\n wrap(this.stage, stageWrapper);\n wrap(stageWrapper, this.viewport);\n wrap(this.viewport, this.wrapper);\n\n this.slideItems = this.stage.children;\n\n Array.prototype.slice.call(this.slideItems).forEach(item => {\n const slideItemWrapper = document.createElement('div');\n\n slideItemWrapper.classList.add('slider__item');\n wrap(item, slideItemWrapper);\n });\n }\n\n init() {\n this.selector.classList.add('slider--inited');\n this.state.initialized = true;\n }\n\n calcPaddingToCenter() {\n return (this.selector.offsetWidth - this.itemWidth) / 2;\n }\n\n changeSlide(index) {\n const direction = index > 0 ? -1 : 1;\n\n const dots = this.selector.querySelectorAll('.slider__dots-item');\n\n dots[this.state.current].classList.remove('slider__dots-item--active');\n\n this.move(index, direction);\n\n dots[this.state.current].classList.add('slider__dots-item--active');\n this.slideItems[this.state.current].classList.add('slider__item--active');\n }\n\n next() {\n this.changeSlide(this.state.current + 1);\n this.hideNav();\n }\n\n prev() {\n this.changeSlide(this.state.current - 1);\n this.hideNav();\n }\n\n hideNav() {\n if (isMobile && this.isHideNav) {\n const nav = document.querySelector('.slider__nav');\n nav.classList.add('slider__nav--hidden');\n\n setTimeout(()=> {\n nav.classList.remove('slider__nav--hidden');\n }, 600);\n }\n }\n\n generateNav() {\n const template = `\n `;\n\n const nav = document.createElement('div');\n\n nav.classList.add('slider__nav');\n nav.innerHTML = template;\n\n this.wrapper.appendChild(nav);\n this.nav = nav;\n\n this.prevBtn = nav.querySelector('.slider__button--prev');\n this.nextBtn = nav.querySelector('.slider__button--next');\n\n this.prevBtn.addEventListener('click', () => {\n this.prev();\n });\n\n this.nextBtn.addEventListener('click', () => {\n this.next();\n });\n\n this.setNavButtonsPosition();\n }\n\n generateDots() {\n const template = `
\n ${''.repeat(\n this.slideItems.length\n )}\n
`;\n\n const dots = document.createElement('div');\n\n dots.classList.add('slider__dots');\n dots.innerHTML = template;\n\n this.wrapper.appendChild(dots);\n\n const dotItems = dots.querySelectorAll('.slider__dots-item');\n\n dots.addEventListener('click', e => {\n if (e.target.classList.contains('slider__dots-item')) {\n const index = Array.prototype.indexOf.call(dotItems, e.target);\n if (index !== this.state.current) this.changeSlide(index);\n }\n });\n }\n\n attachSwipeHandlers() {\n const hammer = new Hammer(this.stage, {});\n\n const swipeFunc = e => {\n if (e.deltaX < 0) {\n this.next();\n } else {\n this.prev();\n }\n };\n\n hammer.on('swipe', e => debounce(swipeFunc(e), 150));\n }\n\n setNavButtonsPosition() {\n if (this.isSetNavButtonsPosition) {\n this.prevBtn.style.left = `${this.selector.offsetWidth / 2 -\n this.prevBtn.offsetWidth -\n this.itemWidth / 2 -\n this.margin / 8}px`;\n this.nextBtn.style.right = `${this.selector.offsetWidth / 2 -\n this.nextBtn.offsetWidth -\n this.itemWidth / 2 -\n this.margin / 8}px`;\n }\n }\n\n run() {\n if (this.selector.classList.contains('slider--preinited')) return false;\n\n this.getResponsiveProps();\n\n if (this.state.inactive) return false;\n\n if (!this.state.initialized) {\n this.preInit();\n this.generateNav();\n this.attachSwipeHandlers();\n this.generateDots();\n this.state.current = this.activeSlide;\n }\n\n this.setItemsWidth();\n this.setStageWidth();\n\n this.changeSlide(this.state.current);\n\n if (!this.state.initialized) {\n this.init();\n }\n }\n\n refresh() {\n this.getResponsiveProps();\n\n if (this.state.inactive) {\n this.deactivate();\n\n return false;\n }\n\n this.run();\n this.setNavButtonsPosition();\n this.onRefresh();\n }\n\n onRefresh() {\n /* eslint-disable-line */\n // your code\n }\n\n deactivate() {\n if (this.state.initialized) {\n this.destroy();\n this.state.initialized = false;\n }\n }\n\n destroy() {\n Array.prototype.slice.call(this.slideItems).forEach(item => {\n this.selector.appendChild(item.children[0]);\n });\n\n this.wrapper.remove();\n }\n\n setItemsWidth() {\n Array.prototype.slice.call(this.slideItems).forEach(item => {\n item.style.width = `${this.itemWidth}px`;\n item.style.marginRight = this.margin ? `${this.margin}px` : '';\n });\n }\n\n calculateStageWidth() {\n return this.slideItems.length * (this.itemWidth + this.margin);\n }\n\n setStageWidth() {\n if (this.isSetStageWidth) {\n this.stage.style.width = `${this.calculateStageWidth()}px`;\n }\n }\n\n getWindowWidth() {\n /* eslint-disable-line */\n return window.innerWidth; /* eslint-disable-line */\n }\n\n getResponsiveProps() {\n const breakPoints = [];\n\n for (const breakPoint in this.responsive) {\n if (this.getWindowWidth() >= parseInt(breakPoint, 10)) {\n breakPoints.push(this.responsive[breakPoint]);\n }\n }\n\n this.setDefaultState();\n\n if (breakPoints.length > 0) {\n breakPoints.forEach(item => {\n for (const prop in item) {\n if (this.hasOwnProperty(prop)) this[prop] = item[prop];\n if (this.state.hasOwnProperty(prop)) this.state[prop] = item[prop];\n }\n });\n } else {\n this.setDefaultState();\n }\n }\n}\n\nexport default Slider;\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","import { observeElement, getWidget } from '@uvocore-front/utils';\nimport './Calculator.scss';\n\n/**\n * Calculator\n */\nconst isPageConfig = window.pageConfig\n && Object.keys(window.pageConfig).length > 0\n && window.pageConfig.constructor === Object;\n\n// Calculator Observer\nif (document.querySelector('[data-calc-mini]')) {\n observeElement({\n element: '[data-calc-mini]',\n marginValue: 400,\n callback: () => {\n getWidget({\n widgetLink: '/assets/js/calc.js',\n loader: true,\n insertLoaderTo: '[data-calc-mini]',\n loaderPosition: 'center',\n fn: () => {\n const pagePaperType = isPageConfig && (window.pageConfig.calculator !== undefined && window.pageConfig.calculator.hasOwnProperty('pagePaperType')) /* eslint-disable-line */\n ? window.pageConfig.calculator.pagePaperType\n : undefined;\n\n const calcOptions = {\n ID: '198',\n calculatorType: 'DefaultCalculator',\n format: 'html',\n options: {\n deafault: {\n deadlinesDefault: [127538, 127666, 127770, 127874],\n },\n },\n };\n\n if (pagePaperType !== undefined) {\n calcOptions.options.deafault.paperTypesDefault = pagePaperType;\n }\n\n if (window.Calc) {\n const calc = new Calc(calcOptions);/* eslint-disable-line */\n }\n },\n });\n },\n });\n}\n","/* eslint-disable consistent-return */\nimport Slider from '../Slider';\n\nclass Carousel extends Slider {\n constructor(options) { /* eslint-disable-line */\n super(options);\n }\n\n move(index, direction) {\n if (index < 0 || index === this.slideItems.length) return false;\n\n const delta = (this.slideItems[0].offsetWidth + this.margin)\n * index * direction + this.calcPaddingToCenter();\n this.slideItems[this.state.current].classList.remove('slider__item--active');\n\n this.stage.style.transform = `translate3d(${delta}px, 0px, 0px)`;\n this.stage.style.webkitTransform = `translate3d(${delta}px, 0px, 0px)`;\n\n this.state.current = index;\n\n if (this.state.current === this.slideItems.length - 1) {\n this.nextBtn.setAttribute('disabled', true);\n } else if (this.nextBtn.hasAttribute('disabled')) this.nextBtn.removeAttribute('disabled', true);\n\n if (this.state.current === 0) {\n this.prevBtn.setAttribute('disabled', true);\n } else if (this.prevBtn.hasAttribute('disabled')) this.prevBtn.removeAttribute('disabled', true);\n }\n}\n\nexport default Carousel;\n","import { observeElement } from '@uvocore-front/utils';\nimport PerfomanceSlider from '../../components/PerfomanceSlider';\nimport './style.scss';\n\nconst initSamplesSlider = () => {\n new PerfomanceSlider({ // eslint-disable-line\n selector: document.querySelector('.samples'),\n margin: 0,\n itemWidth: 333,\n });\n};\n\nif (document.querySelector('.samples')) {\n observeElement({\n element: '.samples',\n marginValue: 200,\n callback: () => {\n if (document.readyState === 'complete') {\n initSamplesSlider();\n } else {\n window.addEventListener('load', initSamplesSlider);\n }\n },\n });\n}\n","import { observeElement } from '@uvocore-front/utils';\nimport PerfomanceSlider from '../../components/PerfomanceSlider';\nimport './style.scss';\n\nconst testimonialsSlider = () => {\n if (document.querySelector('.testimonials-section')) {\n observeElement({\n element: '.testimonials-section',\n marginValue: 200,\n callback: () => {\n new PerfomanceSlider({ // eslint-disable-line\n selector: document.querySelector('.testimonials'),\n margin: 0,\n itemWidth: 330,\n isSetNavButtonsPosition: false,\n isHideNav: true,\n });\n },\n });\n }\n};\n\nif (document.querySelector('.testimonials')) {\n observeElement({\n element: '.testimonials',\n marginValue: 200,\n callback: () => {\n if (document.readyState === 'complete') {\n testimonialsSlider();\n } else {\n window.addEventListener('load', testimonialsSlider);\n }\n },\n });\n}\n"],"sourceRoot":""}